質問編集履歴

1

質問の内容を変更します。

2022/07/13 04:08

投稿

oueb
oueb

スコア5

test CHANGED
@@ -1 +1 @@
1
- C++でのシリアルポートからのデータ受信時に、127より大きいデータを取得する方法
1
+ C++でのシリアルポートからのデータ受信時に、0x00 データを取得する方法
test CHANGED
@@ -1,7 +1,7 @@
1
1
  ### 前提
2
2
 
3
3
  VC++でシリアルポートを使った機器Aと通信するアプリケーションを作っています。
4
- 送ってくるデータの文字列は、0x21 0x02 0x81 などで、128~255 のデータも含まれます。
4
+ 送ってくるデータの文字列は、byteデータの文字列で 0x2A 0x81 0x00 0x98 などです。
5
5
 
6
6
  ### 実現したいこと
7
7
 
@@ -9,11 +9,9 @@
9
9
 
10
10
  ### 発生している問題・エラーメッセージ
11
11
 
12
- 0127のデータは正常に取得でるのすが、128以上のデータを 63 とし取得てしまいます。
12
+ 機器Aから 0x21810098 というデータを送信したと、アプリケーション 0x218198 取得し、 00 のデータが欠けてしまいます。
13
+ 欠けないようにするにはどうすればよいでしょうか?
13
14
 
14
- ここにかかれているように、127 より大きいすべての文字を (char)63 または '?' としてエンコードしてしまうのが原因かと思いますが、シリアルポートへの出力時ではなく、シリアルポートからの入力時に128以上のデータも認識するようにするにはどうしたらよいでしょうか?
15
-
16
- https://docs.microsoft.com/ja-jp/dotnet/api/system.io.ports.serialport.write?view=dotnet-plat-ext-6.0
17
15
 
18
16
  ### 該当のソースコード
19
17
 
@@ -24,17 +22,24 @@
24
22
  /* 引数 EventArgs */
25
23
  Ports::SerialDataReceivedEventArgs^ e)
26
24
  {
25
+ int i;
26
+ int wiRecvLength;
27
+ String^ wstrRcvBuf;
28
+ array<byte>^ readBuffer = gcnew array<byte>(256);
29
+
30
+ wiRecvLength = serialPort->Read(readBuffer, 0, 256);
31
+
32
+ for (int i = 0; i < wiRecvLength; i++)
33
+ {
34
+
35
+ wstrRcvBuf += readBuffer[i].ToString("x2");
36
+
37
+ }
38
+
27
39
  RecvDataCallBack^ d = gcnew RecvDataCallBack(this, &FormMain::RecvData);
28
- this->Invoke(d, serialPort->ReadExisting());
40
+ this->Invoke(d, wstrRcvBuf);
29
41
  }
30
42
 
31
- void FormMain::RecvData(
32
- String^ wstrData) /* 引数 受信Data */
33
- {
34
- /* 受信した文字列をテキストボックスに表示 */
35
- AddLog(String::Format("Recv : {0}", wstrRcvBuf));
36
-
37
- }
38
43
  ### 試したこと
39
44
 
40
45