只需一步,快速開始
熱門: 51單片機 | 24小時必答區 | 單片機教程 | 單片機DIY制作 | STM32 | Cortex M3 | 模數電子 | 電子DIY制作 | 音響/功放 | 拆機樂園 | Arduino | 嵌入式OS | 程序設計
如上圖所示,18個字節發送約2ms多,周期約14ms(和手冊里的7ms有出入),18個字節接收完畢后進入DMA中斷,解析各個字節的信息。另一個串口打印出的解析后的遙控數據如下(四個通道搖桿均在中位,S1、S2中位,未接入鍵鼠信息):
但經過測試,在接收機一直上電的情況下,復位STM32,有時會出現如下圖的波形,DMA在18個字節未傳輸完成的時候就中斷了:
另一個串口打印出的解析后的遙控數據如下(四個通道搖桿均在中位,S1、S2中位,未接入鍵鼠信息):
究其原因,是復位并配置好串口后,串口收到的第一個字節有可能不是一幀(18個字節)中的第一個字節,而DMA只管18個字節中斷一次,所以就會出錯。出錯的概率大約為2/14,14%。 解決的方法就是讓串口接收到的第一個字節是一幀中的第一個字節,可以算好時間后讓接收機和STM32同時上電,保證接收數據正確。但在調試過程中,難免會經常復位,所以最好能在代碼里面解決這個問題。 由于Dbus的數據中不包含幀頭或幀尾之類的標識信息,所以不能通過識別標識信息的方法來解決這個問題。筆者解決這個問題的思路大致為:首先開啟串口的接收中斷,當串口收到第一個字節的時候進入中斷服務函數,在中斷服務函數里面重置串口(重置后不會再進入串口接收中斷),延時3ms,延時結束的時候肯定就是在兩幀信息的間隔里面,然后再配置并開啟DMA,這樣DMA傳輸的第一個字節必然就是一幀的首字節。經筆者的測試,這種方法效果良好:
如上圖所示,就算串口收到的第一個字節不是幀首字節,DMA也能正確的接收后續的數據。
使用道具 舉報
本版積分規則 發表回復 回帖后跳轉到最后一頁
手機版|小黑屋|51黑電子論壇 | 管理員QQ:125739409;技術交流QQ群281945664
Powered by 單片機教程網