从c#中的串口读取字符

时间:2013-03-21 19:14:03

标签: c# serial-port

您好我正在使用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”。

我哪里出错?

1 个答案:

答案 0 :(得分: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();

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