C#:SerialPort通信

时间:2009-07-24 11:54:55

标签: c# serial-port hex

我希望写入serialport com1

01 00 00 02 37 30 04

这是初始化的命令..

当我写一个char数组或字节数组时

 c[0] = (char)01;//
 c[1] = (char)00;
 c[2] = (char)00;
 c[3] = (char)02;
 c[4] = (char)37;
 c[5] = (char)30;
 c[6] = (char)04;
 serialPort 1.Write(c, 0, c.Length);

byte[] bb1 = System.Text.Encoding.Default.GetBytes(c);

我可以在串口监视器中看到:  01 00 00 02 25 1E 04 显然37被转换为25和30到1E ...... 我如何通过37和30而不是十六进制值......我尝试了各种各样的方法......

4 个答案:

答案 0 :(得分:7)

串口监视器以十六进制显示值,因此它们与您发送的值完全匹配。没有转换,十进制值37是十六进制的25,十进制值30是十六进制的1E。

创建数组时使用十六进制表示法(0x)作为文字值,然后您会看到值在串行端口监视器中按预期出现:

byte[] c = new byte[] {
   0x01,
   0x00,
   0x00,
   0x02,
   0x37,
   0x30,
   0x04
};

serialPort 1.Write(c, 0, c.Length);

答案 1 :(得分:2)

这里的问题是您已指定要以十进制发送的值,并以十六进制查看它们。显然会有分歧。

要解决此问题,请更改代码以使用十六进制指定值,而不是在每个值前加上0x,如下所示:

c[0] = (char)0x01;//
c[1] = (char)0x00;
c[2] = (char)0x00;
c[3] = (char)0x02;
c[4] = (char)0x37;
c[5] = (char)0x30;
c[6] = (char)0x04;
serialPort1.Write(c, 0, c.Length);

然后,您将在输出中看到与您期望的值相同的值。

另请参阅@Guffa s answer,其中显示了更好的初始化数组的方法,至少在您使用C#3.5时是这样。

答案 2 :(得分:1)

您传递的是37和30,而不是十六进制值。

您是在谈论查看十六进制值吗?

如果是这种情况,您使用什么来查看串口输出?如果它不是你写的东西,那可能只是程序的行为方式。

答案 3 :(得分:0)

如果你想以十六进制传递37,请使用0x37而不是37。