你现在位置:首页>技术论文>数据通讯>正文
串行通信波特率的一种自动检测方法
日期:2005-10-28 22:36:15 来源:本站整理  
点击: 作者:
点击【】放大字体.

摘 要:给出了一种利用接收到的字符信息检测串行终端通信波特率 的方法。此方法简单、可靠、易行,并给出了实现这种检测方法的伪代码。

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

关键词:自动检测;波特率
WWW_P※LCJS_CO※M-PLC-技-.术_网

WWW_PLCJS@_COM%-PLC-技.术_网

  串行通信是终端和主机之间的主要通信方式,通信波特率一般选择1800、4800、9600和 19200等。终端的类型有很多种,其通信速率也有很多种选择。主机怎样确定终端的通信速率呢?本文给出了一种简单、易行的方法:设定主机的接收波特率(以9600波特为例),终端发送一个特定的字符(以回车符为例),主机根据接收到的字符信息就可以确定终端的通信波特率。本文对这种方法予以详述。

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

1 基本方法

WWW_P※LCJS_CO※M-PLC-技-.术_网

  回车符的ASCII值为0x0D。串行通信时附加一个起始位和终止位,位的传输顺序一般是 先传低位再传高位。此时回车符的二进制表示方式为:
WWW_P※LCJS_COM-PLC-)技.术_网

t54-1.gif (935 bytes)

WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

图1 回车符的位序列

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

  串行通信中一个二进制位的传输时间(记为T)取决于通信的波特率,9600波特时一个 二进制位的传输时间是19200波特时一个二进制位传输时间的两倍,即:2*T19200=T 9600。因此,9600波特时一个位的传输时间,19200波特时可以传输两个位。同样地 ,9600波特传输两个位的时间在4800波特时只能传送一个位。主机设定接收波特率为9600, 终端只有也以9600波特发送的字符,主机才能正确地接收。发送波特率高于或低于9600都会 使主机接收到的字符发生错误。接收波特率为9600,终端以不同的波特率发送回车符时,主 机接收到的二进制序列如表1所示。

WWW_PLCJS_COM-PLC-技.术_网

  从表1中可以看出,除了19200和1800波特时两种特例情况,其他情形的二进制序列都是 9600波特时二进制序列的变换。取前十个二进制位与9600波特时的二进制位相对应。忽略缺 少停止位‘1’引发的数据帧错误,把接收到的字符表示成字节方式(如表1的最右列所示) 。例如:在发送速率为1200波特,接收速率为9600波特时,主机得到的字节是0x80,而不 是正确的回车符0x0D。因为在不同的发送速率下(9600,4800,2400,1200)得到的字节 不同,所以通过接收字符的判定就可以确定发送波特率。
WWW_PLCJS_COM-PLC-技.术_网

  发送波特率为19200时,其发送速度正好是接收速度(9600波特)的两倍,因此发送端 的两个二进制位会被接收端看作一个。取决于不同的串行接口硬件,‘01’和‘10’这两种 二进制位组合可能被认为是‘1’或者‘0’。幸运的是,只有0~4位存在这样的歧义问题, 后面的位因为都是停止位,所以都是‘1’。因此,发送速率为19200波特时接收到的字符其高半个字节为0xF。低半个字节可能是多个值中的一个,但不会是0x0,因为0x0D中有相邻 的两个‘1’,这就会至少在低半个字节中产生一个‘1’。因此,整个字节的形式为0xF?, 且低半个字节不为0。
W1WW_P4LCJS_COM-PLC-技.术_网

表1  不同波特率下的二进制序列

WWW.PLCJS.COM——可编程控制器技术门户

波特率

WWW_PLCJS_COM-PLC-技.术_网

接收到的二进制位序列

WWW.PLCJS.COM——可编程控制器技术门户

字节表示

WWW_PL※CJS_COM-PLC-技.术_网

19200

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

0 1 0 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1

WWW_PLC※JS_COM-PmLC-技.术_网

0xF?

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

9600

WWW_PL※CJS_COM-PLC-技.术_网

0 1  0 1  1 0  0  0 0  1 

W1WW_P4LCJS_COM-PLC-技.术_网

0x0D

P.L.C.技.术.网——可编程控制器技术门户

4800

WWW_PLCJS_COM-PLC-技.术_网

0 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

0xE6

WWW_P※LCJS_COM-PLC-)技.术_网

2400

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

0x78

WW.W_PLC※JS_C,OM-PL,C-技.术_网

1800

WWW_PLCJS_COM-PLC-技.术_网

0 0 0 0 0 x 1 1 1 1 x 0 0 0 0 0 1 1 1 1

WWW.PLCJS.COM——可编程控制器技术门户

0xE0

WW.W_PLC※JS_C,OM-PL,C-技.术_网

1800

WW.W_PLCJS_COM-PLC-技.术_网

0 0 0 0 0 x 1 1 1 1 x 0 0 0 0 0 1 1 1 1

WWcW_PLCJS_COM-PLC-技.术_网

0xF0

WWW_PLCJS@_COM%-PLC-技.术_网

1200

WWW_P※LCJS_CO※M-PLC-技-.术_网

0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0

WW.W_PLCJS_COM-PLC-技.术_网

0x80

WW.W_PLCJS_COM-PLC-技.术_网

600

WWcW_PLCJS_COM-PLC-技.术_网

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

0x00

WWW_PLCJS@_COM%-PLC-技.术_网

300

plcjs.技.术_网

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

WWW_PL※CJS_COM-PLC-技.术_网

0x00

WWW_PLCJS_COM-PLC-技.术_网

150

——可——编——程——控-制-器-技——术——门——户

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

W1WW_P4LCJS_COM-PLC-技.术_网

0x00

WWW_PL※CJS_COM-PLC-技.术_网

110

WWW.PLCJS.COM——可编程控制器技术门户

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

WWW_P※LCJS_CO※M-PLC-技-.术_网

0x00

P.L.C.技.术.网——可编程控制器技术门户

  发送速率为1800波特时,因为

P.L.C.技.术.网——可编程控制器技术门户

  T1800=T9600*16/3,
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

而16/3不是整数,接收端二进制位的状态转换时刻和9600波特不一一对应,引起在接收端 的一个位接收周期内有状态发生变化的可能。表1中给出的第六个位(表示为x)就是这种情 况。因为x有可能被看作‘1’,也有可能被看作‘0’,所以发送速率为1800波特时接收到 的字节可能是0xE0或者0xF0。波特率为3600和7200时也有同样的问题,也可以采用同样的方 法,但不确定的位数会增加,需要检测的字节种类也会更多。3600波特和7200波特的传输速 率几乎不采用,因此这个问题并不严重。只要发送波特率在1200~19200之间,我们都可以 通过接收到的一个字符对此波特率进行唯一的判定。

2 低波特率的检测

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

  当发送速率低于1200波特时,接收端收到的字节都是0x00,因此只能确定其速率低于12 00波特,而不可能再得到更多的信息。为了解决这个问题,可以在9600波特的速率下继续接 收下一个字节信息。发送速率为600波特或更低时,一个位的发送时间要大于9600波特时整 个字节的接收时间。因此,发送端每一个从‘1’(终止位)到‘0’(起始位)的跳变都会 让接收端认为一个新的字节开始了。表2所示为600波特或更低的传输速率时接收端回车符的 二进制序列(只给出开始的一些位)。
WWW_PLCJS_COM-PLC-技.术_网

表2  低波特率回车符的接收方式

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

波特率

WWW_P※LCJS_CO※M-PLC-技-.术_网

9600波特二进制序列

WWW_PLC※JS_COM-PmLC-技.术_网

时间差

WWW_P※LCJS_COM-PLC-)技.术_网

(周期)
WWW_P※LCJS_COM-PLC-)技.术_网

时间差

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

(实时间)
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

600

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

16 0s 16 1s 16 0s

WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

32

WWW_PLC※JS_COM-PmLC-技.术_网

3.33ms

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

300

W1WW_P4LCJS_COM-PLC-技.术_网

32 0s 32 1s 32 0s

WWW.PLCJS.COM——可编程控制器技术门户

64

WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

6.66ms

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

150

WW.W_PLC※JS_C,OM-PL,C-技.术_网

64 0s 64 1s 64 0s

WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

128

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

13.33ms

WWW.PLCJS.COM——可编程控制器技术门户

110

WWW_PL※CJS_COM-PLC-技.术_网

87 0s 87 1s 87 0s

WWW_P※LCJS_CO※M-PLC-技-.术_网

174

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

18.13ms

WWW_P※LCJS_CO※M-PLC-技-.术_网

75

WWW_PLCJS@_COM%-PLC-技.术_网

128 0s 128 1s 128 0s

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

256

W1WW_P4LCJS_COM-PLC-技.术_网

26.66ms

WWcW_PLCJS_COM-PLC-技.术_网

50

P.L.C.技.术.网——可编程控制器技术门户

192 0s 192 1s 192 0s

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

384

P.L.C.技.术.网——可编程控制器技术门户

4 0.00ms

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

  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)里查出哪个波特率下的时间差与之最相近,对应 的就是终端发送波特率。即使测定的时间差有些误差,一般也可以正确地确定波特率。

3 实现方式

WWW_P※LCJS_CO※M-PLC-技-.术_网

  通过以上分析,各种波特率都可以通过回车符的发送和接收信息来测定,算法实现的伪 代码在本文的最后给出。应用实践证明了这种方法的有效性。
WW.W_PLC※JS_C,OM-PL,C-技.术_网

; Pseudo code to determine what baud rate a transmitter is at,
WWW_P※LCJS_CO※M-PLC-技-.术_网

on the b asis of a single

P.L.C.技.术.网——可编程控制器技术门户

; RETURN (0x0D) character received from it.

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

WW.W_PLCJS_COM-PLC-技.术_网

Initialise receive baud rate to 9600
WWW.PLCJS.COM——可编程控制器技术门户

Wait for Byte to be received
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

IF Byte = 0x00 THEN
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

   Start Timer
WWW_PLCJS@_COM%-PLC-技.术_网

   REPEAT
WWW_PLC※JS_COM-PmLC-技.术_网

   UNTIL (Timer > 50 ms OR New Byte Received)
WW.W_PLC※JS_C,OM-PL,C-技.术_网

   CASE Timer IN
W1WW_P4LCJS_COM-PLC-技.术_网

    1 ms-4 ms: 600 Baud
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

    5 ms-10 ms: 300 Baud
——可——编——程——控-制-器-技——术——门——户

      11 ms-15 ms: 150 Baud
WWW_PLCJS@_COM%-PLC-技.术_网

      16 ms-22 ms: 110 Baud
WW.W_PLC※JS_C,OM-PL,C-技.术_网

      23 ms-32 ms: 75 Baud
W1WW_P4LCJS_COM-PLC-技.术_网

      33 ms-49 ms: 50 Baud
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

       ELSE: Timed out; reset
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

  END CASE;
WWW_PL※CJS_COM-PLC-技.术_网

ELSIF Byte >= 0xF1 THEN
WWcW_PLCJS_COM-PLC-技.术_网

   19200 Baud
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

ELSE
WWcW_PLCJS_COM-PLC-技.术_网

  CASE Byte IN
WWW_PLCJS@_COM%-PLC-技.术_网

    0x0D: 9600 Baud
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

    0xE6: 4800 Baud
W1WW_P4LCJS_COM-PLC-技.术_网

    0x78: 2400 Baud
——可——编——程——控-制-器-技——术——门——户

  0xE0,0xF0: 1800 Baud
WW.W_PLC※JS_C,OM-PL,C-技.术_网

    0x80: 1200 Baud
WW.W_PLC※JS_C,OM-PL,C-技.术_网

    ELSE: Line noise; reset
WW.W_PLC※JS_C,OM-PL,C-技.术_网

  END CASE
WWW_PL※CJS_COM-PLC-技.术_网

END IF■
WWW_P※LCJS_CO※M-PLC-技-.术_网

参考文献:

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

[1]赵依军等. 单片微机接口技术[M].北京: 人民邮电出版社,1989.

plcjs.技.术_网

[2]刘利. 软硬件技术参考大全[M].北京: 学苑出版社,1993.
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

[3]张世一. 数字信号处理[M]. 北京:北京工业学院出版社,1987.
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

 

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

回到页顶

WWW.PLCJS.COM——可编程控制器技术门户

WW.W_PLC※JS_C,OM-PL,C-技.术_网

WWW_PLC※JS_COM-PmLC-技.术_网

评论内容
载入中...
载入中...
P
L
C



|










|


P
L
C









·最新招聘信息
·最新求职信息
·推荐产品
·推荐厂商
·栏目热门排行
·站内热门排行