串行端口的读取线锁定

时间:2010-09-25 17:44:12

标签: c# serial-port

我正在尝试从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();

    }

您能帮我确定如何只获得一行输出数据并关闭连接吗?

2 个答案:

答案 0 :(得分:2)

SerialPort.ReadLine定义为阻止“直到第一次出现NewLine值”,其中NewLine默认为换行符。您是否在流中发送了换行符?请注意,换行符(ASCII 0x0A)与您可能要发送的回车符(ASCII 0x0D)不同。

如果需要,您可以重新定义NewLine,或者如果行结尾感觉不对,您可以使用SerialPort.ReadTo读取给定字符串。您还可以设置read timeout

您可能更喜欢从端口读取给定数量的字节,而不是一行,其中一个SerialPort.Read重载。

如果这些都不适用,请确保您实际上正在发送您认为自己的数据 - 启动HyperTerminal / TeraTerm /您最喜欢的串行终端,使用您在上面使用的相同串行端口设置进行配置,并确保您看到了您希望看到的数据。

答案 1 :(得分:0)

理想的解决方案是生成一个工作线程以实际从串口读取(因此,线程可以整天被阻塞而不会妨碍您的主应用程序线程)。一旦收到数据,它就可以广播一个事件,指出已收到数据以及该数据是什么。该线程将通过事件与主应用程序线程进行通信。