在C#中从串口读取字符

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"。
我错在哪里了?

调试并查看您的结果变量中有什么。 - Justin
你需要先阅读这个链接:http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx 和这个链接:http://stackoverflow.com/questions/8704329/reading-data-from-serial-port-in-c-sharp - NoWar
你的控制器只发送了一个字符吗?(serialPort1.Read将返回读取的字节数) - Austin Salonen
@AustinSalonen 不,控制器实际上发送了10个字符。 - softleaks
你是否在中间发送了空值?这会终止字符串。 - Jeff
你如何证明发送了10个字符? - Austin Salonen
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();

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接