我正在尝试从RS232接口读取数据。它通过串口发送连续的ASCII字符串流,我遇到了麻烦。我只想获得它发出的一行数据。我想我假设我会使用Readline来获取数据,但它只是在我运行时锁定了PC。我认为它试图获取所有数据,并且在数据停止之前不会停止?这是我正在使用的代码:
private void button1_Click(object sender, EventArgs e)
{
serialPort1.PortName = "COM4";
serialPort1.BaudRate = 9600;
serialPort1.DataBits = 8;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
//opening the serial port
serialPort1.Open();
string str = serialPort1.ReadLine();
MessageBox.Show(str);
serialPort1.Close();
}
您能帮我确定如何只获得一行输出数据并关闭连接吗?
答案 0 :(得分:2)
SerialPort.ReadLine定义为阻止“直到第一次出现NewLine值”,其中NewLine默认为换行符。您是否在流中发送了换行符?请注意,换行符(ASCII 0x0A)与您可能要发送的回车符(ASCII 0x0D)不同。
如果需要,您可以重新定义NewLine,或者如果行结尾感觉不对,您可以使用SerialPort.ReadTo读取给定字符串。您还可以设置read timeout。
您可能更喜欢从端口读取给定数量的字节,而不是一行,其中一个SerialPort.Read重载。
如果这些都不适用,请确保您实际上正在发送您认为自己的数据 - 启动HyperTerminal / TeraTerm /您最喜欢的串行终端,使用您在上面使用的相同串行端口设置进行配置,并确保您看到了您希望看到的数据。
答案 1 :(得分:0)
理想的解决方案是生成一个工作线程以实际从串口读取(因此,线程可以整天被阻塞而不会妨碍您的主应用程序线程)。一旦收到数据,它就可以广播一个事件,指出已收到数据以及该数据是什么。该线程将通过事件与主应用程序线程进行通信。