这是场景 - 我有一个从COM端口读取的C#应用程序。大多数情况下,我使用带有串行适配器的设备和带有串行端口的计算机。但是,具有串行端口的机器越来越难以获得,因此我开始使用具有USB /串行连接的机器。
在某些情况下,我拥有的C#代码可以正常使用“真正的”串行连接,但无法通过USB /串行连接。数据的第一部分进入(如可能是前1或2个字符)而没有别的。
我正在使用类似comport.ReadExisting()的东西来从端口获取数据。这是问题的一部分吗?是否有其他方法可以保证所有数据都可以在一个字符串中读取?
最后,我想补充一点,我已经在设备管理器中使用了一些USB /串行设置,并且在使用良好的“超级终端”时数据正常。 。 。所以它必须是代码中的东西。
答案 0 :(得分:2)
使用USB串行转换器,您必须设置接收超时,因为数据可以长时间位于USB设备中,Windows不知道它。实际串行端口将数据保存在16550 FIFO中,Windows驱动程序可以在其中看到它。
答案 1 :(得分:1)
大多数情况下,您希望使用SerialPort.DataReceived事件(http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx)。
这要求您手动组合数据块,因为您可以接收部分字符串,但是一旦检测到单个“记录”的边界,就可以激活处理该记录,同时让IO接收更多事件。 / p>
这允许一些不阻塞线程的异步IO,从而允许更有效地处理数据。如果它对您的具体情况有帮助我不知道,但它在过去处理数据读取问题,低速,线程池和锁定时帮助了我。