【问题标题】:Readline from Serial Port locks up串行端口的读取线锁定
【发布时间】:2010-09-26 13:13:16
【问题描述】:

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

    }

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

【问题讨论】:

  • 当您说“锁定 PC”时,是真的锁定了整个 PC,还是只锁定了您的程序?
  • 对不起,我的意思是它锁定了程序。
  • @user:这个帖子看起来回答了我。你还需要什么?

标签: c# serial-port


【解决方案1】:

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

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

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

如果这些都不适用,请确保您实际上是在您认为的位置发送数据 - 调出 HyperTerminal/TeraTerm/您最喜欢的串行终端,使用与上面使用的相同的串行端口设置对其进行配置,并确保您看到您希望看到的数据。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-01-24
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 2016-09-26
      • 1970-01-01
      相关资源
      最近更新 更多