前提
VC++でシリアルポートを使った機器Aと通信するアプリケーションを作っています。
送ってくるデータの文字列は、byteデータの文字列で 0x2A 0x81 0x00 0x98 などです。
実現したいこと
機器Aからのシリアルポートからの文字列を受信して内容をデコードしたいです。
発生している問題・エラーメッセージ
機器Aから 0x21810098 というデータを送信したとき、アプリケーションでは、 0x218198 取得し、 00 のデータが欠けてしまいます。
欠けないようにするにはどうすればよいでしょうか?
該当のソースコード
C++/CLI コード
System::Void FormMain::serialPort_DataReceived(
System::Object^ sender, /* 引数 Sender /
/ 引数 EventArgs */
Ports::SerialDataReceivedEventArgs^ e)
{
int i;
int wiRecvLength;
String^ wstrRcvBuf;
array<byte>^ readBuffer = gcnew array<byte>(256);
wiRecvLength = serialPort->Read(readBuffer, 0, 256); for (int i = 0; i < wiRecvLength; i++) { wstrRcvBuf += readBuffer[i].ToString("x2"); } RecvDataCallBack^ d = gcnew RecvDataCallBack(this, &FormMain::RecvData); this->Invoke(d, wstrRcvBuf);
}
試したこと
補足情報(FW/ツールのバージョンなど)
SerialPort.Encoding に何を指定しているか(あるいは何も指定していないか)
機器から送られてくるテキストのエンコーディングは何か
を記載ください。
ありがとうございます。
SerialPort.Encoding には何も指定していません。
機器Aからは char型の文字列を送信しており、エンコーディングは行っていません。
つまりテキストとして受信したいわけではなく、バイト列として受信したいということでしょうか?
そうです。
下記のようにしたら、できました。
wiRecvLength = serialPort->Read(readBuffer, 0, 15);
for (int i = 0; i < wiRecvLength; i++)
{
wstrRcvBuf += readBuffer[i].ToString("x2");
}
しかし、機器Aから 0x21800098 というデータを送ると、0x218098 というデータを受信してしまいます。
00 はヌル文字として削除されるのでしょうか?
この欄は質問の修正依頼欄で目立ちませんので、追加情報は質問本文のほうで修正(追記)ください。
> 00 はヌル文字として削除されるのでしょうか?
その現象は、どのような手段(コード)でどのような結果を見て判断されたでしょうか?
機器Aーアプリケーションを立ち上げているPC 間のシリアル通信はプロトコルアナライザーでモニタしましたが、0x21800098 というデータを機器Aが送信していました。
しかし、上記コードで wstrRcvBuf に格納された値をVisual Studio のデバックモニタで確認したところ、0x218098が格納されていました。
重ねてお願いしますが、追加情報は質問本文に記載ください。
また、そのときの「wiRecvLength」の値はいくつだったでしょうか?
失礼しました。
wiRecvLength は 00 データを除いたバイト数分が格納されました。
218098 なら 3です
送信バイト数の一部しか受信できていないようですね。
SerialPort.DiscardNull Propertyをfalseに変更したところ解決しました。
ありがとうございました。
回答3件
あなたの回答
tips
プレビュー