繁体   English   中英

如何从串行端口读取设备数据

[英]How to Read Device Data From serial port

我有一台设备通过COM13上的COM端口发送数据。 现在,我想读取该数据并将其显示在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;
}

这通常是由于串口配置错误所致。 仅打开一个串行端口并等待一些数据输入是不够的。您还必须将所有 SerialPort.Properties设置为所需连接的正确值。

一些常见的是BaudRateDataBitsParity ,但是要确保您必须全部设置它们。 甚至诸如RtsEnableReadTimeout类的东西。

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

更新

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

我能给您的唯一建议是使用Monitor工具 ,以更好地了解您的其他应用程序的实际功能以及网络上的功能。 此外,您可以设置两个虚拟com端口以测试在一台计算机上(即使在同一应用程序中)的读写,从而更好地控制何时发送哪些数据。

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

MSDN

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

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

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

使用PortMon捕获工作软件,然后捕获软件; 然后比较痕迹。 特别注意所有配置参数,确保它们相同(如Oliver所述)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM