3

您好,我正在使用 Read() 方法从串口读取 10 个字符,例如 0123456789。实际上,字符是由 PIC 微控制器发送的。

这是我的代码:

serialPort1.PortName = "com4";
serialPort1.BaudRate = 9600;
serialPort1.Open();
char[] result = new char[10];
serialPort1.Read(result, 0, result.Length);
string s = new string(result);
MessageBox.Show(s);
serialPort1.Close();

当我运行代码时,会出现一个消息框并且只显示第一个字符。消息框中仅显示“0”。

我哪里出错了??

4

1 回答 1

5

你做错的是没有注意 Read() 的返回值。它告诉您读取了多少字节。

串行端口是非常慢的设备,在典型的 9600 波特率设置下,传输一个字节需要一毫秒。对于现代处理器来说,这是一个巨大的时间,它可以轻松地在一毫秒内执行数百万条指令。Read() 方法会在某些字节可用时立即返回,如果您人为地让程序变慢,那么您只能获得全部 10 个字节,以便驱动程序有足够的时间来接收所有这些字节。

一个简单的解决方法是继续调用 Read() 直到你得到它们:

char[] result = new char[10];
for (int len = 0; len < result.Length; ) {
   len += serialPort1.Read(result, len, result.Length - len);
}

另一种常见的解决方案是发送一个唯一字符来指示数据的结束。换行 ('\n') 是一个很好的选择。现在它变得简单多了:

string result = serialPort.ReadLine();

现在还支持任意响应长度。只需确保数据不包含换行符。

于 2013-03-21T20:14:32.947 回答