C# COM 端口通信 - USB 到串行适配器的错误

Posted

技术标签:

【中文标题】C# COM 端口通信 - USB 到串行适配器的错误【英文标题】:C# COM port communication - errors with a USB to Serial Adapter 【发布时间】:2011-07-25 22:11:49 【问题描述】:

这是场景 - 我有一个从 COM 端口读取的 C# 应用程序。大多数时候,我使用带有串行适配器的设备和带有串行端口的机器。但是,带串口的机器越来越难买到,所以我开始使用带 USB/Serial 连接的机器。

在某些情况下,我所拥有的 C# 代码在“真正的”串行连接下可以正常工作,但在 USB/串行连接下会失败。数据是零散的,数据的第一部分进入(可能是前 1 或 2 个字符),仅此而已。

我正在使用 comport.ReadExisting() 之类的基本功能从端口获取数据。这是问题的一部分吗?是否有其他方法可以保证所有数据都以单个字符串的形式读取?

最后,我想补充一点,我已经在设备管理器中使用了一些 USB/串行设置,并且在使用良好的 ole' 超级终端时数据正常。 . .所以它必须是代码中的东西。

【问题讨论】:

您是否希望接收到的数据具有协议。这可以像一个以换行符结尾的字符串一样简单,也可以是一些固定数量的数据。 如果您正确使用 DataReceived 事件,您应该没问题。查看代码会有所帮助。 【参考方案1】:

使用 USB 串行转换器,您必须设置接收超时,因为数据可以在 USB 设备中保存很长时间,而 Windows 不知道。真正的串口将数据保存在 Windows 驱动程序可以看到的 16550 FIFO 中。

【讨论】:

我假设您指的是已设置为 20000(即 20 秒)的 comport.ReadTimeout ???我找不到任何其他接近此的超时 @Jim:在 Win32 API 中有直到第一个字符的超时、字符之间的超时和总超时。不确定 .NET SerialPort 类是否为您提供了所有这些。在它变得如此痛苦之前我没有使用它很长时间,以至于我围绕 Win32 串行端口 API 制作了自己的包装器(在 C++/CLI 中)。 字符之间的超时听起来是正确的,因为我得到了一些数据,但不是全部。但是我在使用 .NET 库方面投入了很多,因为它适用于大多数硬件配置——它只是有问题的 USB/串行连接【参考方案2】:

大多数情况下,您希望使用 SerialPort.DataReceived 事件 (http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx)。

这需要您手动组合数据块,因为您可以接收部分字符串,但是一旦您检测到单个“记录”的边界,您就可以触发处理该记录,同时让 IO 接收更多事件。

这允许一些不会阻塞线程的异步 IO,因此通常可以更有效地处理数据。如果它对您的具体情况有所帮助,我不知道,但它在过去帮助我处理数据读取问题、低速、线程池和锁定。

【讨论】:

我已经在使用那个事件,这就是我使用 comport.ReadExisting 的地方,它 supposed 来清除缓冲区,但同样,我只得到分数数据

以上是关于C# COM 端口通信 - USB 到串行适配器的错误的主要内容,如果未能解决你的问题,请参考以下文章

给定 COM 端口,如何找到 USB 串行适配器的序列号?

使用pyserial测试usb到串口到usb没有输出

带有 USB 适配器的笔记本电脑上的串行端口

如何通过usb端口通信从arduino将串行数据写入phpmyadmin

C#如何将COM端口更改为指定的端口

虚拟 COM 端口 STM32 和 Qt 串行端口