1. 程式人生 > >串列埠除錯小結

串列埠除錯小結

       這個專案是將藍芽模組與NFC模組整合在一起,做一個demo。兩個模組之間使用串列埠通訊,兩個模組上的mcu均為STM32系列,NFC模組上還有兩個串列埠,一個作為log,一個作為AT通道,與上位機通訊。

       之前由於NFC模組與上位機的串列埠通訊,以及log都調通,所以這次只需要將與藍芽模組的串列埠通訊調通即可。硬體連線完畢後,就開始除錯。當此串列埠初始化後,通過它向藍芽模組通過查詢的方式發資料很快就調通了。接下來就是要能接受藍芽模組發過來的資料,採用中斷方式。AT串列埠的中斷優先順序為15,如果這個串列埠的優先順序設定為相同的值,發現中斷處理函式不會被觸發,於是將優先順序改為14。這樣,藍芽發過來的資料就被中斷函式處理了。接下來,要把接收到的藍芽資料解析成一幀一幀的資料供應用層解析。當藍芽模組與其他的藍芽模組建立連線時,會發如下資料:

       0D 0A RING 0D 0A 0D 0A CONNECT 0D 0A,即2幀資料。中斷一次處理一個字元,當檢測到接收的位元組為0A,並且之前的位元組為0D,並且不是幀開始的時候,認為一幀資料接收完成,將其值從另一個串列埠打印出來。繼續接收下一幀。結果第一幀資料能完整的顯示出來,而第二幀資料丟了很多資料,包括分隔符(0D 0A)僅5個位元組。接收緩衝區也開得足夠大不至於溢位。百思不得其解。於是先不解析資料,看是否能將資料完整的接收下來,連續的接收到的字元儲存在緩衝區,結果所有的資料都能接收(接收一個,就列印一個)。又通過saleae analysizer,抓取串列埠線上的資料,發現也是ok的。那就是解析的地方出了問題。嘗試了很多方法,都失敗。最後懷疑是不是解析完一幀資料,列印其值時花費了太多的cpu,導致了後面的資料丟失了。於是將列印幀內容去掉,改為將幀的內容通過訊息發到另外一個task,問題就解決了。果然是列印幀值耗時太多,才導致了後面會丟失資料。因此,在中斷裡,儘量少做大量I/O的操作。其次,藍芽發的兩幀資料時連續發出來的,中間沒有間隔與停頓所以才導致了丟包。

      總的來說,這個專案除錯還是蠻順利的。以後一定要進一步熟悉藍芽模組。