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

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

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

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

.NET Framework 4.0

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

解決済

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

oueb
oueb

総合スコア5

VC++

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

.NET Framework 4.0

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

3回答

0評価

0クリップ

279閲覧

投稿2022/07/13 01:22

編集2022/07/13 13:36

前提

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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に変更したところ解決しました。 ありがとうございました。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

VC++

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

.NET Framework 4.0

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