- 締切済み
VC++でのシリアル通信が上手くいきません。
ArduinoからPCへ送られてくる信号を表示するコンソールアプリケーションを VC++で試作しているのですが、ReadFile()関数でデータを読み取ろうとするとうまくいきません。 どうすればうまくいくでしょうか? どなたかお詳しい方がおられましたら回答をよろしくお願いします。 コードは以下の通りです。 #include <Windows.h> #include <stdlib.h> #include <stdio.h> HANDLE arduino; bool Ret; void main(void){ BYTE data = 1; //1.ポートをオープン arduino = CreateFile("COM3",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(arduino == INVALID_HANDLE_VALUE){ printf("PORT COULD NOT OPEN\n"); system("PAUSE"); exit(0); } //2.送受信バッファ初期化 Ret = SetupComm(arduino,1024,1024); if(!Ret){ printf("SET UP FAILED\n"); CloseHandle(arduino); system("PAUSE"); exit(0); } Ret = PurgeComm(arduino,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); if(!Ret){ printf("CLEAR FAILED\n"); CloseHandle(arduino); exit(0); } //3.基本通信条件の設定 DCB dcb; GetCommState(arduino,&dcb); dcb.DCBlength = sizeof(DCB); dcb.BaudRate = 9600; dcb.fBinary = TRUE; dcb.ByteSize = 8; dcb.fParity =NOPARITY; dcb.StopBits = ONESTOPBIT; Ret = SetCommState(arduino,&dcb); if(!Ret){ printf("SetCommState FAILED\n"); CloseHandle(arduino); system("PAUSE"); exit(0); } //4.受信 DWORD dwSendSize; DWORD dwErrorMask; int i=0; while(i<30) { Ret = ReadFile(arduino,&data,1,&dwSendSize,NULL); if(!Ret){ printf("RECEIVE FAILED\n"); CloseHandle(arduino); system("PAUSE"); exit(0); } printf("data=%c\n",data); i++; Sleep(100); } printf("FINISH\n"); CloseHandle(arduino); system("PAUSE"); }
- みんなの回答 (5)
- 専門家の回答
みんなの回答
とりあえず、エラーが発生した直後で GetLastError 関数を実行してエラーの詳細を入手したほうが良いです。エラーの詳細もなしにあれこれ論議しても詮無いです。 C# はライブラリが優秀なので自動的に色々とエラー処理してくれますが、C++ は全然全く何もしてくれません。「バッファが小さすぎてエラー」だの「未処理バッファが溜まりすぎてエラー」だの平気で起こしてくれますので、エラー詳細がわからないと本当にチンプンカンプンですよ。
- koi1234
- ベストアンサー率53% (1866/3459)
実際動かしてるソースと比較してみました 最初のオープン関数の引数が間違ってます (GENERIC_READが無いからエラーなんじゃないかな) CreateFile("\\\\.\\COM3", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); それ以外のとこは見ていない
- koi1234
- ベストアンサー率53% (1866/3459)
なんかぼけまくってて連投になってしまいますが 常識レベルという事でいえば 書かれている手順は 1.3.2.4 の順番で実行すべきです そのうえで受信がどのようになるのかの補足を 全く受信しないのかバイト数が異なるのか フリーの通信ソフトなどを使って問題が出ていないのか 等
- koi1234
- ベストアンサー率53% (1866/3459)
No1 間違い >常識レベルの話として 2の設定は1のオープン前に済ませてますよね? オープン前にできるわけなかった
- koi1234
- ベストアンサー率53% (1866/3459)
内容まともに見てませんが どのようにうまくいかないのか 1~4をどの順番で実行しているのか 常識レベルの話として 2の設定は1のオープン前に済ませてますよね?
補足
回答ありがとうございます。 一応、1,3,2,4の順で実行してみました 結果 ・ReadFile()関数のRetがfalseになり、RECECIVE FAILED(エラー)と表示されます。 ・ArduinoIDEに付属してあるシリアルモニターと C#で自作したシリアル通信アプリケーションの二つで再度確認してみましたが、 正常に値を取得し、表示することができていました。