在串行端口接收的字节从未超过127

本文关键字:字节 串行端口 | 更新日期: 2023-09-27 17:53:57

我有一个程序,发送一个流字节到其他pc。取值范围是0 ~ 255。我这样设置我的串行端口

sp.BaudRate = 115200;
sp.PortName = "COM53";
sp.DataBits = 8;
sp.StopBits = System.IO.Ports.StopBits.One;
sp.Parity = System.IO.Ports.Parity.None;
sp.ReadTimeout = 0;
sp.Open();
sp.DataReceived += new
System.IO.Ports.SerialDataReceivedEventHandler(sp_ DataReceived);

然后是这个

void sp_DataReceived(object sender,
System.IO.Ports.SerialDataReceivedEventArgs e)
{
string Mystring = sp.ReadExisting();
byte testbyte = 254;
// Gather all the bytes until 102 is reached
foreach (byte c in Mystring)
{
if(pixelcount<102)
pixel[pixelcount] = c;
pixelcount++;
if (c 126)
Console.WriteLine("big number {0}", c);// biggest number ever printed is 127
}
//got all the bytes, now draw them
if (pixelcount == 102)
{
Console.WriteLine("testbyte = {0}", testbyte);
oldx = 0;
pixelcount = 0;
pictureBox_rawData.Invalidate();
}
}

我的问题是"c"永远不会超过127。我遗漏了什么?我已经测试了所有的编码,但我不能解决这个问题。请帮助。

谢谢int91h

在串行端口接收的字节从未超过127

如果您想获得原始字节,您应该使用SerialPort。Read将其读入字节数组。使用SerialPort.ReadExisting将数据读入字符串将强制进行某种转换(即编码将字节转换为字符)。

在SerialPort的文档中。写(备注部分):

默认情况下,SerialPort使用ASCIIEncoding对字符进行编码。ASCIIEncoding将所有大于127的字符编码为(char)63或'?'。若要支持该范围内的其他字符,请将Encoding设置为UTF8Encoding、UTF32Encoding或UnicodeEncoding。

也许readeexisting的行为类似,将大于127的每个字节转换为63。

您在读的不是字节,而是文本。它是通过根据SerialPort转换端口接收的字节来产生的。编码属性值。默认为Encoding。ASCII,一种只有字节值0到127的字符的编码。超出该范围的字节值将被"?"字符替换。

这就解释了你所看到的。在您的情况下,选择另一种编码是不太可能的解决方案,请使用SerialPort.Read()代替。与readexististing等价的方法是使用足够大的count参数调用Read()。你会得到任何合适的东西,复制到缓冲区的实际字节数是方法的返回值。当输入缓冲区为空时,它会阻塞。这只能发生在DataReceived事件处理程序中,当e.EventType不等于SerialData.Chars。这通常不是问题。

注意对pictureBox_rawData.Invalidate()的调用无效。DataReceived运行在线程池线程上。你只能触摸UI线程上的控件成员。你需要使用Control.BeginInvoke()

正如Hans Passant所说,您需要使用SerialPort.Read()。

这样就可以了

'retrieve number of bytes in the buffer
Dim bytes1 As Integer = ComPort.BytesToRead
'create a byte array to hold the awaiting data
Dim comBuffer As Byte() = New Byte(bytes1 - 1) {}
'read the data and store it to comBuffer
ComPort.Read(comBuffer, 0, bytes1)