gnail092 发表于 2022-10-20 17:07:56

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

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

eric2013 发表于 2022-10-21 00:52:39

这里以我们H7-TOOL为例的串口助手为例进行说明,这个底层就是H750的1bit,2bit停止位配置。
测试波特率使用常用的115200.
串口助手1bit + 单片机1bit
串口助手1bit + 单片机2bit
串口助手2bit + 单片机1bit
串口助手2bit + 单片机2bit

四种情况全部正常。


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

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






gnail092 发表于 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位停止位的设备的数据的。

eric2013 发表于 2022-10-21 15:02:47

gnail092 发表于 2022-10-21 07:27
你这个说的是对一个bit的采样方式吧,如果接收这边停止位设置为2bit,对接收来说就需要连续检测到2个bit ...
我认为这句不太全面,因为每个数据之间不是严格的连续(或者说像STM32这种对停止位有特别的处理机制),所以出现了我二楼的测试都正常。
你可以这样测试,找两个STM32板子的串口测试下看看。

接收这边去采样第2个停止位时对应的就是下一字节的数据的起始位了
串口起始bit是低电平,而停止bit是高电平。



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






gnail092 发表于 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测确实无法通讯。

gnail092 发表于 2022-10-21 16:11:56

我波形是测过的,串口工具设置为1位和2位,或者单片机设置为1位或2位,字节之间的停止位位数确实是如设置的那样,下面两张图分别是设置为2位和1位停止位的抓取的波形,可以看到字节之间的停止位数就是跟所设置的停止位一样。

eric2013 发表于 2022-10-21 16:25:03

gnail092 发表于 2022-10-21 15:58
两个STM32之间通讯没测过,但STM32和GD32的现象不一样,单片机设置为2位停止位,串口工具设置为1位时,测 ...

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

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

eric2013 发表于 2022-10-21 16:25:30

gnail092 发表于 2022-10-21 16:11
我波形是测过的,串口工具设置为1位和2位,或者单片机设置为1位或2位,字节之间的停止位位数确实是如设置的 ...

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

庄永 发表于 2022-10-21 22:07:18

本帖最后由 庄永 于 2022-10-21 22:10 编辑

试一下0xAA

glory 发表于 2022-10-22 09:44:49

看了下内容,感觉你们俩不在一个频道。

eric2013 发表于 2022-10-22 11:41:16

精髓,细节了。



gnail092 发表于 2022-10-22 19:19:04

eric2013 发表于 2022-10-22 11:41
精髓,细节了。

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

eric2013 发表于 2022-10-23 13:22:45

gnail092 发表于 2022-10-22 19:19
你这个就是我5楼上传的截图,STM32手册上提到的。可能不同MCU处理不一样,GD的确实需要匹配2位停止位的。 ...

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

buxinshan 发表于 2023-8-26 22:17:53

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

buxinshan 发表于 2023-8-26 22:24:09

上面图中STM32的UART的16倍/8倍过采样分别用在什么情况下,还有讲究的,以及STM32如何实现的小数分频。理解了这些,对于实现软件UART是有帮助的。

gnail092 发表于 2023-9-15 12:26:38

buxinshan 发表于 2023-8-26 22:17
通信中设置为2bit停止位的目的是:不同处理能力的MCU(CPU)之间协调通信中的“字节与字节”的间隔(准确的 ...

按照你说的,STM32的处理是可以理解的,但GD32在设置为2位停止位方式时,接收到的数据如果只有一位的话,是会报帧错误的
页: [1]
查看完整版本: 请教关于串口停止位设置1位和2位的通讯问题