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

虚拟USB串口接收0x3800字节后持续中断的问题求助

虚拟USB串口接收数据异常问题

问题描述

我有一台设备通过虚拟USB串口向PC持续发送数据,但使用C#程序读取时,接收完0x3800字节(14336字节/14KB)后便停止接收。串口监控工具可正常看到0x3800字节之后仍有数据传输,说明设备与PC的USB通信未中断。

环境信息

  • 操作系统:Windows 10(Windows 7测试结果一致)
  • 编译器:Visual Studio 2015
  • 串口配置:COM3、9600/8/N/1,无握手

已尝试的排查手段

  • 修改不同端口配置参数
  • 调整设备端缓冲区大小
  • 测试多个虚拟USB串口相关NuGet包(多数无法读取数据或在相同断点失败,仅一个可读取至0x4000字节)
  • 编写C++版本程序(可连接但无法读取任何字节)
  • 使用真实RS232端口,以另一PC作为数据源,无异常

疑问与求助

为何串口监控工具能正常读取,我的C#程序却不行?推测可能是代码配置有误(已尽力排查),或是两者访问虚拟USB串口的路径不同(若如此,还有哪些连接方式?)。已添加OnErrorReceived回调,但从未触发。目前陷入困境,恳请提供恢复通信的建议。

测试代码

using System;
using System.Threading;

namespace TestConsole
{
    class Program
    {
        const string PORT_NAME = "COM3";
        const int BAUD_RATE = 9600;

        static System.IO.Ports.SerialPort port;

        static void Main(string[] args)
        {
            Console.WriteLine($"] port connect {PORT_NAME}");
            port = new System.IO.Ports.SerialPort(PORT_NAME, BAUD_RATE);
            port.DataReceived += OnRx;
            port.ErrorReceived += OnErrorReceived;
            port.DtrEnable = true;  // required for communiation
            port.Open();

            // and wait forever.
            while (true) Thread.Sleep(1000);
        }

        private static void OnErrorReceived(object sender, System.IO.Ports.SerialErrorReceivedEventArgs e)
        {
            Console.WriteLine();
            Console.WriteLine($"] port error = {e.EventType}");
            Console.WriteLine();
        }

        static void OnRx(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            System.IO.Ports.SerialPort sp = (System.IO.Ports.SerialPort)sender;
            while (0 < sp.BytesToRead)
            {
                var b = sp.ReadByte();
                if (-1 < b) ConsoleWriteByte((byte)b);
                else break;
            }
        }

        const int BYTES_PER_LINE = 16;

        static int count = 0;
        static int line = 0;

        static void ConsoleWriteByte(byte value)
        {
            if (count % BYTES_PER_LINE == 0)
            {
                Console.WriteLine();
                Console.Write($"{line:x6}:");
                count = 0;
                line += BYTES_PER_LINE;
            }

            Console.Write($" {value:x2}");
            count++;
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:27:30