- 締切済み
VC++でシリアル通信
質問 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); }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- UMTS
- ベストアンサー率25% (3/12)
#1です。 > 実はDWORDという型の意味も良くわかっていません。 参考URLをご覧下さい。
- hitomura
- ベストアンサー率48% (325/664)
表示された文字列を見る限り、RecBuffの中身は宣言時のままのように見えます。 ReadFile()の戻り値やReadLenの値はどうなってますか? 念のために参考:ReadFile()のリファレンス http://www.microsoft.com/japan/msdn/library/ja/jpfileio/html/_win32_readfile.asp
お礼
返答ありがとうございます。 ReadFile()の戻り値は1で、ReadLenの値は0となっています。何も読み取れていないということでしょうか? 実はDWORDという型の意味も良くわかっていません。 よろしくお願いします。
補足
どうも受信の実行結果は安定しません。 実行結果が下記のようになることもあります。 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 'フ' 以下、同じ
- UMTS
- ベストアンサー率25% (3/12)
VC++は使ったことがなく的確な事は言えませんので 私の経験を書きます。 私も某電気メーカーの製造工場に勤めていて、業務上必要に迫られてSerial通信のアプリを作った事があります。 但し、私の場合は、BorlandC++Builder 5.0でWindows系のクライアントで動作するアプリでしたが。APIでSerial通信を記述する程のスキルも無かったのでVectorにてBCB用のDLLを拾ってきて作成しました。VC++用のコンポーネントも有ったと思いますので参考URL見て下さい。 あと、出来れば計測器とPCの間に咬ませてTX・RXのデータを確認出来る通信モニタも探すとFreeでも有ると思うのでデバッグに有効だと思います。 私の場合、シェアウェア(\9000位だったかな)の 『Serial device monitor』を購入して使ってます。 (専用ケーブルが必要ないので便利です) あまり参考にならなかったらごめんなさい。
お礼
返答、ありがとうございます。 こういうものもあるのだなと参考になります。 ただ、今回はC++のスキルアップもかねてなんとか自力でとは思っています。(あまりに時間がかかりそうだったら何かダウンロードなりしてみます。そのときはまたお願いします。)
お礼
ありがとうございます。
補足
タイムアウト設定を下記のように変更したら数値を読み込めました。ありがとうございます。 //----------タイムアウト設定 COMMTIMEOUTS CommTimeout; GetCommTimeouts(hComm,&CommTimeout); CommTimeout.ReadIntervalTimeout = 3000; CommTimeout.ReadTotalTimeoutMultiplier = 3000; CommTimeout.ReadTotalTimeoutConstant = 3000; CommTimeout.WriteTotalTimeoutMultiplier = 3000; CommTimeout.WriteTotalTimeoutConstant = 3000; SetCommTimeouts(hComm,&CommTimeout);