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

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

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

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

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

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

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

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

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


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

本帖子中包含更多資源

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

x
回復(fù)

使用道具

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

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

本版積分規(guī)則


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