打印

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

[复制链接]
5062|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vftom3|  楼主 | 2017-6-21 09:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
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)
...

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

使用特权

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

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

使用特权

评论回复
6
kingkits| | 2017-6-21 13:00 | 只看该作者
加一对同步控制线RTS/DTR

使用特权

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

使用特权

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

使用特权

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

使用特权

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

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

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

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

使用特权

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

使用特权

评论回复
12
whtwhtw| | 2017-6-22 08:26 | 只看该作者
10楼讲的很明白了,楼主多虑了,还是考虑怎么样把程序写好吧

使用特权

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

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

使用特权

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

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

使用特权

评论回复
15
vftom3|  楼主 | 2017-6-22 17:32 | 只看该作者
whtwhtw 发表于 2017-6-22 08:26
10楼讲的很明白了,楼主多虑了,还是考虑怎么样把程序写好吧

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

使用特权

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

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

使用特权

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

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

使用特权

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

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

使用特权

评论回复
19
kingkits| | 2017-6-23 09:10 | 只看该作者
建议你去学学数字电路什么的

使用特权

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

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

使用特权

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

本版积分规则

7

主题

193

帖子

1

粉丝