在串行端口中收到的字节永远不会超过127

时间:2011-05-01 14:12:08

标签: c# serial-port

我有一个程序将流字节发送到另一台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

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

SerialPort.Write(备注部分)的文档中:

  

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

也许ReadExisting表现相似,并将每个大于127的字节转换为63。

答案 2 :(得分:3)

你不是在读字节,而是在阅读文字。这是通过根据SerialPort.Encoding属性值转换端口接收的字节而生成的。默认为Encoding.ASCII,一种仅包含字节值0到127的字符的编码。超出该范围的字节值将替换为“?”字符。

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

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

答案 3 :(得分:0)

正如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)