串口速率,我拿什么识别你?

发布者:心连心意最新更新时间:2014-10-09 来源: 21ic关键字:UART  串口  通信协议  单片机 手机看文章 扫描二维码
随时随地手机看文章
UART串口,作为单片机最常用的通讯接口已经深入每一个嵌入式工程师的脑海。UART串口有着简单、实用的特性,嵌入式工程师常常用来将其作为调试系统的重要工具。UART串口的配置参数有很多,但是最常用,且需要修改的参数只有通讯波特速率这一个。可是这仅有的一个参数又常常给我们带来许多困扰。那么,我们对于串口波特速率该如何识别呢?笔者在这里介绍三种识别串口速率的方法,供大家参考。

UART(Universal Asynchronous serial Receiver and Transmitter)异步串行接收/发送接口,是嵌入式系统里最为重要的接口之一,它不仅用于板级芯片之间的通讯,而且应用于实现系统之间的通信和系统调度中。UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输,其字符数据帧格式如下图所示:

1.jpg

图1 UART字符数据帧格式

从上面图中的帧格式可以看出,UART数据帧由1个开始同步位,1个数据字,1个结束停止位,以及可选的校验位组成。由于UART为异步通讯,因此,其按位发送时必须严格遵守设定的波特率,而接收方也必须在相同的波特率下才能正确解析发送的字符数据。于是,接收方正确识别、配置波特率就相当关键了。下面笔者根据实际经验介绍三种识别串口波特率的方法:

穷举法

理论上,发送波特率可以设定为任意的值,但是平时我们使用的串口速率只有这么几种数值,如图2所示:

2.jpg

图2 常用串口波特速率

既然知道了常用串口速率,于是我们就可以一个一个试,总会有一个是成功。当然前提是我们知道主机发送的内容是什么,否则如何才能知道串口速率正确匹配呢!这里必须注意,在设定波特率与实际波特率成倍数的情况下,是可以读出来数据——当然,数据是错误的。

示波器法

示波器被秒为电子工程师的“眼睛”,我们可以就用这双眼睛来“看”出串口发送数据的波特率。这里我们先排除掉高端的带有数字逻辑分析功能的示波器,因为,这样的示波器已经远超笔者的IQ了,不是我们本篇讨论的内容。

上一部分,我们讲述了波形的帧格式,这里我们就利用波形,发送一个特殊的字符0x55(1010 1010B)。从理论上面分析,这个波形应该会产生一个按位翻转的波形效果。图3是笔者使用示波器采集下来的截图:

3.jpg

图3 9600bps发送0x55波形图

看到图3所示的波形图,再加上理论分析,我们知道波形是按位翻转,于是我们使用示波器的指针功能(cursor)来直接查看波特率。如图3左上角的测量结果显示,每位翻转的频率为9.615KHz,与我们设定的频率9600kbps基本相符,可以确定此发送频率为9600bps。

芯片自识别法

UART串口常常用来做为固件升级使用的接口,因此,其波特率要根据上位机的实际情况而定。如果环境较差时,就需要使用低波特率的通讯。这时,自动波特率识别的方法就诞生了。下面我们以TI Stellaris里bootloader里的串口波特率自动识别源程序为例进行分析:

int UARTAutoBaud(unsigned long *pulRatio){

long lPulse, lValidPulses, lTemp, lTotal;

volatile long lDelay;

// 配置systick,将其值设定为最大值;

HWREG(NVIC_ST_RELOAD) = 0xffffffff;

HWREG(NVIC_ST_CTRL) = NVIC_ST_CTRL_CLK_SRC | NVIC_ST_CTRL_ENABLE;

// 打开引脚的边沿触发中断

HWREG(GPIO_PORTA_BASE + GPIO_O_IBE) = UART_RX;

// 使能UART RXD引脚边沿触发中断

HWREG(NVIC_EN0) = 1;

// 采集引脚边沿中断,两个字节的边沿

while(g_ulTickIndex < MIN_EDGE_COUNT)

{

}

// 计算systick采样下来的值,对溢出进行处理

for(lPulse = 0; lPulse < (MIN_EDGE_COUNT - 1); lPulse++){

lTemp = (((long)g_pulDataBuffer[lPulse] -

(long)g_pulDataBuffer[lPulse + 1]) & 0x00ffffff);

g_pulDataBuffer[lPulse] = lTemp;

}

// 此循环计算两个连续脉冲之间的宽度

for(lPulse = 0; lPulse < (MIN_EDGE_COUNT - 1); lPulse++){

// 精确计算两个连续脉冲之间的宽度

lTemp = (long)g_pulDataBuffer[lPulse];

lTemp -= (long)g_pulDataBuffer[lPulse + 1];

if(lTemp < 0) {

lTemp *= -1;

}

// 验证两个边沿的脉宽是否正确,其算法如下:

// abs(Pulse[n] - Pulse[n + 1]) < Pulse[n + 1] / PULSE_DETECTION_MULT

// 或者

// PULSE_DETECTION_MULT * abs(Pulse[n] - Pulse[n + 1]) < Pulse[n + 1]

if((lTemp * PULSE_DETECTION_MULT) < (long)g_pulDataBuffer[lPulse + 1]) {

lTotal += (long)g_pulDataBuffer[lPulse];

lValidPulses++;

}

else{

lValidPulses = 0;

lTotal = 0;

}

// 7个有效脉冲,就可以计算UART串口速率

if(lValidPulses == 7) {

// 将最后一个脉冲加入计数器,并计算波特率

lTotal += (long)g_pulDataBuffer[lPulse];

*pulRatio = lTotal >> 1;

// 返回成功标识

return(0);

}

}

// 检测失败

return(-1);

}

UART串口有着这样或者那样的优点,但新兴的USB接口的USB DFU功能可以更加有效替代串口来完成固件升级;性能优越的CAN总线,其硬件价格不断下降,而且CAN总线的MAC接口更多集成在最新MCU芯片上;CAN2.0B接口正在挤压着UART接口器件的市场;对于我们普通民众,现在新型号电脑已经没有DB9串口座。在残酷的现实下,多年后也许只有我们电子工程师才会记得曾经的简单、实用的UART串口。

关键字:UART  串口  通信协议  单片机 引用地址:串口速率,我拿什么识别你?

上一篇:单片机数据通信之单总线数据传输
下一篇:复位监控知多少

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

基于C51单片机的MP3播放器设计与实现
0 引言     便携式MP3播放器作为一种集音频播放、数据存储为一身的数码产品,其功能结构为电子设计人员所津津乐道。MP3是MPEG一1音频III(1ayerIII)的简称。MPEG一1音频(ISO/IECll 172—3)是目前普遍应用的音频压缩标准,其中层III的算法最为复杂,但压缩比最大,效果也最好,在低码率的条件下基本能达到CD的音质效果。MP3标准用尽可能低的码流实现CD音质的声音而不会产生数据损失。如果对于一段声音不进行压缩的话,那么每存储一秒钟的立体声CD音质音乐必须用1.4Mbit,这是个十分大的开销。通过运用MPEG音频标准的压缩技术,我们可以把存储空间压缩到原来的1/12而不会降低声音的音质。即使使用1/
[嵌入式]
基于ISP的AT89S系列单片机下载器的制作
一、ISP程序下载器硬件连接图 ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码, 而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程。利用ISP技术,将编译好的目标文件直接下载到单片机中运行,不需要另购编程器,降低了初学者者的实验成本。ISP技术是未来发展的方向 。 目前市场上不少的单片机具有ISP功能。 ATMEL公司最近新推出的AT89SXX系列单片机也提供了一个SPI串行接口,让用户能对内部程序存储器编程(ISP)。以下是串口对89S51及89S52 ISP编程的软件及最简单的硬件连接方法。 结合上位机的软
[单片机]
基于ISP的AT89S系列<font color='red'>单片机</font>下载器的制作
滴滴报警声 单片机c程序
#include reg51.h sbit p10=P1^0; unsigned char c; bit p; main() { TR0=0; TMOD=0X01; TH0=0XFC; TL0=0X18; EA=1; ET0=1; TR0=1; while(1){} } void isr() interrupt 1 { TH0=0XFC; TL0=0X18; if(p!=1)
[单片机]
51单片机A/D转换接口扩展,做一个16进制显示的电压表
遇到的问题如下:第二个数码管不亮,电平跳变都是对的。 如果在中断的P1,P2赋值那一块加上死循环两个数码管就都能亮了, 但是不能时刻测电压值了,纠结。 道编程如下: #include reg51.h unsigned char tab = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; unsigned char xdata *ADC; unsigned char num, s, g, sum; void delay(unsigned int Delay) { unsigned
[单片机]
ZigBee-CC2530单片机 - 低功耗运行
程序源码 #include ioCC2530.h #define LED1 P1_0 // P1_0定义为P1_0 #define LED2 P1_1 // P1_0定义为P1_1 #define SW1 P1_2 //SW1端口宏定义 enum SYSCLK_SRC { RC_16MHz,XOSC_32MHz }; enum POWERMODE { PM_IDLE,PM_1,PM_2,PM_3 }; /************************************************************** 函数名称:delay 功 能:软件延时 入口参数:time--延时循
[单片机]
51单片机如何模拟串口之计数法
简介:51的计数器在每指令周期加1,直到溢出,同时硬件置溢出标志位。这样我们就可以通过预置初值的方法让机器每96个指令周期产生一次溢出,程序不断的查询溢出标志来决定是否发送或接收下一位。 计数法 分 析: 51的计数器在每指令周期加1,直到溢出,同时硬件置溢出标志位。这样我们就可以通过预置初值的方法让机器每96个指令周期产生一次溢出,程序不断的查询溢出标志来决定是否发送或接收下一位。 接收的程序,可以参考下一种方法,不再写出。这种办法个人感觉不错,接收和发送都很准确,另外不需要计算每条语句的指令周期数。 view plaincopy to clipboardprint? //计数器初始化 void S2INI(voi
[单片机]
基于CIP-51内核单片机的总磷在线自动分析仪
   1 概述   C8051F0XX系列单片机是Cygnal公司新推出的一种混合信号系统级单片机。该系列单片机片内含CIP-51的CPU内核,它的指令系统与MCS-51完全兼容。其中的C8051F020单片机含有64kB片内Flash程序存储器,4352B的RAM、8个I/O端口共64根I/O口线、一个12位A/D转换器和一个8位A/D转换器以及一个双12位D/A转换器、2个比较器、5个16位通用定时器、5个捕捉/比较模块的可编程计数/定时器阵列、看门狗定时器、VDD监视器和温度传感器等部分。C8051F020单片机支持双时钟,其工作电压范围为2.7~3.6V(端口I/O,RST和JTAG引脚的耐压为5V)。与以前的51系列单
[单片机]
基于CIP-51内核<font color='red'>单片机</font>的总磷在线自动分析仪
s3c2440串口使用
一、串口通信原理 UART:Universal Asynchronous Receiver/Transmitter(通用异步收发送器),用来传输串行数据,发送数据时,CPU将并行数据写入UART,UART按照一定格式在TxD线上串行发出;接收数据时,UART检测到RxD线上的信号,将串行收集放到缓冲区中,CPU即可读取UART获得的这些数据。 UART最精简的连线形式只有3根线,TXD用于发送,RXD用于接收,GND用于提供参考电平。UART之间以帧作为数据传输单位,帧由具有完整意义的若干位组成,它包含开始位、数据位、校验位和停止位。发送数据之前,互相通信的UART之间要约定好数据传输速率(波特率的倒数)、数据的传输格式(
[单片机]
s3c2440<font color='red'>串口</font>使用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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