wodasong 发表于 2013-6-11 03:32:22

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

大家好,我研究AVR单片机有一段时间了,最近在研究AVR单片机的USART串口,但是碰到一个问题了,请问AVR单片机串口是如何区分低电平是开始位还是数据0位?书上说单片机遇到低电平的起始位就认为是一数据帧的开始,并且开始接收,这个开始位一定是0低电平,但是假如主机在发送的时候,分机还没开机,当分机开机并开始检测串口的时候,主机发送的开始位已经发完,并且在发送数据位,这时候恰恰有一个低电平的数据位发送过来了,此时分机不也认为是开始位么?这样接收到的数据肯定是不正确的,请问AVR单片机串口是如何区分低电平是开始位还是数据0位?

mitchell 发表于 2013-6-11 04:31:09

这种情况确实会引起错乱,直到检测到帧错误(停止位的地方为低电平),状态机回到初始状态,重新检测第一个下降沿紧接着的一个bit的低电平作为起始位。

如果数据是连续发送,没有任何停顿,错乱有可能持续下去。

xizi 发表于 2013-6-11 04:37:03

这与AVR,与单片机有什么关系?所有串口都有这个问题,包括pc到pc。两端通讯,一端没准备好,当然会出错。关键是出错几桢后能自动恢复正常。

wodasong 发表于 2013-6-11 04:57:58

但是我之前用51弄了一个双机通信的项目,就是只设置相同的波特率,相同的帧格式,然后通信居然一点问题都没有,主机发的数据,分机能完整接收,即使是分机后开机没准备好也一样可以完整接收到开机之后主机发送过来的数据。

hyf88 发表于 2013-6-11 05:07:49

有这种事?我以前一直用mega64 都没发现有这样.

xizi 发表于 2013-6-11 09:59:10

无法否认你所说:即使是分机后开机没准备好也一样可以完整接收到开机之后主机发送过来的数据。
但我相信这一定是有条件的。否则你试试主机先开机,分机5分钟之后开机,看你还能不能完整接收到开机之后主机发送过来的数据?

qinxg 发表于 2013-6-11 10:03:51

这是必然会出现的情况. 故通信要有协议, 包头,包尾, 要有校验.而且帧之间要留有足够空隙, 让接收器复位.

wodasong 发表于 2013-6-12 00:47:00

很同意qinxg的意见,应该让帧帧间有空隙,让接收器检测出错误放弃,复位,后面的就准确了

xizi 发表于 2013-6-12 01:28:01

帧帧间有空隙不是你能控制的,UART硬件本身已经保证了最小空隙。不管你怎样向UBUF里写数据,这个空隙都是存在的。

sqmm 发表于 2013-6-17 10:31:52

串口TX的默认电平是高,第一个低电平自然是起始啦

wodasong 发表于 2013-7-31 01:52:22

假如主机在发送的时候,分机还没开机,当分机开机并开始检测串口的时候,主机发送的开始位已经发完,并且在发送数据位,这时候恰恰有一个低电平的数据位发送过来了,此时分机不也认为是开始位么?

alias 发表于 2013-7-31 08:00:17

>>即使是分机后开机没准备好也一样可以完整接收到开机之后主机发送过来的数据。

你这次运气好吧,现实中并不如是。对於主机连续不断发送的数据,保证你不能正确接收。
页: [1]
查看完整版本: AVR单片机串口是如何区分低电平是开始位还是数据0位?