回覆列表
  • 1 # 使用者6513185060121

    沒問題,我的一個專案用的就是軟體模擬的。當時串列埠少了(專案需要三個串列埠,少了一個),原先的硬體採用的是切換的方法,但是這樣一來就不能同時處理兩個串列埠資料,限制太大了。所以後來考慮換成模擬的,這樣就能同時處理兩個串列埠資料。

    當時使用的是stm8,一個串列埠波特率9600,資料量不多,一個串列埠波特率115200,資料量比較大,所以選擇模擬9600的波特率裡理論上還是沒問題的。

    之前一直用的stm32,對stm8不熟悉,所以花了一天寫了程式碼之後,發現開始的時候在沒有串列埠資料接收的情況下也會進入中斷,最後才知道stm8關中斷的問題。除錯過程中最大的bug就是這個了。

    現在說說具體的實現細節問題。首先就是設定外部中斷,這個中斷只在接收的那一刻有用,是用來啟動定時器的,定時器設定的中斷頻率是波特率的兩倍,這樣就能在定時器中斷處理程式中對每一位資料的中間位置時刻進行電平判斷,接收完八位資料(注意起始位和停止位這兩個特殊位,可能還有校驗位)就關閉定時器和開起外部中斷,這樣就可以繼續接收下一個位元組資料了。為什麼不接收完全部資料之後再關閉定時器,開啟外部中斷呢?這樣做有兩個好處:第一,邏輯簡單,不管你資料幀是多大的都可以處理,第二,誤差不會累積,如果你接收完全部的資料之後才操作,那麼一旦你的程式時序不是特別好,那麼資料量多的時候,很可能會累計誤差,導致判斷錯誤。所以我覺得采用這種方式還是不錯的。

    最終的測試效果就是接收資料正確無誤,執行良好,當然你得保證你的兩個中斷優先順序是最高的才行的。另外因為專案只需要結束資料,所以就沒研究如何傳送資料的問題,但道理是一樣的。

    以上,僅供參考。

  • 中秋節和大豐收的關聯?
  • 造夢西遊3豬八戒技能搭配?