2010-07-20 164 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),但這並不意味着它會。