如何从串口读取设备数据

时间:2010-05-04 10:30:29

标签: c# wpf

我有一个设备在COM端口上发送数据,例如在COM13上。现在我想读取该数据并将其显示在RichTextBox或任何文本控件中。

我已经在IO和IO.Ports的帮助下编写了应用程序,但comport.DataRecived事件不会触发,即使设备正在该端口上发送数据。

我有一些软件,我在其上定义端口号并成功显示数据,这可以保证数据在端口上接收但我无法接收。

有什么方法可以读取数据吗?

comm.Parity = cboParity.Text;//None
comm.StopBits = cboStop.Text;//One
comm.DataBits = cboData.Text;//8
comm.BaudRate = cboBaud.Text;//9600
comm.DisplayWindow = rtbDisplay;//Null
comm.PortName = "COM13";
comm.OpenPort();

cmdOpen.Enabled = false;
cmdClose.Enabled = true;
cmdSend.Enabled = true;

public bool OpenPort()
{
    if (comPort.IsOpen)
    {
        comPort.Close();
    }

    comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);
    comPort.PortName = _portName;
    comPort.Open();return true;
}

4 个答案:

答案 0 :(得分:1)

这通常来自串口的错误配置。仅仅打开串口并等待一些数据进入是不够的。您还必须将全部 SerialPort.Properties设置为所需连接的正确值。

一些常见的是BaudRateDataBitsParity,但要确定您必须设置所有这些内容。甚至包括RtsEnableReadTimeout

您必须设置all,因为配置状态将从端口本身保存。因此,如果一个应用程序打开这样的端口,对配置进行一些更改并关闭它,打开端口的下一个应用程序将从此配置开始,直到它更改为止。

更新

似乎是一个我从这里看不到的问题。 ; - ))

我能给你的唯一建议是使用Monitor tool,以便更好地了解你的其他应用程序的真正功能以及线路上的内容。此外,您可以设置two virtual com ports来测试一台计算机上的读写(即使在同一个应用程序中),以便更好地控制何时发送哪些数据。

答案 1 :(得分:0)

您是否阅读过DataReceived事件的文档?

来自MSDN

  

不保证每收到一个字节都会引发DataReceived事件。使用BytesToRead属性确定要在缓冲区中读取多少数据。

     

从SerialPort对象接收数据时,在辅助线程上引发DataReceived事件。因为此事件是在辅助线程而不是主线程上引发的,所以尝试修改主线程中的某些元素(例如UI元素)可能会引发线程异常。如果有必要修改主窗体或控件中的元素,请使用Invoke发回更改请求,这将在正确的线程上完成工作。

答案 2 :(得分:0)

您发布的代码段很粗糙,但我将ReceivedBytesThreshold属性设置为1。这可确保在传入缓冲区中至少存在一个字节时触发事件。 干杯

答案 3 :(得分:0)

使用PortMon捕获正在运行的软件,然后捕获您的软件;然后比较痕迹。特别注意所有配置参数,确保它们是相同的(如Oliver所提到的)。