freemodbus从机调试问题

发布于 2019-06-06 10:43:40
    本帖最后由 cyz13 于 2019-6-6 10:50 编辑


不知道大家从机调试有没有遇到过下面这个问题:只能通信一次成功,然后后面的就会出现Timeout Error。见下图TZN[[J498L1N7EOE0YZ%(FD.png
msh运行后,会出现(eSndState == STATE_TX_IDLE) assertion failed at function:xMBRTUReceiveFSM, line number:229这样的错误
IHB%[8UN2E~}6{IB8G`GH1T.png

找到eSndState == STATE_TX_IDLE这句话是在mbrtu.c的229行,是在xMBRTUReceiveFSM这个函数中,
VM{MHGKD{(783F{8S]DX0OJ.png
此函数是发生接收中断时,最终调用xMBRTUReceiveFSM函数对数据进行接收;然后RT_ASSERT( eSndState == STATE_TX_IDLE );这句的意思是确保没有数据再发送了。

现在就了解到这个地步,接下来不知道该怎么分析了,还请大神指点。
下面是我的从机程序
M18D@FC)16V}JZV_P3])MKS.png9ECBE6B@0(1D3_7~P4$)MN4.png





查看更多

关注者
1
被浏览
1.4k
10 个回答
cyz13
cyz13 2019-06-06
有没有大神帮帮忙
zhangjun
zhangjun 2019-06-06
1,这个是由于发送缓冲区还有数据要发送,但是这个时候接收到了主机的数据。
2,你的modbus主机poll周期是多少?是不是主机poll周期太短。
cyz13
cyz13 2019-06-06
zhangjun 发表于 2019-6-6 16:38
1,这个是由于发送缓冲区还有数据要发送,但是这个时候接收到了主机的数据。
2,你的modbus主机poll周期是 ...


我现在把这句话屏蔽了RT_ASSERT( eSndState == STATE_TX_IDLE );
一切ok
cyz13
cyz13 2019-06-06
换成串口二的话都没有问题,主要是因为我的串口三是通过TD321DCAN这个CAN模块进行的485通信。现在还不知道为啥把这句话屏蔽了RT_ASSERT( eSndState == STATE_TX_IDLE );收发就正常了
chudy
chudy 2019-08-05
请问找到原因了吗 ?

我也碰到了这个问题,屏蔽RT_ASSERT( eSndState == STATE_TX_IDLE )就没问题了
cyz13
cyz13 2019-08-14
chudy 发表于 2019-8-5 13:39
请问找到原因了吗 ?

我也碰到了这个问题,屏蔽RT_ASSERT( eSndState == STATE_TX_IDLE )就没问题了 ...


是的 ,我也发现了。但是为啥屏蔽了就没事,还是没搞明白。
hsrock
hsrock 2019-08-20
感觉有点像UART DMA模式里面的接收包分割,
kid
kid 2020-09-17

同款问题,看来我也要屏蔽这一行代码, 顺便吐槽一下, freemodbus 的主机代码实在太复杂繁琐了, 动不动就无消息停止发送, 又有数不清的状态表, 函数名字很不友好, 主机代码我已经放弃使用freemodbus 了

honghong1999
honghong1999 2020-11-21
  • 应该是 t3.5的定时,不够精准。
  • 查看 porttimer.c 中,对定时器的处理,最好使用 stm32定时器实现定时,rtthread 软件定时器好像无法实现 us 级的定时。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览