プロが教える店舗&オフィスのセキュリティ対策術

質問
VC++をはじめて2ヶ月程度のものです。
現在、計測装置からのデータをシリアル通信でパソコンに取り込もうとしています。
ホームページなどを参考にコードを書きましたが、
以下のようではだめでしょうか?

環境はWinXP、VC++6.0でダイアログベース。
実行結果はボタンを押すとエディットボックスに以下のように表示がでてきます。
フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ・

よろしくお願いいたします。


ボタンに割り当てたコード
void CTest_commDlg::OnButton1()
{
    HANDLE hComm; //通信ハンドル
DCB myDCB;

//----------ポートオープン
hComm = CreateFile("COM2", GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL );

//----------DCB構造体を使って通信設定をする
BuildCommDCB("9600,n,8,1",&myDCB);

//----------DCB構造体セット
SetCommState(hComm, &myDCB);

//----------タイムアウト設定
COMMTIMEOUTS CommTimeout;
GetCommTimeouts(hComm,&CommTimeout);
CommTimeout.ReadIntervalTimeout = 500;
CommTimeout.ReadTotalTimeoutMultiplier = 0;
CommTimeout.ReadTotalTimeoutConstant = 500;
CommTimeout.WriteTotalTimeoutMultiplier = 0;
CommTimeout.WriteTotalTimeoutConstant = 500;
SetCommTimeouts(hComm,&CommTimeout);

//----------受信
char RecBuff[64];
DWORD ReadLen;
ReadFile(hComm,RecBuff,64,&ReadLen,NULL);

//----------エディットボックスに表示
m_ed1.SetWindowText(RecBuff);
}

A 回答 (3件)

#1です。



> 実はDWORDという型の意味も良くわかっていません。

参考URLをご覧下さい。

参考URL:http://e-words.jp/w/E383AFE383BCE38389.html

この回答への補足

タイムアウト設定を下記のように変更したら数値を読み込めました。ありがとうございます。

//----------タイムアウト設定
COMMTIMEOUTS CommTimeout;
GetCommTimeouts(hComm,&CommTimeout);
CommTimeout.ReadIntervalTimeout = 3000;
CommTimeout.ReadTotalTimeoutMultiplier = 3000;
CommTimeout.ReadTotalTimeoutConstant = 3000;
CommTimeout.WriteTotalTimeoutMultiplier = 3000;
CommTimeout.WriteTotalTimeoutConstant = 3000;
SetCommTimeouts(hComm,&CommTimeout);

補足日時:2004/12/09 14:43
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2004/12/09 13:43

表示された文字列を見る限り、RecBuffの中身は宣言時のままのように見えます。


ReadFile()の戻り値やReadLenの値はどうなってますか?

念のために参考:ReadFile()のリファレンス
http://www.microsoft.com/japan/msdn/library/ja/j …

この回答への補足

どうも受信の実行結果は安定しません。
実行結果が下記のようになることもあります。

K-XFFFvフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ・

これをデバッグで見てみると
ReadFileの戻り値:1
ReadLenの値は7です。

RecBuff[0] → 75 'k'
RecBuff[1] → 45 '-'
RecBuff[2] → 88 'J'
RecBuff[3] → 70 'F'
RecBuff[4] → 70 'F'
RecBuff[5] → 70 'F'
RecBuff[4] → 118 'v'
RecBuff[5] → -52 'フ' 以下、同じ

補足日時:2004/12/09 13:53
    • good
    • 0
この回答へのお礼

返答ありがとうございます。
ReadFile()の戻り値は1で、ReadLenの値は0となっています。何も読み取れていないということでしょうか?
実はDWORDという型の意味も良くわかっていません。
よろしくお願いします。

お礼日時:2004/12/09 11:57

VC++は使ったことがなく的確な事は言えませんので


私の経験を書きます。

私も某電気メーカーの製造工場に勤めていて、業務上必要に迫られてSerial通信のアプリを作った事があります。
但し、私の場合は、BorlandC++Builder 5.0でWindows系のクライアントで動作するアプリでしたが。APIでSerial通信を記述する程のスキルも無かったのでVectorにてBCB用のDLLを拾ってきて作成しました。VC++用のコンポーネントも有ったと思いますので参考URL見て下さい。

あと、出来れば計測器とPCの間に咬ませてTX・RXのデータを確認出来る通信モニタも探すとFreeでも有ると思うのでデバッグに有効だと思います。

私の場合、シェアウェア(\9000位だったかな)の 『Serial device monitor』を購入して使ってます。
(専用ケーブルが必要ないので便利です)

あまり参考にならなかったらごめんなさい。

参考URL:http://search.vector.co.jp/search?query=232&path …
    • good
    • 0
この回答へのお礼

返答、ありがとうございます。
こういうものもあるのだなと参考になります。
ただ、今回はC++のスキルアップもかねてなんとか自力でとは思っています。(あまりに時間がかかりそうだったら何かダウンロードなりしてみます。そのときはまたお願いします。)

お礼日時:2004/12/09 11:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!