单片机串口是如何区分低电平是开始位还是数据0位

[复制链接]
4885|26
手机看帖
扫描二维码
随时随地手机跟帖
vftom3|  楼主 | 2017-6-21 09:23 | 显示全部楼层 |阅读模式
单片机串口是如何区分低电平是开始位还是数据0位  两个单片机通讯  如果数据位有1到0 刚好这个时候单片机读数据 那不就认为是起始位吗 如果两个要发送的数据时间间隔够长  后面读出的位都会为1 那么读出的数据不就是错的 吗怎样保证读出的数据是正确的.

相关帖子

kingkits| | 2017-6-21 10:07 | 显示全部楼层
要留出一定的空闲,使数据线保持停止位状态(时间要超过一个字符的数据帧,比如10bit)

使用特权

评论回复
kingkits| | 2017-6-21 10:10 | 显示全部楼层
串行异步通讯的短板就是无法识别一个数据帧的起始位置。需要做特定的标识,比如给一个固定的字节0x10作为数据帧开始

使用特权

评论回复
vftom3|  楼主 | 2017-6-21 11:21 | 显示全部楼层
kingkits 发表于 2017-6-21 10:07
要留出一定的空闲,使数据线保持停止位状态(时间要超过一个字符的数据帧,比如10bit)
...

太感谢您的回复了   如果留一定的空闲那么 效率就低了 如果不留 就有读错的可能这样认为对吗

使用特权

评论回复
vftom3|  楼主 | 2017-6-21 11:33 | 显示全部楼层
kingkits 发表于 2017-6-21 10:10
串行异步通讯的短板就是无法识别一个数据帧的起始位置。需要做特定的标识,比如给一个固定的字节0x10作为数 ...

感谢您的回复   您说的这个好理解  如果发送单个字符型数据 0xaa 然后10bit的空闲  为列子  假如已经发到数据的第4位是1 接下来是0  ,这个时候另一个单片机准备接收了那么他会认为是起始位 然后开始读位bit 到停止位他会认为是1  这样读出来的数据就不对了 。像这样接收单字符数据的时候 除了前面加一定的标识 还有更简单效率更高的没有  

使用特权

评论回复
kingkits| | 2017-6-21 13:00 | 显示全部楼层
加一对同步控制线RTS/DTR

使用特权

评论回复
kingkits| | 2017-6-21 13:04 | 显示全部楼层
连续发送0xaa是用于自动调整波特率的,通常一个设备不知道另一个设备的波特率时,有些芯片支持通过这样的方式,自动适应另一个设备的波特率

使用特权

评论回复
kingkits| | 2017-6-21 13:06 | 显示全部楼层
如果你的通讯线路过于繁忙(一般duty > 80%),建议使用更高的通讯速率,而不是依靠软件来解决数据无法识别的问题

使用特权

评论回复
kingkits| | 2017-6-21 13:11 | 显示全部楼层
有些芯片支持读取半个字节时报错,但通常串口通讯都需要先适应一下,然后才能和上位机同步起来,这个是软件要解决的问题。解决的方法有很多,但没有捷径,你必须老老实实地处理。

使用特权

评论回复
dalarang| | 2017-6-21 23:13 | 显示全部楼层
楼主的担心是没必要的,串口在发送一个字节时,实际上至少需发送10个比特位,第1位为起始位作为时序同步起始依据,接着8位数据,如果有校验,8数据位后会紧接着发送1位校验位,最后必须有至少1个停止位。

接收端在总线空闲时,一直等待0信号即起始位的到来,一旦起始位到来,即开始按照波特率一位一位的接收数据,只有接收足够的位数后才允许重新检索起始位,在接收过程中的1变到0,是不可能重新再识别为起始位的,一个字节接收完毕,还要有停止位做字节的结束,之后再等待下一个起始位。

串口通讯发送的多个字节不是连续的,字节间必须用停止位和起始位来隔开。每个字节都是分别同步的,以起始位做为同步起始依据,这样也可以保证了在双方波特率有微小误差时,不会因长时间通讯使误差累加导致错位。

所以你所说的把数据位误认为起始位问题只有一种情况可能会导致,就是在发送端发送一半时,接收端才接入到总线中来,此时才有可能会把0误识别为起始位,否则是不会有这个问题的。

使用特权

评论回复
ckc| | 2017-6-22 00:19 | 显示全部楼层
正常情况下一直是高电平,单片机当然需要一直读,发现电平变化就认为是数据的开始位到了。
如果接收方从中间开始读,当然有可能判断错误。不过后来的就正常了啊
话说你是从中间开始读数据的,不可能要求这一个字节也是正确的吧。

使用特权

评论回复
whtwhtw| | 2017-6-22 08:26 | 显示全部楼层
10楼讲的很明白了,楼主多虑了,还是考虑怎么样把程序写好吧

使用特权

评论回复
vftom3|  楼主 | 2017-6-22 17:29 | 显示全部楼层
dalarang 发表于 2017-6-21 23:13
楼主的担心是没必要的,串口在发送一个字节时,实际上至少需发送10个比特位,第1位为起始位作为时序同步起 ...

感谢您的回复。您的最后一段真是我所担心的。如果主机发了一部分真好从机开始读数据。那就读错了。每一帧隔多少时间当从机开始读第一次数据都会有几率读错。但是实际的应用中没有干扰时候读的都正常。单片机硬件是靠什么机理做到的

使用特权

评论回复
vftom3|  楼主 | 2017-6-22 17:29 | 显示全部楼层
dalarang 发表于 2017-6-21 23:13
楼主的担心是没必要的,串口在发送一个字节时,实际上至少需发送10个比特位,第1位为起始位作为时序同步起 ...

感谢您的回复。您的最后一段真是我所担心的。如果主机发了一部分真好从机开始读数据。那就读错了。每一帧隔多少时间当从机开始读第一次数据都会有几率读错。但是实际的应用中没有干扰时候读的都正常。单片机硬件是靠什么机理做到的

使用特权

评论回复
vftom3|  楼主 | 2017-6-22 17:32 | 显示全部楼层
whtwhtw 发表于 2017-6-22 08:26
10楼讲的很明白了,楼主多虑了,还是考虑怎么样把程序写好吧

不是多虑的问题。是搞不懂

使用特权

评论回复
vftom3|  楼主 | 2017-6-22 17:36 | 显示全部楼层
ckc 发表于 2017-6-22 00:19
正常情况下一直是高电平,单片机当然需要一直读,发现电平变化就认为是数据的开始位到了。
如果接收方从中 ...

问题就是我就读一次。并不是连续的读两次第一次的数据不要。但是实际读的情况没有错误单片机是怎样做到的。按理说他读错的几率呀

使用特权

评论回复
vftom3|  楼主 | 2017-6-22 17:41 | 显示全部楼层
dalarang 发表于 2017-6-21 23:13
楼主的担心是没必要的,串口在发送一个字节时,实际上至少需发送10个比特位,第1位为起始位作为时序同步起 ...

感谢您的回复。您的最后一段就是我担心的。前面说的基本知道。担心是多余的按理论这种读错的几率有但是实际应用情况来看没有读错单片机是怎么做到的

使用特权

评论回复
vftom3|  楼主 | 2017-6-22 17:59 | 显示全部楼层
kingkits 发表于 2017-6-21 10:10
串行异步通讯的短板就是无法识别一个数据帧的起始位置。需要做特定的标识,比如给一个固定的字节0x10作为数 ...

多谢回复您说的是个办法。但是实际应用中却没有这种担心的错误单片机是怎样做到的呢

使用特权

评论回复
kingkits| | 2017-6-23 09:10 | 显示全部楼层
建议你去学学数字电路什么的

使用特权

评论回复
xuplastic| | 2017-6-23 21:29 | 显示全部楼层
vftom3 发表于 2017-6-22 17:29
感谢您的回复。您的最后一段真是我所担心的。如果主机发了一部分真好从机开始读数据。那就读错了。每一帧 ...

你以为单片机和人一样偷懒啊,接收端是源源不断地对接收口的数据进行采样(一般是3-4倍波特率的采样时钟),至于读错的概率,当然有,我们在工业设备上原来用串口,误码率太大,换以太网了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

191

帖子

1

粉丝