• 締切済み

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"); }

みんなの回答

noname#212058
noname#212058
回答No.5

とりあえず、エラーが発生した直後で GetLastError 関数を実行してエラーの詳細を入手したほうが良いです。エラーの詳細もなしにあれこれ論議しても詮無いです。 C# はライブラリが優秀なので自動的に色々とエラー処理してくれますが、C++ は全然全く何もしてくれません。「バッファが小さすぎてエラー」だの「未処理バッファが溜まりすぎてエラー」だの平気で起こしてくれますので、エラー詳細がわからないと本当にチンプンカンプンですよ。

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.4

実際動かしてるソースと比較してみました  最初のオープン関数の引数が間違ってます    (GENERIC_READが無いからエラーなんじゃないかな) CreateFile("\\\\.\\COM3",     GENERIC_READ | GENERIC_WRITE,     0,     0,     OPEN_EXISTING,     FILE_ATTRIBUTE_NORMAL,     0); それ以外のとこは見ていない

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.3

なんかぼけまくってて連投になってしまいますが 常識レベルという事でいえば 書かれている手順は 1.3.2.4  の順番で実行すべきです そのうえで受信がどのようになるのかの補足を    全く受信しないのかバイト数が異なるのか    フリーの通信ソフトなどを使って問題が出ていないのか  等

tk0x0B
質問者

補足

回答ありがとうございます。 一応、1,3,2,4の順で実行してみました 結果 ・ReadFile()関数のRetがfalseになり、RECECIVE FAILED(エラー)と表示されます。 ・ArduinoIDEに付属してあるシリアルモニターと C#で自作したシリアル通信アプリケーションの二つで再度確認してみましたが、 正常に値を取得し、表示することができていました。

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.2

No1 間違い >常識レベルの話として  2の設定は1のオープン前に済ませてますよね? オープン前にできるわけなかった

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

内容まともに見てませんが どのようにうまくいかないのか 1~4をどの順番で実行しているのか   常識レベルの話として  2の設定は1のオープン前に済ませてますよね?

関連するQ&A

専門家に質問してみよう