Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
freemodbus
Freemodbus主机模式测试例程,波特率为9600时接收不完整?
发布于 2021-05-24 09:53:58 浏览:2217
订阅该版
RT-Thread 下Freemodbus v1.6版本主机模式测试例程,波特率默认为115200时接收数据没问题,但为9600时接收不完整,将 RT_TICK_PER_SECOND 改为1000,结果没有变化?
查看更多
cxhxy12345
2021-05-24
这家伙很懒,什么也没写!
FreeModbus的不同波特率下有些高,有些低都出现接受错误,如果只是简单地设置RT_TICK_PER_SECOND,按照网上的经验的确可以解决一些问题,但根本的原因可能还是不了解,下面是以前看过的资料的记录,可以给你做个借鉴,阅读希望对你有帮助。 Freemodbus需要配合一个定时器使用,这是因为它是通过定时器超时来判断Modbus传输过程结束的,在Modbus协议中,以RTU模式为例,报文帧由时长至少为3.5个字符的空闲间隔区分,这个区间被称为t3.5,注意,这里是“至少”不是至多,也就是通信之间也不希望对方发的过快,所以在Freemodbus中对定时器就采用了类似于四舍五入的办法,比3.5个字符略微多一点的溢出时间。 ![image.png](https://oss-club.rt-thread.org/uploads/20210524/bad4ce8eb3ed481c20da8658e0b99645.png) 一般的串口通信中,发送一个字符需要:1位起始位+8位数据位+1位校验位(可选)+1位停止位,总共11位,所以3.5个字符时间就是 3.5*11 = 38.5位,注意如果没有校验位就按10位计算。假设波特率是9600bps,那么传输1位的时间大约就是 1000/9600 = 0.10416667(ms) 这样,3.5个字符的时间就是 38.5位,也就是大约 4.01ms,这也就是定时器需要中断的时间,可以比这个时间略大一点点,所以Freemodus做了一个 特别巧妙的公式变量: usTimerT35_50us = ( 7UL * 220000UL ) / ( 2UL * ulBaudRate ) 这里,usTimerT35_50us表示 3.5个字符,对应 50us的倍数,以波特率9600计算,刚刚理论计算为4ms左右,4000us/50us = 80 那么这个公式的计算结果是:usTimerT35_50us = ( 7UL * 220000UL ) / ( 2UL * ulBaudRate ) = 7*220000/(2*9600) = 80.2,这个值是无符号整型,所以就是80 那么算出 80 以后怎么用呢,80代表的是80个 50us,为了移植方便,所以都用 50us作为基准,在具体使用的时候,刚说到要比t3.5稍微大点,大太多,反应慢,容易出错,给了一种方法: usTimeoutMS = ( usTim1Timerout50us + 10 ) / 20; 其中 usTimeoutMS 就是要延时的ms数,还是以9600为例,那么定时器溢出时间为 (80+10)/20 = 4ms,然后移植者再根据自己的处理器,设置4ms的定时器溢出即可。 好了,这样就可以到移植代码中找到定时器设置函数做相关的配置。
5
个回答
默认排序
按发布时间排序
zhkag
2021-05-24
这家伙很懒,什么也没写!
这里有同样的问题,[freemodbus 软件包主机有bug](https://club.rt-thread.org/ask/question/429835.html) 建议你看看,试试能不能解决
flashman2002
2021-05-24
这家伙很懒,什么也没写!
能用高速速率就推荐使用高速的。估计低速时软件有bug。
鸿蕊瑞琳
2021-05-26
这家伙很懒,什么也没写!
问题已解决,特别是此接口定时需要配合更改,,,vMBMasterPortTimersT35Enable()
技术宅
2023-08-01
这家伙很懒,什么也没写!
```c void vMBMasterPortTimersT35Enable() { // rt_tick_t timer_tick = (50 * usT35TimeOut50us) // / (1000 * 1000 / RT_TICK_PER_SECOND) + 1; //eb 断帧时间延长5倍, 9600bps下,大约为4ms*5 = 20ms rt_tick_t timer_tick = ((50 * usT35TimeOut50us) / (1000 * 1000 / RT_TICK_PER_SECOND) + 1) *5; /* Set current timer mode, don't change it.*/ vMBMasterSetCurTimerMode(MB_TMODE_T35); rt_timer_control(&timer, RT_TIMER_CTRL_SET_TIME, &timer_tick); rt_timer_start(&timer); } ```
撰写答案
登录
注册新账号
关注者
0
被浏览
2.2k
关于作者
鸿蕊瑞琳
这家伙很懒,什么也没写!
提问
7
回答
2
被采纳
0
关注TA
发私信
相关问题
1
FREEMODBUS的设置问题
2
freemodbus tcp
3
freemodbus,写保持寄存器返回值一直是3,但是正确写入 ?
4
FreeModbus 从机该如何更新数据,菜鸟的不解.
5
RT thread freemobus tcp通讯问题
6
freemodbus主机读取从机保持寄存器命令后多两个0
7
freemodbus接收CRC校验疑问
8
freemodbus主机不通
9
freemodbus的主机任何指令都timeout
10
freemodbus 软件包主机有bug
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RTduino物联网应用零基础入门
2
TinyUSB Demo运行教程
3
RT-Thread学习大礼包一键带走!
4
freemodbus从机调试说明
5
【1024】瑞萨 RA 系列 BSP 制作与适配最新版本的 Keil 、 RSC、固件,较新的 FSP
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
cubemx
PWM
flash
packages_软件包
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
C++_cpp
at_device
本月问答贡献
张世争
8
个答案
2
次被采纳
用户名由3_15位
10
个答案
1
次被采纳
KunYi
4
个答案
1
次被采纳
踩姑娘的小蘑菇
2
个答案
1
次被采纳
bernard
1
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
4
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部