You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中无法重新建立与串口设备的通信问题求助

不拔插USB线缆无法重新与串口设备建立连接的问题

现象说明

  • 首次连接设备完全正常:能发送数据,设备会回复预期的\u002ACK\x0d或\u002NACK\x0d
  • 程序崩溃/关闭后重连异常:通过重写的Open()方法重新连接时,仅能发送数据但无法接收任何响应,同步、异步接收模式均无改善
  • 恢复正常的触发条件:只有拔插设备USB线缆,或用Python脚本/第三方串口工具向设备发送一次数据(设备会正常回复)后,代码才能再次正常工作

相关代码实现

基类SerialCommunication

public class SerialCommunication
{
    protected SerialPort serial_port = null;
    protected string serial_port_name;
    
    // 省略其他代码

    public SerialCommunication(string _serial_port_name)
    {
        serial_port_name = _serial_port_name;
    }

    public virtual bool Open(bool dtr = true)
    {
        try
        {
            if ((serial_port == null || !serial_port.IsOpen))
            {
                serial_port = new SerialPort(serial_port_name)
                {
                    BaudRate = 115200,
                    DataBits = 8,
                    StopBits = StopBits.One,
                    DtrEnable = dtr, 
                };
                serial_port.Open();
            }
        }
        catch
        {
            // 省略异常处理逻辑
        }
        // 省略返回值逻辑
    }
}

子类重写实现

public class SubClass : SerialCommunication
{
    // 省略其他代码
    
    public override bool Open()
    {
        bool isOK = base.Open(false); 

        if(isOK)
        {
             serial_port.DataReceived += Serial_port_DataReceived;
             return Init();
        } 
        
        // 省略其他逻辑
    }

    // Init方法仅向设备发送数据,预期设备返回ACK/NACK
    private bool Init()
    {
        // 省略数据发送逻辑
    }

    private void Serial_port_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        // 省略数据接收处理逻辑
    }
}

已排查内容

  • 对比工作与非工作状态下SerialPort对象的所有属性,完全一致
  • 排除了同步/异步接收模式对问题的影响

推测问题出在底层串口驱动或设备内部状态,但无法准确定位根因。

内容的提问来源于stack exchange,提问作者Cholas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 11:34:56