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

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

解決済みの質問

(VC++)シリアル通信について

OS:Windows7
開発環境:VisualStudio2010
言語:C++
機器:カードリーダ
接続:RS-232C

VisualStudio2010にて、シリアル通信を行うプログラムを作成しています。
VisualStudioのヘルプや、いくつかのWebページを参考に、送信を行うところまではできています。
しかし、受信ができているのか、もしくは受信した内容が表示できていないのか分かりませんが、受信が確認できません。
送信はカードリーダが動くので分かりやすいのですが、受信は表示できないと確認できないためこのような状態です。

カードリーダの仕様は、あるASCIIコードを送るとカードが送られ、エラーステイタスコードが返ってきます。正常にカードが送られた場合は、またASCIIコードを送ると、読み取ったカードの情報がでてきます。(シリアル通信をテストするプログラムでは送信受信共に成功しています。)
(送信)は、こちらが送ったもので、それ以外は受信した結果です。
---------------以下その時の結果---------------
3f 0d (送信)
30
10 45 30 31 32 30 30 38 0d (送信)
32 0d
33 59 0d
30 0d
31 59 0d
32 59 0d
33 0d
30 0d
31 0d
----------------------------------------------


C++のプログラムは以下の様になっています。
上記の結果でいうと、3f、0dを送り30を受け取るというところです。3f、0dでカードが送られ、30(正常終了)という結果を受け取ります。この結果をテキストボックスに表示したいと考えています。現在は、カードは送られるものの、30(もしくは他のエラーステイタスコード)という結果を表示することができません。
private: System::Void button_start_Click(System::Object^ sender, System::EventArgs^ e)
{
 serialPort1->Open();
 serialPort1->Write(x3f); //defineにて定義(中身は?[0x3f])
 serialPort1->Write(x0d); //defineにて定義(中身はCR[0x0d])
 serialPort1->Close();
}

delegate void SerialDataRecievedDelegate(String^ recvData);
private: void SerialDataRecieved(String^ recvData)
{
 textBox1->Text = recvData; //確認するためにtextBox1に結果を表示
}

private: System::Void serialPort1_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e)
{
 SerialDataRecievedDelegate^ dlgte = gcnew SerialDataRecievedDelegate( this, &CardReader::Form1::SerialDataRecieved );
 String^ RecievedData = serialPort1->ReadExisting();

 //1バイトずつ受信
 if(serialPort1->IsOpen == true) //シリアルポートが開いているか確認
 {
  COMRevieveBuffer = COMRevieveBuffer + RecievedData; //受信バッファに追加

  if(RecievedData == "\r" ) //改行コード検出
  {
   RecievedData = RecievedData + "\n";
   COMRevieveBuffer = COMRevieveBuffer + RecievedData;

   //受信した一行をテキストボックスに転送
   this->Invoke(dlgte, COMRevieveBuffer);
   COMRevieveBuffer = "";
  }

  //エコーを返す
  serialPort1->Write(RecievedData);
 }
}

C言語でのプログラム作成はしていたのですが、VisualStudioやC++でのプログラム作成は初めてです。
ソースに変な点が多々あるとは思います。
ご教授お願いします。

投稿日時 - 2012-10-23 17:57:06

QNo.7762684

困ってます

質問者が選んだベストアンサー

>VisualStudioに動作確認できる機能がついているかもしれませんが、この機能を知らないため上記のような事をやってました…

ブレークポイント設定して止めるとか、
デバッグ出力使って「出力ウィンドウ」にメッセージを出すとか……。

投稿日時 - 2012-10-23 23:56:06

お礼

どちらの機能もすごく便利でした…
VisualStudioを使っていても、宝の持ち腐れな気がしてきます。

前回の回答であったポートの件ですが、やはり真になっていなかったようです。
書いている最中に気づかないとはお恥ずかしい限りです…

ありがとうございました。

投稿日時 - 2012-10-24 21:41:30

ANo.2

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

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

回答(2)

ANo.1

Wr5

CLR…でしょうかね。
触っていないので細かいところは判りませんが……とりあえず気になったところを。

> serialPort1->Open();
> serialPort1->Write(x3f); //defineにて定義(中身は?[0x3f])
> serialPort1->Write(x0d); //defineにて定義(中身はCR[0x0d])
> serialPort1->Close();

ここでClose()していて、

> if(serialPort1->IsOpen == true) //シリアルポートが開いているか確認

のIsOpenは真になるんですか?
閉じてますよね?

投稿日時 - 2012-10-23 18:51:04

お礼

回答ありがとうございます。

CLRですね。
もう職場ではないので試す事はできませんが…
どこまで動いているか確認するために、if文の中でMessageBoxを出そうとしたのですが、出ませんでした。おそらく、おっしゃられている通り、真になっていないんだと思います。
VisualStudioに動作確認できる機能がついているかもしれませんが、この機能を知らないため上記のような事をやってました…

明日早速試してみます。

投稿日時 - 2012-10-23 20:48:11

あなたにオススメの質問