找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 265|回复: 18
收起左侧

关于串行通信的起始位和停止位识别问题请教大家

  [复制链接]
ID:227818 发表于 2024-9-7 15:38 | 显示全部楼层 |阅读模式
这几天正看串口,虽然能勉强编程,但还是理解不彻底。串口数据发送格式如图:有请高手说下,接收方是如何区分起始位和数据0的?停止位和1是如何区分的?空闲时数据线上是高电平,如果发送FF,会出现8个1,会不会识别为空闲?谢谢大家。
IMG_20240907_152334.jpg
回复

使用道具 举报

ID:878061 发表于 2024-9-7 22:10 | 显示全部楼层
串口通信中,首先最重要的是波特率,收发双方约定多少时间为一个bit位,然后空闲是高电平,当接收方收到一个起始位(也就是符合一个bit位的低电平)就可以认为是一帧数据,至于后面的8个数据位只要符合0的时长就认为是0,符合1就认为是1,如果发送FF它也不会认为是空闲,因为有起始位0是低电平
回复

使用道具 举报

ID:227818 发表于 2024-9-8 16:31 | 显示全部楼层
huashanhui20 发表于 2024-9-7 22:10
串口通信中,首先最重要的是波特率,收发双方约定多少时间为一个bit位,然后空闲是高电平,当接收方收到一 ...

是的,波特率最重要,波特率要设定相同,关键是如何确定起始位,就是收到一个0后,如何确定这个是0还是起始位,也就是说如何定义发一个字节结束,知道一个字节结束后,再来一个0,就可以认为是起始位,不会是连续的10个高电平后来的0是起始位吧,我曾用示波器观察过连续发数据时的波形,发完一个字节后的空闲时间很短,也就是一个BIT多点,然后就是起始位了。
回复

使用道具 举报

ID:786521 发表于 2024-9-8 19:39 | 显示全部楼层
首先,开始数据传输之前,双方会约定一个传输速率,即我们所说的波特率;在不同时钟的主机和从机中,主机都需要计数n次以达到一个波特率的传输时间。如果所使用的uart协议中规定起始位为低电平,停止位为高电平,数据位长度固定为8bit,停止位1bit,那么接受方就会侦测起始位,并且在每个计数周期进行一次数据采样,直到停止位。
回复

使用道具 举报

ID:624769 发表于 2024-9-8 21:51 | 显示全部楼层
你对"位"这个字怎么理解?
既然叫"起始位", 那么这个位置自然就是固定的0, 既然叫"停止位"那么这个位置就是固定的1,和数据位的0/1所在位置不同,如何会无法区分呢? 发送FF 也好 发送00也好,始终都是要由起始位开始的,既然开始了,怎么会认为是空闲呢?
回复

使用道具 举报

ID:227818 发表于 2024-9-9 09:02 | 显示全部楼层
188610329 发表于 2024-9-8 21:51
你对"位"这个字怎么理解?
既然叫"起始位", 那么这个位置自然就是固定的0, 既然叫"停止位"那么这个位置就是 ...

我的意思是如何定义一次传输的开始,如果双方都认为是闲置状态,那么发送方发出一个低电平,接收方会识别为起始位,开始收数据,那没有问题。如果上电的一瞬间,电路电平不稳定,或者电路出了问题,比如说传输过程中出现干扰,甚至断路,然后又连接上了,这个时候肯定会出现乱码,如果双方不重现确认一次起始位,会一直乱下去吗?
回复

使用道具 举报

ID:192020 发表于 2024-9-9 09:08 | 显示全部楼层
newlined 发表于 2024-9-8 16:31
是的,波特率最重要,波特率要设定相同,关键是如何确定起始位,就是收到一个0后,如何确定这个是0还是起 ...

既然叫起始位那第一位收到的就是起始位,第二位收到的才是0
回复

使用道具 举报

ID:161164 发表于 2024-9-9 09:22 | 显示全部楼层
以我理解
不要把起始位当作一个位
用的到的只是那一个下降沿
当收到下降沿就开始定时扫描(如9600,就是104us)
扫描8次之后,就完成一次通信
结束位也不是一个位
只是用来回复高电平,为下一个起始位(下降沿)作准备
回复

使用道具 举报

ID:1131614 发表于 2024-9-9 10:46 | 显示全部楼层
在串行通信(通常称为串口通信)中,数据是以一连串的比特流形式发送的。为了确保接收端能够正确地解析这些比特流,通信协议规定了一些特殊的位来同步收发双方的数据传输过程。其中,起始位(Start Bit)和停止位(Stop Bit)就是这样的标志位。

起始位(Start Bit)
起始位是一个逻辑低电平(0),用来标识一个字符帧的开始。
在空闲状态下,串行线路上通常保持高电平(逻辑1)。当线路从高电平转变为低电平时,接收方就知道一个新的字符即将到达。
起始位之后跟着的是数据位,即实际要传输的信息。
停止位(Stop Bit)
停止位是一个或多个逻辑高电平(1),用来标识一个字符帧的结束。
停止位可以是1位、1.5位或者2位长度,这取决于通信双方的约定。
发送完数据位后,发送方会发送停止位,告知接收方该字符帧已经结束。
如何区分
实际上,在硬件层面上,起始位和停止位是通过电平的变化来自动检测的,并不需要用户手动去区分它们。硬件(如微控制器中的UART接口)根据预先设置好的配置(例如波特率、数据位数、奇偶校验位、停止位数等)自动处理这些位。

在编程配置串口通信时,你需要设定好起始位、数据位、奇偶校验位以及停止位的具体参数。例如,在大多数情况下,起始位始终是一个低电平位,而停止位是一个或多个高电平位。这些参数的选择会影响到数据传输的可靠性。

总之,在实际应用中,你只需要按照所使用的通信协议来正确配置串口参数即可,硬件会自动处理起始位和停止位的识别与使用。如果你正在编写驱动程序或底层固件,则需要理解这些位是如何工作的,并确保你的代码正确地实现了这些位的生成和检测。
回复

使用道具 举报

ID:227818 发表于 2024-9-9 11:10 | 显示全部楼层
qq475878026 发表于 2024-9-9 09:08
既然叫起始位那第一位收到的就是起始位,第二位收到的才是0

第二位开始应该收到的是数据了
回复

使用道具 举报

ID:227818 发表于 2024-9-9 11:12 | 显示全部楼层
lkc8210 发表于 2024-9-9 09:22
以我理解
不要把起始位当作一个位
用的到的只是那一个下降沿

是的,应是检测下降沿,问题是收到1后,再收到0,也是先收到一个下降沿。
回复

使用道具 举报

ID:1109793 发表于 2024-9-9 19:24 | 显示全部楼层
newlined 发表于 2024-9-9 09:02
我的意思是如何定义一次传输的开始,如果双方都认为是闲置状态,那么发送方发出一个低电平,接收方会识别 ...

我的理解是发送一个0,告诉对方我要发东西了,约定了波特率就定义了每个信号的宽度,从第一个0开始,每隔一个宽度时间记录一个信号,直到8(9)个信号接完了就算一组信号完成了。后面的持续的高电平就告诉接收端本次结束了,用来复位接收用的计数器。中间有干扰当然就是错误的数据了。所以才有校验啊,校验不对就扔掉数据重新等待下次的。
回复

使用道具 举报

ID:384109 发表于 2024-9-9 23:09 | 显示全部楼层
没学过数字电路和通讯吧,这个是按时间采样数据的
回复

使用道具 举报

ID:283954 发表于 2024-9-10 02:53 | 显示全部楼层
newlined 发表于 2024-9-9 09:02
我的意思是如何定义一次传输的开始,如果双方都认为是闲置状态,那么发送方发出一个低电平,接收方会识别 ...

如果数据不断传送,当然就一直乱下去,直到最少出现一个字节的停顿,这时全是高电位,停止位也已收到,等再接到一个低电位,就表示是起始位,又再同步了。
回复

使用道具 举报

ID:227818 发表于 2024-9-10 10:27 | 显示全部楼层
@xiaobendan001,“后面的持续的高电平就告诉接收端本次结束了,用来复位接收用的计数器”我的困惑归根到底就是接收方如何判断一个字节的接受完成,您这句话提醒了我,接收方是不是不定时强制复位接受计数器,比如每当收到10个位的1时,这时肯定是空闲状态,强制复位接受计数器,然后再收到低电平,则开始计数,接收数据,接收完一个字节,复位接受计数器,然后再收到低电平则认为是下一字节的起始位,连续收到持续的高电平,再强制复位一次,确保下一次正确识别起始位?
回复

使用道具 举报

ID:227818 发表于 2024-9-10 11:10 | 显示全部楼层
lkc8210 发表于 2024-9-9 09:22
以我理解
不要把起始位当作一个位
用的到的只是那一个下降沿

也许我有些明白了,您说的对,不要把起始位当作一个位,用的到的只是那一个下降沿,接收方收到这个下降沿,马上开始计数,相当于每接收一个字节的数据,就同步一次时钟,时钟不会出现累计的误差,这就是称为异步传输的原因?
回复

使用道具 举报

ID:227818 发表于 2024-9-10 11:52 | 显示全部楼层
dalaoshi 发表于 2024-9-10 02:53
如果数据不断传送,当然就一直乱下去,直到最少出现一个字节的停顿,这时全是高电位,停止位也已收到,等 ...

对的,应该是这样,当出现乱码后,直到出现一个字节的停顿,然后才重新开始,8楼lkc8210 老师说过:不要把起始位当作一个位,用的到的只是那一个下降沿,也就是接收方收到这个下降沿,定时器开始跑,计数,相当于每接收一个字节就同步一次,所以一般不会出现逻辑错误,前几天我算过,串口接收方定时器的溢出速率是串口波特率的4倍,正好在中间采样一次。
回复

使用道具 举报

ID:1059013 发表于 2024-9-10 13:09 | 显示全部楼层
newlined 发表于 2024-9-9 09:02
我的意思是如何定义一次传输的开始,如果双方都认为是闲置状态,那么发送方发出一个低电平,接收方会识别 ...

对,这些问题正是编程时要考虑及规避的
回复

使用道具 举报

ID:624769 发表于 2024-9-12 19:26 | 显示全部楼层
newlined 发表于 2024-9-9 09:02
我的意思是如何定义一次传输的开始,如果双方都认为是闲置状态,那么发送方发出一个低电平,接收方会识别 ...

你编写过单片机代码,并且使用串口, 应该会发现 如果程序没有做特定处理,上电初期出现一两个乱码是很常见现象。
一但因为各种原因,出现误判的起始位,必定会有乱码,这时候,起始位和停止位的作用就体现出来了,乱码最多不会超过8个字节。一定会纠正过来,如果自己编写上下位机代码,停止位长度扩大到8位,那么乱码最多也就一个字节。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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