SerialPort.DataReceived with USB to COM 电缆的行为与物理通信不同

本文关键字:通信 USB with DataReceived to COM SerialPort | 更新日期: 2023-09-27 18:33:30

我的 C# 桌面类库与 COM 串行端口通信。
com不是真正的com,它是连接到另一台计算机上USB到COM的USB到COM电缆,另一台计算机使用模拟器发送数据。

此解决方案工作正常,然后端口成功打开:

serialPort.Open();
if (serialPort.IsOpen)
{
   serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
}
void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  try
  {
     var length = serialPort.BytesToRead;
     byte[] buffer = new byte[length];
     serialPort.Read(buffer, 0, length);
     for (int i = 0; i < buffer.Length; i++)
     {
        System.IO.File.AppendAllText(@"c:'TestLogging.txt", string.Format("[Time = {0}]  Data was received from serial port !", DateTime.Now));         }
     } 

模拟器一直在发送数据,我在课堂上收到数据,但我不是一直收到它,我看到每 1 秒打印 30 行 - 尽管它应该一直打印!

奇怪的是 - 如果我在行中放置断点 var 长度 = .. 然后我看到我在中断时停止时的打印.. 传输的数据似乎被"缓存",当我点击"播放"时,我收到数据,但仅在我暂停该过程的时候。

SerialPort.DataReceived with USB to COM 电缆的行为与物理通信不同

我认为您在那里注册DataReceived事件处理程序为时已晚。您应该在打开端口之前注册它:

serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
serialPort.Open();
if (serialPort.IsOpen)
{
}

尝试使用超级终端连接计算机并检查通信是否正常。如果是这样,那么这是您的应用程序的错误(仔细检查串行端口设置)。否则可能是电缆或端口本身。

您确定没有收到任何错误数据吗?您是否订阅了 SerialPort.ErrorReceived 事件处理程序?如果您在那里发现一些 SerialError.Frame 错误,则可能是电缆故障或端口损坏,或者存在某些干扰通信的情况(不太可能变化,但可能会发生,例如,如果附近有一些强大的电源,例如逆变器)。

好的,问题是什么?
我使用的是USB到COM电缆,而不是真正的COM端口。
从串行端口接收数据事件的行为是不同的
侦听并捕获数据事件,但不是获取字节数组(如在实际 COM 中) - 我每次都会收到一个字节(大小为 1 的数组)。
含义:在使用USB到COM端口时,在DataReceived事件上:我得到这个:1-1-1-1-1-1每个DataReceived事件给我1个字节。
真正的物理 COM .数据接收事件给我:5-30-42 等。字节
数组所以我的解决方案在处理USB到COM端口(有些人可能称之为"虚拟COM端口")时,我需要检查serialPort.BytesToRead是否比X大,然后我实际上这样做

if (serialPort.BytesToRead > 2) //I dont want to get it 1-1-1.. want to get it atleast 2-2-2-2
    serialPort.Read(buffer, 0, length);

由于serialPort.BytesToRead会告诉我当前块中有多少字节,而Read.将获得缓冲区并清理它。