質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

Q&A

解決済

3回答

999閲覧

C++でのシリアルポートからのデータ受信時に、0x00 データを取得する方法

oueb

総合スコア5

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

0グッド

0クリップ

投稿2022/07/13 01:22

編集2022/07/13 04:08

前提

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/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2022/07/13 01:33 編集

SerialPort.Encoding に何を指定しているか(あるいは何も指定していないか) 機器から送られてくるテキストのエンコーディングは何か を記載ください。
oueb

2022/07/13 01:52

ありがとうございます。 SerialPort.Encoding には何も指定していません。 機器Aからは char型の文字列を送信しており、エンコーディングは行っていません。
can110

2022/07/13 02:20

つまりテキストとして受信したいわけではなく、バイト列として受信したいということでしょうか?
oueb

2022/07/13 02:39

そうです。 下記のようにしたら、できました。 wiRecvLength = serialPort->Read(readBuffer, 0, 15); for (int i = 0; i < wiRecvLength; i++) { wstrRcvBuf += readBuffer[i].ToString("x2"); } しかし、機器Aから 0x21800098 というデータを送ると、0x218098 というデータを受信してしまいます。 00 はヌル文字として削除されるのでしょうか?
can110

2022/07/13 02:43

この欄は質問の修正依頼欄で目立ちませんので、追加情報は質問本文のほうで修正(追記)ください。
can110

2022/07/13 02:51

> 00 はヌル文字として削除されるのでしょうか? その現象は、どのような手段(コード)でどのような結果を見て判断されたでしょうか?
oueb

2022/07/13 02:57

機器Aーアプリケーションを立ち上げているPC 間のシリアル通信はプロトコルアナライザーでモニタしましたが、0x21800098 というデータを機器Aが送信していました。 しかし、上記コードで wstrRcvBuf に格納された値をVisual Studio のデバックモニタで確認したところ、0x218098が格納されていました。
can110

2022/07/13 04:01

重ねてお願いしますが、追加情報は質問本文に記載ください。 また、そのときの「wiRecvLength」の値はいくつだったでしょうか?
oueb

2022/07/13 04:12

失礼しました。 wiRecvLength は 00 データを除いたバイト数分が格納されました。 218098 なら 3です
can110

2022/07/13 04:22

送信バイト数の一部しか受信できていないようですね。
oueb

2022/07/13 04:36

SerialPort.DiscardNull Propertyをfalseに変更したところ解決しました。 ありがとうございました。
guest

回答3

0

ベストアンサー

.NETのSerialPortは扱ったことないので推測混じりの回答となりますがVB.NETにおけるRS-232Cバイナリ通信受信でNULが消える現象と類似の現象と思われます。
もしSerialPort.DiscardNull Propertytrueになっていたらfalseに変更してみてください。

投稿2022/07/13 04:29

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oueb

2022/07/13 04:36

上記の通りにしたところ解決しました。 ありがとうございました。
guest

0

文字列で受信するのではなく、バイト配列で受信しましょう

投稿2022/07/13 01:35

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SerialPort.DiscardNull Propertyをfalseに変更したところ解決しました。

投稿2022/07/13 04:36

oueb

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問