相変わらず、http://www.alab.t.u-tokyo.ac.jp/~bond/doc/rs232c.html
に記載されているRC232C制御のプログラムをいじくっております。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200807/08070008.txt で教えて頂いた続きになるのですが、
以下のソースでRS232Cから「AIUEOaiueo」を出力することはできました(受信側のPCに「AIUEOaiueo」が表示された)。
void CSerialComTestDlg::OnSend()
{
char buf[MAX_COM_SIZE];
strcpy(buf, "AIUEOaiueo");
int len;
len=strlen(buf);
buf[len++]=0x0d; //CR
buf[len++]=0x0a; //LF
buf[len]='\0'; //NULL
com1.Send(buf, len);
}
しかし、最終的には「AIUEOaiueo[CR]」という出力を目的としていましたので、さらに以下のように書き換えましたが、
void CSerialComTestDlg::OnSend()
{
char buf[MAX_COM_SIZE];
strcpy(buf, "AIUEOaiueo");
int len;
len=strlen(buf);
buf[len++]=0x0d; //CR
com1.Send(buf, len);
}
exeファイルのOnSendのボタンを押すとDebug Assertion Failed!というメッセージが出てきてしまいます。
一方、
void CSerialComTestDlg::OnSend()
{
char buf[MAX_COM_SIZE];
strcpy(buf, "AIUEOaiueo");
int len;
len=strlen(buf);
buf[len++]=0x0d; //CR
buf[len]='\0'; //NULL
com1.Send(buf, len);
}
とすると、受信側のPCには「AIUEOaiueo」が表示されました。しかし、RS232Cを制御対象の実機に繋げると、実機が「AIUEOaiueo[CR]」が指し示す動作をしません。つまり、「AIUEOaiueo[CR]」の[CR]部分がうまく出力されてないのではないかと思います。。。上記のソースをどのように書き換えれば、「AIUEOaiueo[CR]」という出力が可能になりますでしょうか?また、strcpy(buf, "AIUEOaiueo");において、ヌル文字はbuf[10]に付け加えられているのでしょうか?さらに、私が示した一番上のソースの送信データは「AIUEOaiueo[CR][LF][NULL]」になっているのでしょうか?
長々と書いてしまいましたが、宜しくお願い致します。
// バッファ内のデータ確認
INT CheckLen = strlen(buf) + 1;
INT cnt;
for(cnt = 0; cnt < CheckLen; cnt++) {
TRACE("[%d]:%c\n", cnt, buf[cnt]);
}
com1.Send(buf, len); の直前にでも入れて、自身で確認してみて下さい。
ん?さん,返信ありがとうございます.
今回はじめてTRACEとDEBUGの関係というか機能を知りました...
教えていただいたとおり試してみましたところ,(二度同じボタンを押しました.「AIUEOaiueo」の変わりに「SPD 100」としました.)
(以上省略)WriteTotalCons=100CRs232cCtl::ReceiveThread start[0]:S
[1]:P
[2]:D
[3]:
[4]:1
[5]:0
[6]:0
[7]:
[8]:CRs232cCTl::OnSend (SPD 100)[0]:S
[1]:P
[2]:D
[3]:
[4]:1
[5]:0
[6]:0
[7]:
[8]:CRs232cCTl::OnSend (SPD 100)The program has exited with code 0 (0x0).
とデバッグに表示されました.
これをみると,[0]〜[6]までは送りたい文字がきちんと入っているようですが,[7]にはキャリッジリターンが入っている場合は,どのように表示されるのでしょうか?また,[8]CRs232cCTl::OnSend (SPD 100)は,なぜ出てきたのでしょうか?
宜しくお願いします.
>[7]にはキャリッジリターンが入っている場合は,どのように表示されるのでしょうか?
人が見てもわからないような制御コードが表示されます。
ので、次の様に変更してみて下さい。
TRACE("[%d]:%c\n", cnt, buf[cnt]);
↓
TRACE("[%d]:0x%02x\n", cnt, (UCHAR)buf[cnt]);
# こんな事せずとも com1.Send(buf, len); で ブレイクポイントを設定して
# 実行すると、自動変数やローカルのウインドウにbufの内容が表示されて
# いる筈なんだが…。
ん?さん,ありがとうございます.
教えていただいたように変更したら以下のようになりました.
[0]:0x53
[1]:0x50
[2]:0x44
[3]:0x20
[4]:0x31
[5]:0x30
[6]:0x30
[7]:0x0d
[8]:0x00
CRs232cCTl::OnSend (SPD 100)[0]:0x53
[7]にはキャリッジリターンが入っていたようです!ただ,[8]が余計なので消したいのですが,以下のようなソースにすると,
void CSerialComTestDlg::OnSend()
{
char buf[MAX_COM_SIZE];
strcpy(buf, "AIUEOaiueo");
int len;
len=strlen(buf);
buf[len++]=0x0d; //CR
com1.Send(buf, len);
}
exeファイルのOnSendのボタンを押すと,dumpout.cppというファイルでDebug Assertion Failed!というメッセージが出てきてしまいます。これを解決するにはどうしたらよいでしょうか?
以下のdumpout.cppをみてみましたが,エラーの原因が分かりませんでした...
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#include <stdarg.h>
#ifdef _DEBUG // entire file
#ifdef AFX_AUX_SEG
#pragma code_seg(AFX_AUX_SEG)
#endif
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// Helper routines that can be called from debugger
void AFXAPI AfxDump(const CObject* pOb)
{
afxDump << pOb;
}
/////////////////////////////////////////////////////////////////////////////
// Diagnostic Trace
void AFX_CDECL AfxTrace(LPCTSTR lpszFormat, ...)
{
#ifdef _DEBUG // all AfxTrace output is controlled by afxTraceEnabled
if (!afxTraceEnabled)
return;
#endif
va_list args;
va_start(args, lpszFormat);
int nBuf;
TCHAR szBuffer[512];
nBuf = _vsntprintf(szBuffer, _countof(szBuffer), lpszFormat, args);
// was there an error? was the expanded string too long?
ASSERT(nBuf >= 0); //ここでDebug Assertion Failed!です
if ((afxTraceFlags & traceMultiApp) && (AfxGetApp() != NULL))
afxDump << AfxGetApp()->m_pszExeName << ": ";
afxDump << szBuffer;
va_end(args);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
データ送信できました.
以下のソースのままで,うまくいきました.今回は実機の方に問題がありました...
void CSerialComTestDlg::OnSend()
{
char buf[MAX_COM_SIZE];
strcpy(buf, "AIUEOaiueo");
int len;
len=strlen(buf);
buf[len++]=0x0d; //CR
buf[len]='\0'; //NULL
com1.Send(buf, len);
}
おかげさまで,キャリッジリターンとかヌル文字とかのよい勉強になりました.ヌル文字は最後に付けないと,変数のデータがどこで終わるか分からないのですね...
ありがとうございました.
>ヌル文字は最後に付けないと,変数のデータがどこで終わるか分からないのですね...
それが文字列ですので、十分理解が必要になります。
(参考までに…) http://www2.netf.org/pointer3.html
ん?さん,分かりやすいページですね.
ありがとうございますm(--)m
ツイート | ![]() |