电子产业一站式赋能平台

PCB联盟网

搜索
查看: 16|回复: 0
收起左侧

STM32移植freeModbus,首个数据丢失

[复制链接]
匿名  发表于 昨天 08:20 |阅读模式
另一个比较头疼的问题就是好不容易移植的差不多了,结果,数据一发,没反应!

本来想着拿过来就用的,没想到移植的难度都要赶上自己重写一个了。
没办法,不得不深入底层分析

在串口数据处理函数xMBRTUReceiveFSM中,我们可以看到,为了满足3.5个位超时的控制,在接收到第一个字节的数据时启动了定时器。

定时器中断调用xMBRTUTimerT35Expired,在这个函数里,超时后抛出一个EV_FRAME_RECEIVED事件。
modbus的数据没有帧头和帧尾,靠什么判断一个数据包接收完成了?就是靠这个定时器

波特率大于19200时,超过35*50us没有接收到数据,就认为一个数据帧接收完成,这时候就去执行校验。检验不对,此帧数据丢弃。
经过排查发现freeModebus的代码和机制是没有问题的
问题出在STM32定时器配置


在使能定时器之后,STM32立即进入了一次定时器中断,就导致触发超时,接收到的第1个字节的数据被丢弃,之后的数据都接收正常。
大坑啊
都是血泪的教训。
解决方法,网上说使能定时器之前清一下标志位,当然想搞清楚每个寄存器的标志位是干什么需要花时间。
我的处理方式:你不是首次启动会有问题吗,那我就在初始化完成后调用一次定时器使能和失能。
        vMBPortTimersEnable();
        vMBPortTimersDisable();
如果这个问题STM32不改,我建议freeModbus迁就一下他。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表