硬汉嵌入式论坛

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

请教关于串口停止位设置1位和2位的通讯问题

[复制链接]

12

主题

141

回帖

177

积分

初级会员

积分
177
发表于 2022-10-20 17:07:56 | 显示全部楼层 |阅读模式
1、单片机串口设置2位停止位,串口工具设置为2位时,能够互相通讯;设置为1位时,不能互相通讯,因为单片机判断到串口工具发送只有1位停止位,会接收不到,这个现象应该是正常的。
2、单片机串口设置1位停止位,不管串口工具设置为1位还是2位都能正常通讯,这就有点不正常。首先对于单片机来说串口工具不管设置为1位还是2位发送的数据应该都能正常接收,因为单片机只要能判断到1位就行,但单片机回的是1位停止位的,我用示波器看了波形确定字节之间就是1位停止位,我认为串口工具设置为2位停止位时而只判断到1位停止位,不应该判帧异常吗,测试了3个串口工具现象是一样的。
一句话总结就是,相当于单片机这头接收是做了停止位的判断,但串口工具设置的停止位1位还是2位对它接收数据是没有影响的。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2022-10-21 00:52:39 | 显示全部楼层
这里以我们H7-TOOL为例的串口助手为例进行说明,这个底层就是H750的1bit,2bit停止位配置。
测试波特率使用常用的115200.
串口助手1bit + 单片机1bit
串口助手1bit + 单片机2bit
串口助手2bit + 单片机1bit
串口助手2bit + 单片机2bit

四种情况全部正常。
image.png

为什么都正常,这里就有个关键问题,就是串口16倍过采样和8倍过采样。

这个截图是以起始bit为例,只要对应位置有几个有效值即可,不需要每个值都是正确的。
image.png





回复

使用道具 举报

12

主题

141

回帖

177

积分

初级会员

积分
177
 楼主| 发表于 2022-10-21 07:27:41 | 显示全部楼层
本帖最后由 gnail092 于 2022-10-21 08:30 编辑
eric2013 发表于 2022-10-21 00:52
这里以我们H7-TOOL为例的串口助手为例进行说明,这个底层就是H750的1bit,2bit停止位配置。
测试波特率使 ...

你这个说的是对一个bit的采样方式吧,如果接收这边停止位设置为2bit,对接收来说就需要连续检测到2个bit的停止位才行,如果发送过来的数据都是是1位停止位的话,接收这边去采样第2个停止位时对应的就是下一字节的数据的起始位了,这样不就判断异常了吗。
而且实际工业上场合确实存在有2位停止位和1位停止位之间不同互相通讯的问题,1位停止位的主机是读取不了2位停止位的设备的数据的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2022-10-21 15:02:47 | 显示全部楼层
gnail092 发表于 2022-10-21 07:27
你这个说的是对一个bit的采样方式吧,如果接收这边停止位设置为2bit,对接收来说就需要连续检测到2个bit ...

我认为这句不太全面,因为每个数据之间不是严格的连续(或者说像STM32这种对停止位有特别的处理机制),所以出现了我二楼的测试都正常。
你可以这样测试,找两个STM32板子的串口测试下看看。

接收这边去采样第2个停止位时对应的就是下一字节的数据的起始位了

串口起始bit是低电平,而停止bit是高电平。
image.png


工业应用,modbus不使用奇偶校验就是强制2bit,所以这种场景确实很多。






回复

使用道具 举报

12

主题

141

回帖

177

积分

初级会员

积分
177
 楼主| 发表于 2022-10-21 15:58:48 | 显示全部楼层
本帖最后由 gnail092 于 2022-10-21 16:23 编辑
eric2013 发表于 2022-10-21 15:02
我认为这句不太全面,因为每个数据之间不是严格的连续(或者说像STM32这种对停止位有特别的处理机制), ...

两个STM32之间通讯没测过,但我分别测了STM32和GD32的现象不一样,单片机设置为2位停止位,串口工具设置为1位时,测试结果是STM32可以通讯,GD32无法通讯,附件截图是STM32手册上说明的,这个意思应该就是设置为2个停止位也只是检测1个停止位就可以了。而GD芯片我也问过FAE,回复是要检测第二个停止位的,只接受到1位就会判断帧错误,所以我用GD32测确实无法通讯。
微信图片_20221021111227.png
回复

使用道具 举报

12

主题

141

回帖

177

积分

初级会员

积分
177
 楼主| 发表于 2022-10-21 16:11:56 | 显示全部楼层
我波形是测过的,串口工具设置为1位和2位,或者单片机设置为1位或2位,字节之间的停止位位数确实是如设置的那样,下面两张图分别是设置为2位和1位停止位的抓取的波形,可以看到字节之间的停止位数就是跟所设置的停止位一样。
微信图片_20221021160847.png 微信图片_20221021160731.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2022-10-21 16:25:03 | 显示全部楼层
gnail092 发表于 2022-10-21 15:58
两个STM32之间通讯没测过,但STM32和GD32的现象不一样,单片机设置为2位停止位,串口工具设置为1位时,测 ...

对,我认为就是这样的,STM32有可能检测到1个后,如果后面紧跟起始位,是可以正常识别的。

我二楼的测试,其实就是两个STM32的不同停止bit测试。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2022-10-21 16:25:30 | 显示全部楼层
gnail092 发表于 2022-10-21 16:11
我波形是测过的,串口工具设置为1位和2位,或者单片机设置为1位或2位,字节之间的停止位位数确实是如设置的 ...

这个我也测试了,两个字节数据是紧挨着的。
回复

使用道具 举报

75

主题

685

回帖

910

积分

金牌会员

积分
910
发表于 2022-10-21 22:07:18 | 显示全部楼层
本帖最后由 庄永 于 2022-10-21 22:10 编辑

试一下0xAA
回复

使用道具 举报

3

主题

336

回帖

345

积分

高级会员

积分
345
发表于 2022-10-22 09:44:49 | 显示全部楼层
看了下内容,感觉你们俩不在一个频道。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2022-10-22 11:41:16 | 显示全部楼层
精髓,细节了。

image.png
image.png
回复

使用道具 举报

12

主题

141

回帖

177

积分

初级会员

积分
177
 楼主| 发表于 2022-10-22 19:19:04 | 显示全部楼层

你这个就是我5楼上传的截图,STM32手册上提到的。可能不同MCU处理不一样,GD的确实需要匹配2位停止位的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2022-10-23 13:22:45 | 显示全部楼层
gnail092 发表于 2022-10-22 19:19
你这个就是我5楼上传的截图,STM32手册上提到的。可能不同MCU处理不一样,GD的确实需要匹配2位停止位的。 ...

对,周末给大家分享下这个问题,非常赞的细节问题。
回复

使用道具 举报

6

主题

76

回帖

94

积分

初级会员

积分
94
发表于 2023-8-26 22:17:53 | 显示全部楼层
通信中设置为2bit停止位的目的是:不同处理能力的MCU(CPU)之间协调通信中的“字节与字节”的间隔(准确的说是上一个Stop与下一个Start的间隔)。接收处理中,处理能力差的处理本次的”字节“时间较长,需要等到2个Stop位完整传输之后才来及重启下一字节的接收;处理能力强的只要等到了1个Stop,立马处理,立马重启下一字节的接收,是不是2个Stop位无所谓了。  这个只是限制了最快的情况(字节与字节之间的最短时间),在应用中(或者说上层通信协议中)还应该规定最慢的情况(字节与字节之间的最长时间)。当然,更上一层,帧与帧之间也应该做类似的规定,以及实现中正真做到,才能做到基本完整的通信协议(离健壮就更近了一步)。
回复

使用道具 举报

6

主题

76

回帖

94

积分

初级会员

积分
94
发表于 2023-8-26 22:24:09 | 显示全部楼层
上面图中STM32的UART的16倍/8倍过采样分别用在什么情况下,还有讲究的,以及STM32如何实现的小数分频。理解了这些,对于实现软件UART是有帮助的。
回复

使用道具 举报

12

主题

141

回帖

177

积分

初级会员

积分
177
 楼主| 发表于 2023-9-15 12:26:38 | 显示全部楼层
buxinshan 发表于 2023-8-26 22:17
通信中设置为2bit停止位的目的是:不同处理能力的MCU(CPU)之间协调通信中的“字节与字节”的间隔(准确的 ...

按照你说的,STM32的处理是可以理解的,但GD32在设置为2位停止位方式时,接收到的数据如果只有一位的话,是会报帧错误的
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 04:33 , Processed in 0.333967 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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