みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

}

投稿日時 - 2015-11-21 16:43:10

QNo.9083827

困ってます

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(5)

とりあえず、エラーが発生した直後で GetLastError 関数を実行してエラーの詳細を入手したほうが良いです。エラーの詳細もなしにあれこれ論議しても詮無いです。

C# はライブラリが優秀なので自動的に色々とエラー処理してくれますが、C++ は全然全く何もしてくれません。「バッファが小さすぎてエラー」だの「未処理バッファが溜まりすぎてエラー」だの平気で起こしてくれますので、エラー詳細がわからないと本当にチンプンカンプンですよ。

投稿日時 - 2015-11-21 23:27:50

ANo.4

実際動かしてるソースと比較してみました  最初のオープン関数の引数が間違ってます
   (GENERIC_READが無いからエラーなんじゃないかな)

CreateFile("\\\\.\\COM3",
    GENERIC_READ | GENERIC_WRITE,
    0,
    0,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0);

それ以外のとこは見ていない

投稿日時 - 2015-11-21 20:37:53

ANo.3

なんかぼけまくってて連投になってしまいますが
常識レベルという事でいえば
書かれている手順は 1.3.2.4  の順番で実行すべきです

そのうえで受信がどのようになるのかの補足を
   全く受信しないのかバイト数が異なるのか
   フリーの通信ソフトなどを使って問題が出ていないのか  等

投稿日時 - 2015-11-21 17:59:19

補足

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

投稿日時 - 2015-11-21 18:24:25

ANo.2

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

投稿日時 - 2015-11-21 17:51:10

ANo.1

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

投稿日時 - 2015-11-21 17:49:00

あなたにオススメの質問