簡體   English   中英

從Windows上的串行端口讀取的時間

[英]timing of reads from serial port on windows

我正在嘗試通過Windows(xp)計算機上的串行端口實現協議。 問題在於協議中的消息同步是通過消息中的間隙來完成的,即,發送字節之間的x毫秒間隙表示一條新消息。 現在,我不知道是否有可能准確地檢測出這一差距。
我正在使用win32 / serport.h api讀取我們服務器的許多線程之一。 來自串行端口的數據被緩沖,因此,如果我們的軟件中有足夠的(並且將有足夠的)延遲,那么我將以一個讀取序列從端口緩沖區中獲得多個消息。

有沒有一種方法可以讀取串行端口,以便在接收到特定字節時檢測到間隙?

如果要對Windows串行端口進行更多控制,則必須編寫自己的驅動程序。

我看到的問題是Windows可能正在執行其他任務或程序(例如病毒檢查),這將導致您的應用程序出現計時問題。 您的應用程序將不知道何時將其替換為另一個應用程序。

如果可能,我建議您在程序時間戳記最后一條消息的末尾。 當下一條消息到達時,將使用另一個時間戳。 時間戳之間的差異可能有助於檢測新消息。

我強烈建議更改協議,以使計時不是一個因素。

過去我不得不做類似的事情。 盡管所討論的協議未使用任何定界符字節,但它確實在某些位置具有crc和一些固定值字節,因此我可以推測性地解碼消息以確定它是否是完整的單個消息。

當我遇到這些沒有上下文信息的協議時,我總是感到驚訝。

查找crc字段,長度字段,帶有預期消息長度的相應指示的類型字段或具有可預測值的任何其他固定偏移量字段,這些字段可以幫助您確定何時有一條完整的消息。

另一種方法可能是使用CreateFile,ReadFile和WriteFile API函數。 您可以使用SetCommTimeouts函數更改某些設置,該功能允許您在遇到特定時間間隔時暫停I / O操作。

加上一些推測性解碼可能是最好的選擇。

奇怪的是,沒有任何一種數據格式可以描述設備的“消息”。 我使用過的每個串行端口設備都有某種形式的標題,用於描述其傳輸的數據。

只是把它扔在那里,但是您可以使用Win32異步ReadFileEx()和WriteFileEx()系統調用嗎? 它們使您可以附加回調函數,然后您就可以在回調中管理計時器。 但是,計時器只會為您提供大概的估算。

如果您需要編寫自己的驅動程序,Windows驅動程序工具包提供了一個示例,該示例顯示了如何編寫串行端口驅動程序。 我無法想象您將能夠覆蓋Windows串行端口總線驅動程序(直接控制Windows計算機上的串行端口的驅動程序),但是您可能能夠編寫位於總線頂部的驅動程序驅動程序。

我是這么想的。 所有人都隨着網絡成長,但我卻沒有,盡管我剛出生時就在場。 我猜一個字節是1(SOH)還是2(STX)? IMVEO就足夠了。 您只需要跳出框框思考。

您收到message_delimiter,后跟4(作為長度),然后是4個字節的數據。 有效消息不是這6個字節。

    message_delimiter - 1 byte
    4 - length - 1 byte
    (4 data bytes) - 4 bytes

有效消息始終受message_delimiter限制,因此看起來像

    message_delimiter - 1 byte
    4 - length - 1 bytes
    (4 data bytes) - 4 bytes
    message_delimiter - 1 byte

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM