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

通过RDP重定向COM端口时出现未记录IOException问题求助

.NET 3.5 SerialPort.ReadLine()在Windows Server 2019 RDP串口重定向时抛出IOException("已到达文件末尾")

问题场景

我维护一款前辈开发的.NET 3.5 WinForms工具,功能是通过串口对设备重编程。设备通过USB转COM线连接本地电脑,经RDP串口重定向转发至运行工具的远程服务器。该工具在Windows Server 2012上运行正常,但在Windows Server 2019上,调用serialPort.ReadLine()时立即抛出System.IO.IOException,错误信息为“已到达文件末尾”。

相关代码:

serialPort = new SerialPort();
serialPort.PortName = "COM1";
serialPort.BaudRate = 115200;
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.Handshake = Handshake.None;
serialPort.NewLine = "\r";

serialPort.Open();

serialPort.ReadTimeout = 2000;
do
{
    try
    {
        sMessage = serialPort.ReadLine();
        AddLog(sMessage);
    }
    catch (TimeoutException) {}
} while (!sMessage.Contains("Starting Reprogramming Process"));

已尝试的操作

  • 本地直接运行工具,可正常读取COM端口
  • 远程桌面用PuTTY可读取该端口(已重新安装服务器驱动)
  • 确认串口参数(波特率、奇偶校验等)均正确

解决方案尝试

1. 替换ReadLine为逐字节读取

.NET 3.5的SerialPort.ReadLine()依赖底层流的换行符检测,在Server2019的RDP重定向环境下,可能因流的EOF信号异常触发导致报错。改用逐字节读取并手动处理换行逻辑:

StringBuilder messageBuilder = new StringBuilder();
serialPort.ReadTimeout = 2000;
bool processStarted = false;

while (!processStarted)
{
    try
    {
        int byteReceived = serialPort.ReadByte();
        if (byteReceived == -1)
        {
            // 遇到EOF信号,短暂重试后继续
            System.Threading.Thread.Sleep(100);
            continue;
        }

        char receivedChar = (char)byteReceived;
        messageBuilder.Append(receivedChar);

        // 匹配自定义换行符
        if (receivedChar == '\r')
        {
            string fullMessage = messageBuilder.ToString();
            AddLog(fullMessage);
            
            if (fullMessage.Contains("Starting Reprogramming Process"))
            {
                processStarted = true;
            }
            messageBuilder.Clear();
        }
    }
    catch (TimeoutException)
    {
        // 超时逻辑保持不变
    }
}

2. 检查Server2019的RDP串口重定向配置

  • 打开组策略编辑器,导航至计算机配置>管理模板>Windows组件>远程桌面服务>远程桌面会话主机>设备和资源重定向,确保「允许COM端口重定向」已设置为「已启用」
  • 连接远程桌面时,在「本地资源」选项卡中确认已勾选「串口」选项

3. 尝试升级.NET Framework版本(若允许)

.NET 3.5的SerialPort类在Windows Server 2019这类新系统上存在已知兼容性问题,后续.NET Framework版本(如4.7.2及以上)修复了大量串口相关的底层API调用bug,升级后可能解决该问题。

4. 验证驱动兼容性

虽然PuTTY能正常读取,但.NET的SerialPort调用的Windows底层串口API与PuTTY存在差异。尝试更新设备驱动至官方发布的支持Windows Server 2019的版本,确保驱动与系统完全兼容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:53:17