串行通信波特率的一种自动检测方法

发布者:莫愁前路最新更新时间:2012-06-06 来源: 21IC 关键字:自动检测  波特率  发送速率 手机看文章 扫描二维码
随时随地手机看文章

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

1 基本方法
  回车符的ASCII值为0x0D。串行通信时附加一个起始位和终止位,位的传输顺序一般是 先传低位再传高位。此时回车符的二进制表示方式为:

图1 回车符的位序列

  串行通信中一个二进制位的传输时间(记为T)取决于通信的波特率,9600波特时一个 二进制位的传输时间是19200波特时一个二进制位传输时间的两倍,即:2*T19200=T 9600。因此,9600波特时一个位的传输时间,19200波特时可以传输两个位。同样地 ,9600波特传输两个位的时间在4800波特时只能传送一个位。主机设定接收波特率为9600, 终端只有也以9600波特发送的字符,主机才能正确地接收。发送波特率高于或低于9600都会 使主机接收到的字符发生错误。接收波特率为9600,终端以不同的波特率发送回车符时,主 机接收到的二进制序列如表1所示。
  从表1中可以看出,除了19200和1800波特时两种特例情况,其他情形的二进制序列都是 9600波特时二进制序列的变换。取前十个二进制位与9600波特时的二进制位相对应。忽略缺 少停止位‘1’引发的数据帧错误,把接收到的字符表示成字节方式(如表1的最右列所示) 。例如:在发送速率为1200波特,接收速率为9600波特时,主机得到的字节是0x80,而不 是正确的回车符0x0D。因为在不同的发送速率下(9600,4800,2400,1200)得到的字节 不同,所以通过接收字符的判定就可以确定发送波特率。
  发送波特率为19200时,其发送速度正好是接收速度(9600波特)的两倍,因此发送端 的两个二进制位会被接收端看作一个。取决于不同的串行接口硬件,‘01’和‘10’这两种 二进制位组合可能被认为是‘1’或者‘0’。幸运的是,只有0~4位存在这样的歧义问题, 后面的位因为都是停止位,所以都是‘1’。因此,发送速率为19200波特时接收到的字符其高半个字节为0xF。低半个字节可能是多个值中的一个,但不会是0x0,因为0x0D中有相邻 的两个‘1’,这就会至少在低半个字节中产生一个‘1’。因此,整个字节的形式为0xF?, 且低半个字节不为0。

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

波特率

接收到的二进制位序列

字节表示

19200

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

0xF?

9600

0 1  0 1  1 0  0  0 0  1 

0x0D

4800

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

0xE6

2400

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

0x78

1800

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

0xE0

1800

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

0xF0

1200

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

0x80

600

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

0x00

300

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

0x00

150

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

0x00

110

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

0x00

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

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

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

波特率

9600波特二进制序列

时间差
(周期)

时间差
(实时间)

600

16 0\'s 16 1\'s 16 0\'s

32

3.33ms

300

32 0\'s 32 1\'s 32 0\'s

64

6.66ms

150

64 0\'s 64 1\'s 64 0\'s

128

13.33ms

110

87 0\'s 87 1\'s 87 0\'s

174

18.13ms

75

128 0\'s 128 1\'s 128 0\'s

256

26.66ms

50

192 0\'s 192 1\'s 192 0\'s

384

4 0.00ms

  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 实现方式
  通过以上分析,各种波特率都可以通过回车符的发送和接收信息来测定,算法实现的伪 代码在本文的最后给出。应用实践证明了这种方法的有效性。
; Pseudo code to determine what baud rate a transmitter is at,

on the b asis of a single

; RETURN (0x0D) character received from it.

Initialise receive baud rate to 9600
Wait for Byte to be received
IF Byte = 0x00 THEN
   Start Timer
   REPEAT
   UNTIL (Timer > 50 ms OR New Byte Received)
   CASE Timer IN
    1 ms-4 ms: 600 Baud
    5 ms-10 ms: 300 Baud
      11 ms-15 ms: 150 Baud
      16 ms-22 ms: 110 Baud
      23 ms-32 ms: 75 Baud
      33 ms-49 ms: 50 Baud
       ELSE: Timed out; reset
  END CASE;
ELSIF Byte >= 0xF1 THEN
   19200 Baud
ELSE
  CASE Byte IN
    0x0D: 9600 Baud
    0xE6: 4800 Baud
    0x78: 2400 Baud
  0xE0,0xF0: 1800 Baud
    0x80: 1200 Baud
    ELSE: Line noise; reset
  END CASE
END IF■

参考文献:

[1]赵依军等. 单片微机接口技术[M].北京: 人民邮电出版社,1989.
[2]刘利. 软硬件技术参考大全[M].北京: 学苑出版社,1993.
[3]张世一. 数字信号处理[M]. 北京:北京工业学院出版社,1987

关键字:自动检测  波特率  发送速率 引用地址:串行通信波特率的一种自动检测方法

上一篇:基于可编程逻辑阵列的RS232至RS422的串行口扩展电路
下一篇:混合逻辑电平的接口技术

推荐阅读最新更新时间:2024-03-16 13:01

S3C2410串口波特率的计算
要正确计算串口波特率,首先要搞清楚芯片的时钟工作原理,这部分在s3c2410/s3c2440datasheet上写的比较详细,但对新手来说结合thisway同志 s3c2410完全开发流程 中的TIMER和CLOCK两个实验,边做实验边看资料,更容易理解。 我这里只根据我的失败经验谈一下设置波特率寄存器UBRDIVn的值的计算要注意的一个问题。 datasheet上UBRDIVn寄存器部分写着: UART BAUD RATE DIVISOR REGISTER There are three UART baud rate divisor registers including UBRDIV0, UBRDIV1 and UBRDIV
[单片机]
晶振对波特率的影响到底有多大?让你见识见识
片机中的晶振在整个内部电路中发挥着重要的作用,电路配合晶振的运行能够产生单片机所需的时钟频率。可以说,一切指令都是建立在时钟频率的基础上,那么,晶振与波特率又有什么关系呢?两者之间影响到底有多大呢? 在串行通信中,MCS 51串口可约定四种工作方式。其中,方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率决定。 波特率是指串行端口每秒内可以传输的波特位数。这里所指的波特率,如标准9600不是每秒种可以传送9600个字节,而是指每秒可以传送9600个二进位,而一个字节要8个二进位,如用串口模式1来传输,那么加上起始位和停止位,每个数据字节就要占用10个二进位,9600波特率用模式1传输时,每秒传
[单片机]
晶振对<font color='red'>波特率</font>的影响到底有多大?让你见识见识
单片机 MSP430 串口 计算 波特率
软件计算波特率地址: http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSP430BaudRateConverter/index.html MSP430怎么计算波特率在各手册都有提到,但始终不清楚,直到看了官网的一篇文章: https://processors.wiki.ti.com/index.php/USCI_UART_Baud_Rate_Gen_Mode_Selection The formulas for calculating USCI UART Baud Rate Register Values are basically available
[单片机]
单片机 MSP430 串口 计算 <font color='red'>波特率</font>
模拟串口自动测量波特率的单片机程序
我这个程序能够测量串口的波特率,并且将自身的波特率设置到通讯波特率。 这个在STC89C52/STC15F104(其实主要针对STC15F104,因为它没有串口)上面通过。不过因为是模拟串口,在11.0592 12T的情况下,最多到19200。 然后在STC15F104上面,要适量的减少补偿值…… 顺便说一句,编译器建议使用sdcc。keil的SB printf函数搞死我了……在22.1184 6T的情况下大约能到57600. 当然在STC15F系列到115200毫无压力,可是是半双工的。要做全双工只能减倍波特率…… 测量波特率的方法很简单。校准他的波特率的方法就是发送没有连续低电平的字符,类似0x55/0xff/0x7f之类的。
[单片机]
TMS320F240与PC机串行通讯的设计
  1 引言   TMS320F240系列是美国TI公司于1997年推出的,专为数字电机控制和其它控制应用系统而设计的16位定点数字信号处理器。它将数字信号处理的高速运算功能与面向电机的强大控制能力结合在一起,从而成为传统的多微处理器单元和多片设 计系统的理想替代品。F240片内外设包括双10位A/D转换器,带有锁相环PLL时钟模块,带中断的看门狗定时器模块,串行通信接口SCI及串行外设接 口SPI,另外,还集成了一个事件管理模块EVM。因此,TMS320F240不仅具有高速数据处理能力,还具有控制和事件管理能力,可完成人机界面、与 上位机进行串行通信等功能。   2 TMS320F240串行通信接口简介   TMS320F
[测试测量]
自动检测系统原理应用及其发展状况
1 引言   所谓自动检测,是指由计算机进行控制对系统、设备和部件进行性能检测和故障诊断,是性能检测、连续监测、故障检测和故障定位的总称。现代自动检测技术是计算机技术、微 电子技术 、信息论、控制论、测量技术、 传感技术 等学科发展的产物,是这些学科在解决系统、设备、部件性能检测和故障诊断的技术问题中相结合的产物。凡是需要进行性能测试和故障诊断的系统、设备、部件,均可以采用自动检测技术,它既适用于电系统也适用于非电系统。 电子设备 的自动检测与机械设备的自动检测在基本原理上是一样的,均采用计算机/微处理器作控制器通过测试软件完成对性能数据的采集、变换、处理、显示/告警等操作程序,而达到对系统性能的测试和故障诊断的目的。   
[测试测量]
<font color='red'>自动检测</font>系统原理应用及其发展状况
一种薄膜电路故障的自动检测系统
     摘 要: 自动视觉检测系统利用了数字图像处理技术,是一种高速、准确、无损的方法,目前得到了广泛的应用。概述了这一领域的研究成果,并根据多层薄膜电路的实际情况,提出了一种参考和非参考比较相结合的故障检测与分类方法,并以此为基础构造了一个微机实时检测系统。     关键词: 薄膜电路 参考比较 非参考比较     电路制造技术正朝着将更多的集成电路安装在一块PCB电路板上的方向发展,从而使PCB的尺寸增大、层数增多;同时,电路板本身也变得越来越小、越来越复杂。由于这些原因,生产及更换它们的成本也越来越高。所以,需要相应的质量控制手段,使每一层上的线路都能够在上一层铺设之前被检查。在这里,自动视觉检测能够以相对
[测试测量]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved