ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

arduinoコミュの質問-VC++でのシリアル通信

  • mixiチェック
  • このエントリーをはてなブックマークに追加
arduinoから送られてきたデータをエディットボックスに表示するような
プログラムを作成したいのですが,うまくいかずに困っております.
どなたか詳しい方がいらっしゃればご教授いただきたいと思います.

具体的には
一つ目のボタンを押すとopen()でポートを開き,
二つ目のボタンを押すとreceive()でデータを取得して表示する.
というプログラムを作成したつもりです.
ポートが開けたことは確認できたのですが,
receive()のreadfile()でデータを取得した時に
bufにおかしな値が入っていて原因がわからずに困っております.
よろしくお願いします.
将来的には,receive()をwm_timerで起動させ,
経時的にデータを計測したいと考えております.


・arduino側

int data = 123;

void setup(){
Serial.begin(9600);
}

void loop(){
Serial.println(data);
delay(1000);
}

VC++側
void open(HWND hWnd)
{
hCom = CreateFile("COM5", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hCom == INVALID_HANDLE_VALUE){
SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),merror);
return;
}
SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),ok);
DCB dcb;
memset(&dcb, 0, sizeof(DCB));
dcb.DCBlength = sizeof(DCB) ;
dcb.BaudRate = CBR_19200;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
SetCommState(hCom, &dcb);
}

void receive(HWND hWnd){
if (hCom != INVALID_HANDLE_VALUE)
{
DWORD dwError;
COMSTAT comStat;
if (ClearCommError(hCom, &dwError, &comStat))
{
//MessageBox(NULL , TEXT("1"), TEXT(""), MB_OK);
if (comStat.cbInQue)
{
//MessageBox(NULL , TEXT("2"), TEXT(""),MB_OK);
char *buff = new char [comStat.cbInQue];
DWORD NumberOfBytesRead = 0;
if (ReadFile(hCom, buff, comStat.cbInQue, &NumberOfBytesRead, NULL) != 0)
{
//MessageBox(NULL , TEXT("3"), TEXT(""),MB_OK);
wsprintf(read_data,"%s\n",buff);
SetWindowText(GetDlgItem(hWnd,IDC_EDIT2),read_data);

}
delete [] buff;
}
}
}
}

コメント(7)

>Serial.begin(9600);

>dcb.BaudRate = CBR_19200;

速度、合っていませんが?
瀬戸っぷさん≫
・・・ほんとですね.単純なミスですみません.
速度を
>dcb.BaudRate = CBR_9600;
にして,やってみたのですが,今度は123の後ろに,やはり半角カタカナみたいなものが
入ってしまうのですが,これを除くにはどうすればよいでしょうか?
>今度は123の後ろに,やはり半角カタカナみたいなものが

受信したデータを文字列として扱う為の'\0'がないんじゃないですか?
改行コードが悪さしてるような気がする。外してるかもだけど。。。
char *buff = new char [comStat.cbInQue + 1];
DWORD NumberOfBytesRead = 0;
if (ReadFile(hCom, buff, comStat.cbInQue, &NumberOfBytesRead, NULL) != 0)
{
buff[NumberOfBytesRead] = '\0';
wsprintf(read_data,"%s\n",buff);
SetWindowText(GetDlgItem(hWnd,IDC_EDIT2),read_data);
}
delete [] buff;

でどうですか?
半角カナみたいなもの…って、「フ」だったりしませんか?(または「ヘ」)
タナカさん,瀬戸っぷさん≫
ありがとうございます.
'\0'が足りなかったみたいです.解決してほんとよかったです!
Serial.println()は文字列として送ると書いてあったので,
てっきり付加されているものだと思っていました・・・

あと,別の質問になってしまうのですが,arduinoで3チャネル計測して,シリアル通信で送る場合,VC側では,どうやって送られてくる3つの信号を識別すればよいのでしょうか?
無知で申し訳ありません.ネットや書籍を調べてもよくわからなかったので・・・
>どうやって送られてくる3つの信号を識別すればよいのでしょうか?

arduinoから送るデータにチャンネルを識別するデータも付与すれば良いのでは?
"Ch1:xxxx\r\n"(xxxxは計測データ)等の様に。

と、提案しつつ、私のスケッチでは温度センサの結果を識別できるようにしていなかったり。
# 要求の順番は決まっているのでとりあえず問題にはならない。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

arduino 更新情報

arduinoのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング