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 到串行适配器的错误的主要内容,如果未能解决你的问题,请参考以下文章