找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3152|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32復(fù)位后遙控數(shù)據(jù)出錯的解決方法

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:98924 發(fā)表于 2015-12-9 01:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
DR16接收機(jī)的Dbus取反后接到STM32串口的RX腳,使用官方遙控器控制協(xié)議V1.4.pdf 中提供的參考代碼接收數(shù)據(jù),可以正常接收。在DMA中斷里面加上IO翻轉(zhuǎn)后,可以通過邏輯測試儀看到如下波形:
如上圖所示,18個字節(jié)發(fā)送約2ms多,周期約14ms(和手冊里的7ms有出入),18個字節(jié)接收完畢后進(jìn)入DMA中斷,解析各個字節(jié)的信息。另一個串口打印出的解析后的遙控數(shù)據(jù)如下(四個通道搖桿均在中位,S1、S2中位,未接入鍵鼠信息):
但經(jīng)過測試,在接收機(jī)一直上電的情況下,復(fù)位STM32,有時會出現(xiàn)如下圖的波形,DMA在18個字節(jié)未傳輸完成的時候就中斷了:
另一個串口打印出的解析后的遙控數(shù)據(jù)如下(四個通道搖桿均在中位,S1、S2中位,未接入鍵鼠信息):
究其原因,是復(fù)位并配置好串口后,串口收到的第一個字節(jié)有可能不是一幀(18個字節(jié))中的第一個字節(jié),而DMA只管18個字節(jié)中斷一次,所以就會出錯。出錯的概率大約為2/14,14%。 解決的方法就是讓串口接收到的第一個字節(jié)是一幀中的第一個字節(jié),可以算好時間后讓接收機(jī)和STM32同時上電,保證接收數(shù)據(jù)正確。但在調(diào)試過程中,難免會經(jīng)常復(fù)位,所以最好能在代碼里面解決這個問題。
由于Dbus的數(shù)據(jù)中不包含幀頭或幀尾之類的標(biāo)識信息,所以不能通過識別標(biāo)識信息的方法來解決這個問題。筆者解決這個問題的思路大致為:首先開啟串口的接收中斷,當(dāng)串口收到第一個字節(jié)的時候進(jìn)入中斷服務(wù)函數(shù),在中斷服務(wù)函數(shù)里面重置串口(重置后不會再進(jìn)入串口接收中斷),延時3ms,延時結(jié)束的時候肯定就是在兩幀信息的間隔里面,然后再配置并開啟DMA,這樣DMA傳輸?shù)牡谝粋字節(jié)必然就是一幀的首字節(jié)。經(jīng)筆者的測試,這種方法效果良好:
如上圖所示,就算串口收到的第一個字節(jié)不是幀首字節(jié),DMA也能正確的接收后續(xù)的數(shù)據(jù)。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表