专研DSP28XX系列,深入了解C语言的'奥妙,掌握ORCAD中电路图的仿真功能,学习MCU等控制理论.努力. 每天都要有收获.生活才会因此多姿多彩.相信自己.未来就会有希望!

何如测试串口的通讯波特率

上一篇 / 下一篇  2007-05-21 08:52:41 / 天气: 晴朗 / 心情: 高兴 / 个人分类:学习日记

 

E,PH+ab'l!U.Q(\ l0何如测试串口的通讯波特率  

bmS/NB0 EDA中国门户网站3@.gL*abTPz

 EDA中国门户网站\i;yRH?
    
1gQ%A$~~5Z!X] H*M0  (哈尔滨工业大学控制工程系 150001)   任贵勇 屈彦成 王常虹  
1H`p"XtYx#ux:D&f0      EDA中国门户网站 {Nl$M\C`
    EDA中国门户网站 Ne$x1t3R^D4ch9^&p
      EDA中国门户网站;C%kppl&jT
  摘 要:给出了一种利用接收到的字符信息检测串行终端通信波特率   的方法。此方法简单、可靠、易行,并给出了实现这种检测方法的伪代码。  
]8]E_!X.KR H]0  关键词:自动检测;波特率   EDA中国门户网站jp4uG8?
    EDA中国门户网站 M5\{ @ Vl[
   
i|$\2p(c O0    串行通信是终端和主机之间的主要通信方式,通信波特率一般选择1800、4800、9600和   19200等。终端的类型有很多种,其通信速率也有很多种选择。主机怎样确定终端的通信速率呢?本文给出了一种简单、易行的方法:设定主机的接收波特率(以9600波特为例),终端发送一个特定的字符(以回车符为例),主机根据接收到的字符信息就可以确定终端的通信波特率。本文对这种方法予以详述。  
;U0q_xi@#[ ?3^,K0    EDA中国门户网站h6r.t ^}ls4MLX ~
  1 基本方法   EDA中国门户网站 [!SI'n \(t(E#p3u9I
    回车符的ASCII值为0x0D。串行通信时附加一个起始位和终止位,位的传输顺序一般是   先传低位再传高位。此时回车符的二进制表示方式为:   EDA中国门户网站#_ki,mQXVj
   
x4VRvMO0C0    EDA中国门户网站Q?$N4I5[a%]H
    EDA中国门户网站nRSl2M~.x2O
  图1 回车符的位序列  
Q;v0dV+M$T+m0    EDA中国门户网站t$v&aYd0N(U R1d/@%r2j
    串行通信中一个二进制位的传输时间(记为T)取决于通信的波特率,9600波特时一个   二进制位的传输时间是19200波特时一个二进制位传输时间的两倍,即:2*T19200=T   9600。因此,9600波特时一个位的传输时间,19200波特时可以传输两个位。同样地   ,9600波特传输两个位的时间在4800波特时只能传送一个位。主机设定接收波特率为9600,   终端只有也以9600波特发送的字符,主机才能正确地接收。发送波特率高于或低于9600都会   使主机接收到的字符发生错误。接收波特率为9600,终端以不同的波特率发送回车符时,主   机接收到的二进制序列如表1所示。  
GV)y,Sx0    从表1中可以看出,除了19200和1800波特时两种特例情况,其他情形的二进制序列都是   9600波特时二进制序列的变换。取前十个二进制位与9600波特时的二进制位相对应。忽略缺   少停止位‘1’引发的数据帧错误,把接收到的字符表示成字节方式(如表1的最右列所示)   。例如:在发送速率为1200波特,接收速率为9600波特时,主机得到的字节是0x80,而不   是正确的回车符0x0D。因为在不同的发送速率下(9600,4800,2400,1200)得到的字节   不同,所以通过接收字符的判定就可以确定发送波特率。   EDA中国门户网站+cd;M*c2q }hTMw)r
    发送波特率为19200时,其发送速度正好是接收速度(9600波特)的两倍,因此发送端   的两个二进制位会被接收端看作一个。取决于不同的串行接口硬件,‘01’和‘10’这两种   二进制位组合可能被认为是‘1’或者‘0’。幸运的是,只有0~4位存在这样的歧义问题,   后面的位因为都是停止位,所以都是‘1’。因此,发送速率为19200波特时接收到的字符其高半个字节为0xF。低半个字节可能是多个值中的一个,但不会是0x0,因为0x0D中有相邻   的两个‘1’,这就会至少在低半个字节中产生一个‘1’。因此,整个字节的形式为0xF?,   且低半个字节不为0。   EDA中国门户网站%]/KZ%H1} o
    EDA中国门户网站 M%CT Sh7CE
  表1    不同波特率下的二进制序列  
4TnC.l-kb9WX0   
-M2}L2Emd#P0  波特率  
-t({ `Lh?bZ0    接收到的二进制位序列   EDA中国门户网站$~9?9M6Fg s8`/Yy
    字节表示   EDA中国门户网站[/{!qMb6RHU2[{.j
      EDA中国门户网站E6Qv[D;XE3oWj
  19200   EDA中国门户网站4r+c(D B&F9B
    0   1   0   1   1   0   0   0   0   1   1   1   1   1   1   1   1   1   1   1   EDA中国门户网站 M(xxddF G
    0xF?  
/b.Gt f2X4P&m.dA8T0     
H Zhr ll0  9600  
.~lAz'LN0    0 1    0 1    1 0    0    0 0    1   
k,Iy S8Yrbzz0    0x0D   EDA中国门户网站(OSH+K3|$kr
      EDA中国门户网站P@+B&\0{\?e}
  4800  
7C4X.qD mCx0O0    0   0   1   1   0   0   1   1   1   1   0   0   0   0   0   0   0   0   1   1  
0Tm G#PL:l R0    0xE6   EDA中国门户网站:{wy5L k)RD1K+V
     
k-l7|.q?+q3B3J ^r0  2400  
5my/D3S)g^bf N&o0    0   0   0   0   1   1   1   1   0   0   0   0   1   1   1   1   1   1   1   1  
&}-?(chBi3D;o0    0x78   EDA中国门户网站|jIbY]L`3?
      EDA中国门户网站yjw8A@
  1800  
0~)Q)GSj0    0   0   0   0   0   x   1   1   1   1   x   0   0   0   0   0   1   1   1   1   EDA中国门户网站ND(mHPDHrVn
    0xE0  
#V+JgZ)EJfj|%u0     
m#m!@h2b%r-r0  1800  
t2mH+Kh(VL/i:S0    0   0   0   0   0   x   1   1   1   1   x   0   0   0   0   0   1   1   1   1  
-Ci1kCB3I6J0    0xF0   EDA中国门户网站b!m2kX(zx\z
      EDA中国门户网站|cdA*S5ai-n6b;W Q4H(M
  1200  
G"W L$Vm!W0    0   0   0   0   0   0   0   0   1   1   1   1   1   1   1   1   0   0   0   0   EDA中国门户网站5zekM/Oo g7b7f#B
    0x80  
{W9Q?"T i0     
y4v#Y/S{;?C#G0  600  
7F(_w:DcV^V7V0    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   1   1   1   EDA中国门户网站R*C VJ6Rb[
    0x00   EDA中国门户网站i p3zpKb6ML
      EDA中国门户网站G)_7f+SLY!{
  300   EDA中国门户网站9} f8r h%G_
    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  
!xFM i3qfmH0    0x00   EDA中国门户网站)d0T;i+g#I[
     
(GUN:Pzn.X0  150   EDA中国门户网站,kx3[)Ne8bJ7g
    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  
'b7yx|*x5J0    0x00   EDA中国门户网站+Z#Ww)u;X$_ dup
     
6t^W4HO-{0  110  
.hd5g{7t};[0    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  
-k.?9Co?'g"SX:M U0    0x00   EDA中国门户网站5gX[_ x
      EDA中国门户网站K%n3bo_pH7D
   
H0`,n;R(TU0    发送速率为1800波特时,因为  
G!ei%d^5i:v+I+F0    T1800=T9600*16/3,  
VcO;h0j+[0  而16/3不是整数,接收端二进制位的状态转换时刻和9600波特不一一对应,引起在接收端   的一个位接收周期内有状态发生变化的可能。表1中给出的第六个位(表示为x)就是这种情   况。因为x有可能被看作‘1’,也有可能被看作‘0’,所以发送速率为1800波特时接收到   的字节可能是0xE0或者0xF0。波特率为3600和7200时也有同样的问题,也可以采用同样的方   法,但不确定的位数会增加,需要检测的字节种类也会更多。3600波特和7200波特的传输速   率几乎不采用,因此这个问题并不严重。只要发送波特率在1200~19200之间,我们都可以   通过接收到的一个字符对此波特率进行唯一的判定。     EDA中国门户网站!B*}[x&rn;HW
   
:N5W$t'J1xO0  2 低波特率的检测   EDA中国门户网站A5{ T{ r
    当发送速率低于1200波特时,接收端收到的字节都是0x00,因此只能确定其速率低于12   00波特,而不可能再得到更多的信息。为了解决这个问题,可以在9600波特的速率下继续接   收下一个字节信息。发送速率为600波特或更低时,一个位的发送时间要大于9600波特时整   个字节的接收时间。因此,发送端每一个从‘1’(终止位)到‘0’(起始位)的跳变都会   让接收端认为一个新的字节开始了。表2所示为600波特或更低的传输速率时接收端回车符的   二进制序列(只给出开始的一些位)。   EDA中国门户网站k E&_ ~R[8L
    EDA中国门户网站$o9N_y;w*IBZ$h d
  表2    低波特率回车符的接收方式   EDA中国门户网站 F$m$cj9` l:e^
    EDA中国门户网站S@,^eYb-oS
  波特率  
p)l0U5Z4G0    9600波特二进制序列   EDA中国门户网站ea&c%U)\.l
    时间差   EDA中国门户网站1FV nN[+I+q+e
  (周期)   EDA中国门户网站 { N)oh'Jj
    时间差   EDA中国门户网站'\a-[9X$z4Y+]
  (实时间)   EDA中国门户网站!{&SX a,~
     
J `h x Y_b!W0  600  
HMaR'u[DM'mdL0    16   0's 16   1's 16   0's  
0|5\d/v\z8V0    32  
1k L}+n)mW r'Z%]0    3.33ms  
mAi{1c!uZ0      EDA中国门户网站$~%y;o3FrY,m p
  300  
8B.N'VHgq)@0    32   0's 32   1's 32   0's   EDA中国门户网站M:]!M'C Klr~]E
    64  
[L;j,U[%F K t0    6.66ms   EDA中国门户网站'Y&];C2K,AT,q,{
     
pvQ6k~0  150  
3I5a4OLHCN0    64   0's 64   1's 64   0's  
0c0I6pA lWp&{0    128  
z5n;]a,n-[F l0    13.33ms   EDA中国门户网站vOX P*Nj~ W
      EDA中国门户网站ke:HQ)Zrk
  110   EDA中国门户网站)^!~)_ dR~2o
    87   0's 87   1's 87   0's   EDA中国门户网站FfB{#yb4}]esz9[
    174  
ERAh7V y*H0    18.13ms   EDA中国门户网站b3L Ip!e/{N-[
     
1p\6V,qWY:^0  75   EDA中国门户网站e].Fc!p'L6^;V8~7G
    128   0's 128   1's 128   0's  
Dd3Kr/t Z\d)k$LZ{9A0    256   EDA中国门户网站%Er qR$cw
    26.66ms   EDA中国门户网站%b,~1t-Jj`H
     
v+x'Za3F`/U*d0  50   EDA中国门户网站#U"g7{}H
    192   0's 192   1's 192   0's  
tpc2}3``HL6G0    384  
'VJ3gWt H'e0    4   0.00ms   EDA中国门户网站B7wA.i:r]0\ d2m
      EDA中国门户网站m5q$pH)r7i+G"n:|h
    EDA中国门户网站T8anhe0J
    600波特时,第一个从‘1’到‘0’的跳变在初始化以后即刻发生。这个跳变让接收端   得到字节0x00。第二个跳变在初始化(16+16)*T9600秒以后发生,这会让接收端认   为另外一个字节开始接收了。一个二进制位的接收时间是T9600,所以串行接口电路   会在第一个跳变以后10*   T9600秒提示第一个字节接收完毕,在(16+16+10)*   T96   00秒以后提示第二个字节接收完毕。因此600波特时,第一个字节接收完毕和第二个字节   接收完毕的时间差是(16+16+10-10)*   T9600=32*   T9600秒。表2的第三列所示   是把这个时间差以T9600的个数表示。因为T9600=1/9600秒=104.16毫秒,相   乘可以得到两个字节接收完毕的实时间差。不同发送波特率的时间差如表2的最后一列所示   。有了这个时间差信息,就可以确定低传输速率时的波特率了:测定第一个和第二个字节的   接收时间差,然后在时间差常数表(表2)里查出哪个波特率下的时间差与之最相近,对应   的就是终端发送波特率。即使测定的时间差有些误差,一般也可以正确地确定波特率。    
!BF;R:u#g2eW1|]0   
'XbT Ki"Z'q0  3 实现方式  
!QS6|:o&^)G |8DL0    通过以上分析,各种波特率都可以通过回车符的发送和接收信息来测定,算法实现的伪   代码在本文的最后给出。应用实践证明了这种方法的有效性。  
5c%M b4{#we0K z?H0  ; Pseudo   code   to   determine   what   baud   rate   a   transmitter   is   at,   EDA中国门户网站0bV;oI }.s W~/K@
    EDA中国门户网站3e}L2O7J:]P)}:l @BP
  on   the   b   asis   of   a   single   EDA中国门户网站0q)T1`z e-P7X
   
n!\]/XO NT V)V6x0  ; RETURN   (0x0D)   character   received   from   it.  
U4y5]3t!S$i cz0X0    EDA中国门户网站.I QR$u,eeW.Z1q
  Initialise   receive   baud   rate   to   9600   EDA中国门户网站A.p.V8[x9Px,z u
  Wait   for   Byte   to   be   received   EDA中国门户网站:P!@0\c"Bd7d*h:M
  IF   Byte   =   0x00   THEN  
S k1RoZwF0     Start   Timer   EDA中国门户网站o9YU-g'N
     REPEAT  
[*s)r!nE\0     UNTIL   (Timer   >   50   ms   OR   New   Byte   Received)  
q[grY7QkiB#{1C0     CASE   Timer   IN  
)[(]-VLq'ah*u0G*}0      1   ms-4   ms: EDA中国门户网站q!Tn}3TEm

]%z1ULE%@$FaMu6R0

TAG: 学习日记

KING-骑士 引用 删除 fjdalian   /   2007-05-22 19:53:12
这种方式不是很明白.没有实践
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar