|
菜农 发表于 2006-7-1 3:38:00
以前Philips的51RD2的波特率自适应同步字符是大写字母U(0x55),即产生一组方波信号.
前些日子玩LPCARM时,发现Philips的波特率自适应同步字符变成了问号?(0x3f)
一直没注意其奥妙也没仔细研究.
最近玩DSP5402,由于用惯了PC串口,而其无标准的异步串行接口,且IO很少.
故只能用IO模拟.
虽说遗憾,但也庆幸可以再次研究一下波特率自适应问题.
所谓波特率自适应就是接收方可以根据发送方任意不同的发送速率皆能正确地接收到真正的有效数据.
由于和同步协议的不同,双方没有硬件的同步时钟信号,只能靠双方事先约定好的通讯速率进行数据的传送.
在实际应用中,由于通讯线长和通讯速率及干扰等种种原因,通讯速率可能需要变频或双方未曾事先约定,也就需要波特率自适应技术的应用了.
在异步串行协议中,串行数据由起始位S,8位数据DX和停止位P组成.先从最低位D0开始发送.
通讯速率即起始位S的脉冲宽度.当数据位D0为高电平时,则为起始位的下降沿到上升沿的时间.
为了提高测量精度,需要N倍于通讯速率(时间)的脉冲宽度,这就需要再测试高电平的脉冲宽度.
由于停止位P为高电平,故数据位应该有1位为低电平来分割.
最理想的数据是0x7f.即串行数据位为S11111110P.(其中S=0,P=1)
它的高低电平的脉冲宽度之比为1:7:1.精度最高.
由于0x7f不是可打印字符,故一般在HEX码和UU码通讯协议中不会采用之.
这样就应该采用0x3f.即串行数据位为S11111100P.(其中S=0,P=1)
它的高低电平的脉冲宽度之比为1:6:2.精度次之.
再可以采用0x1f.即串行数据位为S11111000P.(其中S=0,P=1)
它的高低电平的脉冲宽度之比为1:5:3.精度不好.
且0x1f也是非打印字符.
故采用0x3f即字符"?"算是最佳的选择了.
虽然可以采用其他数据作为同步字符,如:
0x00.即串行数据位为S00000000P.(其中S=0,P=1)
但只有低电平的脉冲宽度,且0x00是C语言的字符串结尾符和非打印字符,肯定不可取.
0x40.即串行数据位为S00000010P.(其中S=0,P=1)
虽说高低电平的脉冲宽度之比为7:1:1.精度最高.与0x1f相同,同时又是字符"@"
所以,在某种角度上来看,用"@"来做波特率自适应的同步字符也是一个相当不错的选择.
不过,用"?"的意思好象在"问"对方是否上线(在线).
0x60.即串行数据位为S00000110P.(其中S=0,P=1)
虽说高低电平的脉冲宽度之比为6:2:1.精度次之.与0x3f相同,同时又是字符"'"
这个肯定不如"?"有创意.
总之,从以上分析可知,LPCARM波特率自适应同步字符"?"确实很完美.
哈哈~~~球也要看完了.意大利人真走运~~~老黄喊"意大利万岁"倒也有些道理~~~
3:0.够晕菜~~~
HotPower@126.com
2006.7.1 4:47 于西安大雁塔村队部 |
|