|
发表于 2009-1-14 23:24:22
|
显示全部楼层
误会啊,天大的误会啊.....
你们知道那个"x%的误差"是怎么来的吗?
传统的串行通信,对信号进行采样时,其采样频率是按波特率1:1进行的,比如9600的波特率,则采样频率为9600次/秒.所以,当信号的波特率精确等于采样端波特率时,则每个采样点正好位于每个数据位的中央,而当信号的波特率偏低时,采样点将发生左移,反之右移.此时注意看了:----如果偏移的周期大于一个采样的50%时,采样点就肯定移出信号的范围了,也就出错了.这个50%是积累性的,所以波特率的总偏差为50/(8+2) = 5,即偏差不能超过4.9999999999999....%
然而问题来了:
凡兼容MSC 51 UART通信协议的串口,采样并不是这样进行的,它是以3倍于波特率的速度进行采样,并要求每三次采样中的两次相等,否则视为采样出错,这样做的目的之一是为了能检测出波特率失步(相比之下,传统的采样方式是无法检测得到失步的).而带来的副作用是,未位积累偏差不得大于33.33...%,而不是49.99...%!!!!
当然,这种做法我个人认为其实用处不是很大,连续1和0是检不出来的.
几乎所有的手册里都按50%来算,所以很多人搞到死都想不明白明明是按公式算出来的,为什么他的单片机总是多收到少收到一个字节.因为没人怀疑过手册.
至于
"AVR的硬件检测方式的改善,获得了4%(强调是在9600bps,10位条件下)的容差,使得通信特性更加可靠些,这正是AVR的优点之一。 "
的说法,愿主宽恕我的愚钝,因为我实在想不出用了什么高明的办法来"使得通信特性更加可靠些",请指点.
本贴被 rainyss 编辑过,最后修改时间:2009-01-14,23:26:19. |
|