選擇通訊模式
Matlab 支援與串列埠的同步和非同步通訊。選擇正確的通訊模式很重要。選擇取決於:
- 你與之溝通的工具如何表現。
- 除了管理串列埠之外,你的主程式(或 GUI)還必須執行哪些其他功能。
我將定義 3 種不同的案例來說明,從最簡單到最苛刻。對於 3 個示例,我連線的儀器是帶有傾角儀的電路板,它可以在我將在下面描述的 3 種模式下工作。
模式 1:同步(主/從)
這種模式是最簡單的。它對應於 PC 是主裝置而儀器是從裝置的情況。儀器不會自己向串列埠傳送任何內容,只會在被主人(PC,你的程式)詢問問題/命令後回覆答案。例如:
- PC 傳送命令:立即給我測量
- 儀器接收命令,進行測量,然後將測量值傳送回序列線:“測斜儀值為 XXX”。
要麼
- PC 傳送命令:“從模式 X 切換到模式 Y”
- 儀器接收命令,執行它,然後將確認訊息傳送回序列線:執行命令(或“未執行命令 ”)。這通常稱為 ACK / NACK 應答(用於“確認(d)”/未確認)。
摘要: 在此模式下,儀器( 從站 )僅在 PC( 主站 ) 詢問後立即將資料傳送到序列線路 **
http://i.stack.imgur.com/t1XyZ.gif
模式 2:非同步
現在假設我開始使用我的樂器,但它不僅僅是一個愚蠢的感測器。它會不斷監視它自身的傾斜度,只要它是垂直的(在公差範圍內,比方說+/- 15 度),它就會保持沉默。如果裝置傾斜超過 15 度並接近水平,則會向序列線路傳送警報訊息,然後立即讀取傾斜度。只要傾斜度高於閾值,它就會繼續每 5 秒傳送一次傾斜讀數。
如果你的主程式(或 GUI)不斷等待到達序列線路上的訊息,那麼它可以做得很好……但在此期間它不能做任何其他事情。如果主程式是 GUI,那麼讓 GUI 看起來凍結是非常令人沮喪的,因為它不接受來自使用者的任何輸入。從本質上講,它成了slave,而樂器就是大師。除非你有一種從儀器控制 GUI 的奇特方式,否則這是要避免的。幸運的是,非同步通訊模式將讓你:
- 定義一個單獨的函式,告訴你的程式在收到訊息時要做什麼
- 將此功能保留在一個角落,只有在訊息到達序列線路時才會呼叫並執行。其餘的時間 GUI 可以執行它必須執行的任何其他程式碼。
摘要: 在此模式下,儀器可以隨時(但不一定是所有時間) 向序列線路傳送訊息。PC 不會永久等待訊息處理。允許執行任何其他程式碼。只有當訊息到達時,它才會啟用一個函式,然後該函式將讀取並處理此訊息。
http://i.stack.imgur.com/WzhGZ.gif
模式 3:流媒體( 實時 )
現在讓我們釋放我的樂器的全部力量。我把它放在一個模式,它將不斷髮送測量到序列線。我的程式想要接收這些資料包並在曲線或數字顯示器上顯示。如果它只是每隔 5s 傳送一個值,沒問題,請保持上述模式。但是我的儀器在完全打擊時會以 1000Hz 的頻率向序列線傳送一個資料點,即它每隔一毫秒傳送一個新值。如果我保持非同步模式如上所述,存在一個高風險(實際上是保證確定性),我們定義的用於處理每個新資料包的特殊函式將花費超過 1ms 來執行(如果要繪製或顯示該值,圖形函式非常慢,不是甚至考慮過濾或 FFT 訊號)。這意味著該函式將開始執行,但在它完成之前,新資料包將到達並再次觸發該函式。第二個函式放在一個佇列中執行,並且只在第一個函式完成時才會啟動…但此時會有一些新的資料包到達並且每個資料庫都放置了一個在佇列中執行的函式。你可以快速預見結果:當我繪製第 5 點時,我已經有數百個等待繪製… gui 減速,最終凍結,堆疊增長,緩衝區填滿,直到某事給出。最終你會得到一個完全凍結的程式,或者只是一個崩潰的程式。
為了克服這個問題,我們將進一步斷開 PC 和儀器之間的同步連結。我們將讓儀器按照自己的節奏傳送資料,而不會在每個資料包到達時立即觸發功能。串列埠緩衝區只會累積收到的資料包。PC 只會按照它可以管理的速度收集緩衝區中的資料(定期間隔,在 PC 端設定),用它做一些事情(當緩衝區被儀器重新填充時),然後收集一批新的來自緩衝區的資料……等等。
摘要: 在此模式下,儀器連續傳送資料,這些資料由串列埠緩衝區收集。PC 會定期從緩衝區收集資料並對其進行處理。PC 和儀器之間沒有硬同步連結。兩者都按照自己的時間執行任務。