linux 高速字元偵測 rs232

linux 高速字元偵測 rs232

我必須用 C 編寫程式碼來偵測 linux 上 rs232 線路內的字元間時間。字元間檢測時間可能為 1 毫秒。所以我需要一些東西來快速為傳入的字元添加時間戳。當我說非常快時不到1ms。目標是檢測線路上幀的結束和新幀的開始。

我不要求編碼解決方案,我只是想要一個初步的幫助來知道我必須採取什麼路徑:是否可以在 Linux 上執行此操作?我必須修改驅動程式才能達到這種時間?或者使用者空間上的某些東西可以做到這一點(我不這麼認為)。

答案1

這是板載 UART 還是 USB 轉接器?首先,我將修改串行驅動程式中斷例程以將資料與時間戳一起存儲,將帶有時間戳的資料傳遞到用戶空間,並讓用戶空間對其進行排序。雖然 Linux 不是即時的,但我希望它能夠在不到 1 毫秒的時間內應答所有中斷,所以這應該就足夠了。

對於 USB 加密狗,usbmon已經提供了以微秒為單位的時間戳,因此我想應該能夠usbmon與普通的串行 USB 驅動程式一起使用,並修改串行 USB 驅動程式以使這些時間戳可存取。

答案2

我必須用 C 編寫程式碼來偵測 linux 上 rs232 線路內的字元間時間...

您發布了一個XY問題

我想這樣做是因為超過 1 毫秒的靜默意味著一幀的結束和新幀的開始。

(順便說一句,在RS-232等非同步串行通訊中,不合格的使用“框架”是模稜兩可的,因為每個角色都是有框架的。 EG 當 UART 報告「幀錯誤」時,字元(可能)會遺失。想必您實際上指的是資料包或訊息單元。

您的附加評論最終揭示了需要解決的實際 X 問題。
由於實際問題是偵測訊息間隙,因此您最初關於 Y 的問題不僅難以在軟體中準確實現,而且甚至不是 X 問題的可行解決方案。

任何涉及透過軟體「測量」接收的字元之間的時間間隔來檢測訊息間間隙的解決方案都是有缺陷的解決方案。這種方法對於退化情況失敗:
當訊息的最後一個字元到達並且如果沒有更多的字元(一段時間),那麼最後收到的訊息是停滯無限期地等待下一個字元(下一個字的第一個位元組),以便可以計算時間差。
只要沒有收到“下一個字元”,就無法確定“訊息結束”,並且最後一個有效訊息已完成但未處理。

正確的解決方案是使用可以測量字元何時被接收或何時未被接收的硬體。一些 Atmel USART 有接收器逾時檢測訊息間隙的功能。

可能的軟體解決方案需要一個(高解析度)週期性計時器,U(S)ART 驅動程式將使用該計時器來計算接收到的字元之間的時間間隔。使用 PIO 而不是 DMA,驅動程式必須在接收到每個字元時重置間隔計數。當計數超過閾值(即計數*interval_time > inter_message_gap_time)時,則接收方已經靜默太久,指示訊息間間隙。

相關內容