硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3127|回复: 14
收起左侧

[例程下载] Modbus的串口设定问题,11bit还是10bit?

[复制链接]

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2018-9-7 14:31:33 | 显示全部楼层 |阅读模式
例程中串口这么设定的,一个停止位,没有奇偶校验。。。这么算应该是每个字节需要10bit
/* 第2步: 配置串口硬件参数 */
USART_InitStructure.USART_BaudRate = UART3_BAUD; /* 波特率 */
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART3, &USART_InitStructure);

参考modbus的文档说明:
RTU 模式每个字节 ( 11 位 ) 的格式为 :
编码系统: 8–位二进制,报文中每个8 位字节含有两个4 位十六进制字符(0–9, A–F)
每字节的bit 流:
1 起始位
8 数据位, 首先发送最低有效位
1 位作为奇偶校验
1 停止位
偶校验是要求的, 其它模式 ( 奇校验, 无校验 ) 也可以使用。 为了保证与其它产品的最大兼容性,
同时支持无校验模式是建议的。默认校验模式模式 必须为偶校验。
注 : 使用无校验要求2 个停止位。


这是怎么回事?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-9-7 14:46:55 | 显示全部楼层
这个没关系,自己用做不做串口偶校验都没关系。因为已经有CRC校验了。

如果你要外接其它设备,他们有偶校验要求,你加上就行。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2018-9-7 15:20:55 | 显示全部楼层
eric2013 发表于 2018-9-7 14:46
这个没关系,自己用做不做串口偶校验都没关系。因为已经有CRC校验了。

如果你要外接其它设备,他们有偶 ...

RTU模式的Modbus是否必须11bit?
还是说10bit也很通用?

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-9-7 15:24:11 | 显示全部楼层
caicaptain2 发表于 2018-9-7 15:20
RTU模式的Modbus是否必须11bit?
还是说10bit也很通用?

都没问题的。

如果你要外接其它设备,他们有偶校验要求,你加上就行。
回复

使用道具 举报

13

主题

56

回帖

95

积分

初级会员

积分
95
发表于 2018-9-7 15:32:52 | 显示全部楼层
数据位一般是8位,你的设备可以搞如下几个参数,
              1、参数一:设置【停止位】=1还是【停止位】=2.
              2、参数二:设置波特率
             3、参数三、设置校验位  0=无校验  1=奇校验  2= 偶校验

   总之,在实际应用中只要将你的上述参数可以根据需要修改,和对方的设备设置的相同就可以啦。

   另:由于MODBUS 协议已经有CRC校验位,因此什么偶校验还是奇校验没有多大用处,唯一的用处就在于你设备的停止位和校验位必须设置的要和对方设备的停止位和校验位相同。
我是新手,请多多关照。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2018-9-7 15:55:06 | 显示全部楼层
eric2013 发表于 2018-9-7 15:24
都没问题的。

如果你要外接其它设备,他们有偶校验要求,你加上就行。

继续接着问一下,3.5t的超时时间设置可以用systick吗? 因为,RTOS的systick周期是1ms,精度应该也够。

简单计算了以下,9600波特率时,3.5t=3.6ms,19200波特率时,3.5t=1.8ms;那么就读RTOS的时钟,串口接收到最后一个字节的2~4个tick后,判断为一帧结束。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-9-8 01:53:03 | 显示全部楼层
caicaptain2 发表于 2018-9-7 15:55
继续接着问一下,3.5t的超时时间设置可以用systick吗? 因为,RTOS的systick周期是1ms,精度应该也够。
...

不方便,因为每接收到一个1字符就要启动一个单次检测。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2018-9-10 09:01:55 | 显示全部楼层
本帖最后由 caicaptain2 于 2018-9-10 11:20 编辑
eric2013 发表于 2018-9-8 01:53
不方便,因为每接收到一个1字符就要启动一个单次检测。
学习这个例程发现,没有哪里判断字节之间1.5t的超时?
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2018-9-11 09:42:54 | 显示全部楼层
caicaptain2 发表于 2018-9-10 09:01
学习这个例程发现,没有哪里判断字节之间1.5t的超时?

经过研究,例程中可以改进一小点。
接收到每个字节后,不用重启延时设定的定时器,也不用开关它的中断。因为定时器可以直接赋值。
比如:TIM7->CNT=0;

为了满足字节之间小于1.5t的要求,可以在接收到第一字节后,把cnt赋值更改为1.5t。最后一个字节的时候才更改为3.5t
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-9-11 12:39:34 | 显示全部楼层
caicaptain2 发表于 2018-9-11 09:42
经过研究,例程中可以改进一小点。
接收到每个字节后,不用重启延时设定的定时器,也不用开关它的中断。 ...
为了满足字节之间小于1.5t的要求,可以在接收到第一字节后,把cnt赋值更改为1.5t。最后一个字节的时候才更改为3.5t


不行的,因为你不知道你什么时候接收结束。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2018-9-11 13:48:56 | 显示全部楼层
eric2013 发表于 2018-9-11 12:39
不行的,因为你不知道你什么时候接收结束。

嗯,说的是。
这个1.5t, 3.5t同时达到还很麻烦。。。
回复

使用道具 举报

13

主题

56

回帖

95

积分

初级会员

积分
95
发表于 2018-9-12 09:36:36 | 显示全部楼层
3.5字符超时时间我的做法是用TIM定时器来计时并判断,用SYSTICK不能保证同步。
我是新手,请多多关照。
回复

使用道具 举报

13

主题

56

回帖

95

积分

初级会员

积分
95
发表于 2018-9-12 10:52:06 | 显示全部楼层
我经常编写MODBUS主站程序和MODBUS从站程序,我一般用TIM1---TIM7定时器做3.5字符超时,效果不错,但是我一般没有做1.5字符超时。
我是新手,请多多关照。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2018-9-12 16:49:18 | 显示全部楼层
ba_wang_mao 发表于 2018-9-12 10:52
我经常编写MODBUS主站程序和MODBUS从站程序,我一般用TIM1---TIM7定时器做3.5字符超时,效果不错,但是我一 ...

因为大多数程序都带RTOS,而且串口通讯程序的优先级都不高。
串口发送数据帧的时候,还是容易被其他任务打断的,比如emwin的刷新。似乎很容易造成字节间的延时超过1.5t啊?大家有没有碰到过?
回复

使用道具 举报

13

主题

56

回帖

95

积分

初级会员

积分
95
发表于 2018-9-21 14:01:25 | 显示全部楼层
字节间的延时超过1.5t,那说明你的中断很多,而且很频率,当中断嵌套时无可避免会出现字节延时超过1.5t呀!

   有没有有想过这种情况下,用USART+DMA方式通信呢?
我是新手,请多多关照。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 06:13 , Processed in 0.213856 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表