【问题标题】:C# SerialPort problems with two different versions of a device设备的两个不同版本的 C# SerialPort 问题
【发布时间】:2025-11-28 04:55:02
【问题描述】:

我正在尝试从通过 USB 连接的设备读取数据。 创建触发器的代码如下所示:

private SerialPort realTimePort;
realTimePort = new SerialPort();
realTimePort.BaudRate = 9600;
realTimePort.PortName =  "COM4";
realTimePort.ReadTimeout = 5000;
realTimePort.ReadBufferSize = 32768;
realTimePort.ReceivedBytesThreshold = 1;
realTimePort.BaudRate = 9600;
realTimePort.ReadBufferSize = 4096;
realTimePort.ParityReplace = 63;
realTimePort.Parity = Parity.None;  
realTimePort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(realTimePort_DataReceived);
realTimePort.Open();

要读取发送的数据,代码如下:

public void realTimePort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // Do something with the data
}

使用一个版本的设备一切正常,并且在发送数据时触发开始,但使用更新的设备软件版本 realTimePort_DataReceived 永远不会触发。 起初我认为问题可能是设备从不发送数据,但后来我尝试使用 "Tera Term" 读取数据,我可以准确地看到我所期待的。我还将数据与“Tera Term”进行了比较,该数据是由具有不同软件版本的设备发送的,但它完全相同的字符串您有什么想法,为什么该事件是由旧软件版本而不是新版本触发的? 设备制造商的员工已经给了我 SerialPort 的规格,因为我遇到了这个问题,但它没有帮助我。

【问题讨论】:

    标签: c# events serial-port usbserial


    【解决方案1】:

    由于我不知道您正在使用什么类型的设备以及发送什么类型的数据,因此很难重现该问题。这里有一些提示,您可以评估快速检查列表以确保正确接收数据。

    1.使用新版本设备的 RTS 或 DTR 端口标志

    基本上一些新版本的硬件使用SerialPort 的标志,例如DTR(数据终端就绪)表示您的代码已准备好接收,而 RTS(请求发送)向设备发出请求以实际发送数据。对于较旧的硬件类型,尽管在现代设备中它仍然不是但只是一种标准做法,但不是强制使用这些标志,因此您应该尝试并尝试通过您的代码启用这些标志,例如

    realTimePort.RtsEnable =  true; //enable this mode
    realTimePort.DtrEnable = true; //and also this one
    

    2。尝试读取设备错误流

    您的新版本硬件可能正在通过错误流发送数据,您使用的工具利用这两个流进行数据读取,因此您可以订阅错误事件。

    realTimePort.ErrorReceived += new SerialErrorReceivedEventHandler(sPort_ErrorReceived);
    
    private static void sPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
    {
        //process your error, it will give you further hint about why part of your question.
    }
    

    【讨论】:

      最近更新 更多