電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 28|回復(fù): 0
收起左側(cè)

STM32移植freeModbus,首個數(shù)據(jù)丟失

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
匿名  發(fā)表于 5 天前 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
另一個比較頭疼的問題就是好不容易移植的差不多了,結(jié)果,數(shù)據(jù)一發(fā),沒反應(yīng)!

本來想著拿過來就用的,沒想到移植的難度都要趕上自己重寫一個了。
沒辦法,不得不深入底層分析

在串口數(shù)據(jù)處理函數(shù)xMBRTUReceiveFSM中,我們可以看到,為了滿足3.5個位超時的控制,在接收到第一個字節(jié)的數(shù)據(jù)時啟動了定時器。

定時器中斷調(diào)用xMBRTUTimerT35Expired,在這個函數(shù)里,超時后拋出一個EV_FRAME_RECEIVED事件。
modbus的數(shù)據(jù)沒有幀頭和幀尾,靠什么判斷一個數(shù)據(jù)包接收完成了?就是靠這個定時器

波特率大于19200時,超過35*50us沒有接收到數(shù)據(jù),就認(rèn)為一個數(shù)據(jù)幀接收完成,這時候就去執(zhí)行校驗(yàn)。檢驗(yàn)不對,此幀數(shù)據(jù)丟棄。
經(jīng)過排查發(fā)現(xiàn)freeModebus的代碼和機(jī)制是沒有問題的
問題出在STM32定時器配置


在使能定時器之后,STM32立即進(jìn)入了一次定時器中斷,就導(dǎo)致觸發(fā)超時,接收到的第1個字節(jié)的數(shù)據(jù)被丟棄,之后的數(shù)據(jù)都接收正常。
大坑啊
都是血淚的教訓(xùn)。
解決方法,網(wǎng)上說使能定時器之前清一下標(biāo)志位,當(dāng)然想搞清楚每個寄存器的標(biāo)志位是干什么需要花時間。
我的處理方式:你不是首次啟動會有問題嗎,那我就在初始化完成后調(diào)用一次定時器使能和失能。
        vMBPortTimersEnable();
        vMBPortTimersDisable();
如果這個問題STM32不改,我建議freeModbus遷就一下他。

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有賬號?立即注冊

x
回復(fù)

使用道具

發(fā)表回復(fù)

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

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表