2010-07-20 198 views
0

我目前有一个嵌入式设备通过串行端口连接到PC。我在PC上接收数据时遇到问题。当我使用我的PCI串行端口卡时,我能够立即接收数据(无延迟)。当我使用USB-To-Serial插头或串口内置的主板时,我必须延迟读取数据(对于32byte数据包为40ms)。串行传输UART延迟

我可以在硬件之间找到的唯一区别是UART。 PCI卡使用16650,插头/主板使用标准16550A。 PCI卡被设置为在28个字节处中断,并且插头被设置为在14个字节处中断。

我连接在56700波特(如果这有帮助)。

延迟成为占空比的主要部分,确实增加了传输时间。 (10分钟转换与1小时转移)。

有没有人有解释为什么我必须使用插头/主板延迟?任何人都可以提出一个可能的解决方案来最小化或消除这种延迟?

+0

您是否打开了硬件流量控制?您的嵌入式设备是否使用16650? – nmichaels 2010-07-20 12:52:03

+0

否,硬件流量控制未打开。我目前只使用RX/TX和地线。嵌入式设备使用atmel atmega 128L和7.3728 MHz晶振。我认为这被认为是“16650兼容”。 Peter:是的,我可以调整主板的中断点。然而,它的范围也是1-14字节,因为它使用16550 UART(16字节FIFO缓冲区)。延迟实际上有助于在长时间传输过程中将主板连接上的不匹配错误从数百个减少到少于10个。 – 2010-07-20 13:04:51

回答

2

Linux有串行驱动程序的ASYNC_LOW_LATENCY标志可能有帮助。无论你使用的驱动程序可能有类似的东西。

但是,延迟对批量传输应该没有什么不同。它应该在转换开始时增加40毫秒,就是这样,这就是为什么司机不会首先担心的原因。如果您以该波特率和延迟执行32字节数据包,我建议重构您的传输协议以使用sliding window protocol,窗口大小大约为100个数据包。换句话说,如果您没有收到您发送100个数据包前的数据包的ACK,您只想停止传输。

+0

我将包大小从32字节增加到256字节,我只需要将延迟从40ms增加到65ms。这使我的沟通时间从1小时缩短到14分钟。 – 2010-07-20 18:06:56

0

您可能会发现不同的USB串行转换器会产生不同的结果。我们发现FTDI的与嵌入式设备交谈的效果很好。一些转换器似乎会将数据缓冲很长时间并/或将其分段。

我从来没有看到主板连接的问题 - 不知道那里发生了什么!你能改变主板串口的中断点吗?

+0

借用串行/ USB转换器。我已经看到很多整天工作的ascii数据,但高位(115,200)比特率的二进制数据损坏。 – nmichaels 2010-07-20 12:54:00

+0

我使用的USB串行转换器是使用Prolific芯片的Trendnet TU-S9。 PCI卡是Sunix品牌。 – 2010-07-20 13:14:55

0

我有一个串行到USB转换器。当我将它连接到我的分线盒并创建一个回送时,我能够在没有问题的情况下以接近1Mbps的速度发送/接收数据。串口发送可翻译成ascii数据的二进制数据。

使用.Net我将我的软件设置为在每个字节上触发一个事件(ReceivedBytesThreshold = 1),但这并不意味着它会。