![](/img/trans.png)
[英]How to know on which serial port external device is connected and read data from that device?
[英]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设置为所需连接的正确值。
一些常见的是BaudRate
, DataBits
或Parity
,但是要确保您必须全部设置它们。 甚至诸如RtsEnable
或ReadTimeout
类的东西。
您必须设置所有,因为配置状态将从端口本身保存。 因此,如果一个应用程序打开了这样的端口,对配置进行了一些更改并将其关闭,则下一个打开端口的应用程序将从此配置开始,直到更改为止。
似乎是一个问题,我从这里看不到。 ;-))
我能给您的唯一建议是使用Monitor工具 ,以更好地了解您的其他应用程序的实际功能以及网络上的功能。 此外,您可以设置两个虚拟com端口以测试在一台计算机上(即使在同一应用程序中)的读写,从而更好地控制何时发送哪些数据。
您是否已阅读DataReceived事件的文档?
从MSDN :
不保证每个接收到的字节都会引发DataReceived事件 。 使用BytesToRead属性确定缓冲区中还有多少数据要读取。
从SerialPort对象接收数据时,在辅助线程上引发DataReceived事件。 由于此事件是在辅助线程而非主线程上引发的,因此尝试修改主线程中的某些元素(例如UI元素)可能会引发线程异常。 如果需要修改主窗体或控件中的元素,请使用Invoke将更改请求回发,这将在适当的线程上完成工作。
您发布的代码段相当粗糙,但是我将ReceivedBytesThreshold属性设置为1。 这样可以确保在传入缓冲区中至少存在一个字节时触发事件。 干杯
使用PortMon捕获工作软件,然后捕获软件; 然后比较痕迹。 特别注意所有配置参数,确保它们相同(如Oliver所述)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.