必威体育Betway必威体育官网
当前位置:首页 > IT技术

串口、波特率等概念

时间:2019-08-24 03:12:10来源:IT技术作者:seo实验室小编阅读:85次「手机版」
 

波特率

1:比特率:9600bps

就是每秒中传输9600bit,也就是相当于每一秒中划分成了9600等份。

如此,那么每1bit的时间就是1/9600秒=104.16666666666666666666666666667us。约0.1ms。既然是9600等份,即每1bit紧接着下一个比特,不存在额外的间隔。也不管是啥起始bit,数据bit,奇偶bit,停止bit。

2:帧格式,帧间隔。

电脑里,也就是超级终端等的端口设置。电脑的默认端口设置,也就是默认帧格式是:8个数据bit,1个停止bit,(起始1bit是必须的)默认无奇偶,无流控。

则实际就是10bit为1帧。一秒中可以发送9600/10=960个帧,也就是960字符,因为一帧里只有1个字符,1字符就是帧里面的8个数据bit

3:串口通讯

串口当然可以连续,没有时间间隔地发送帧,默认情形下电脑在9600bps下可以发送960帧。

但在实际工作中,在异步通讯下,一般需要一个交互过程,所以,电脑发送一个帧,或者若干帧,还需要等待从设备的应答,并不是一直发送的。有问有答地实现编程者的目标。

4:波特率时钟

实际上是比特率时钟,每1bit所要花费的时间周期。而波特率(实际是比特率)发生器生成的分频时钟实际是对每1bit进行采样的时钟,它是波特率时钟的16倍。

波特率发生器实质是设计一个分频器,用于产生和RS232通信同步的时钟。在系统中用一个计数器来完成这个功能,分频系数N决定了波特率的数值。该计数器一般工作在一个频率较高的系统时钟下,当计数到N/2时将输出置为高电平,再计数到N/2的数值后将输出置为低电平,如此反复即可得到占空比50%的波特率时钟,具体的波特率依赖于所使用的系统时钟频率和N的大小。如系统时钟频率是40MHz,要求波特率是9 600[MS1],则16倍波特率时钟的周期约等于260个系统时钟周期,则计数器取260/2=130时,当计数溢出时输出电平取反就可以得到16倍约定波特率的时钟。

(liupeng)

也可以这么理解:40mhz晶振,最小计数脉冲是25ns,16倍波特率的频率就是16*9600,其时钟周期就是1/(16*9600)=6.5us也就是以40mhz晶振作为输入的话,计数器需要计数=6500/25=260 个计数。

9600波特率也可理解为一种波特时钟频率,即1秒钟计数9600个,如果是16倍波特率时钟,即直接相乘就可以了。就是1秒计数9600*16=153600。

1/(9600*16)除以(1/40000000)也就是以时钟周期除了最小时钟周期得到的就是计数的个数。简化而言就是40000000/(9600*16)=260,也就是频率直接相除就得到要分频计数器计数的个数。

[MS1]

40000000/(9600*16)=260.4

串口通信必须要设定波特率,本设计采用的波特率为9 600bit/s。产生波特率的时钟频率是越高越好,这样才可产生较高且精确的波特率。设计选用50M主频率要产生9600bit/s波特率,每传送一位数据需要5208.33个时钟周期。取一个最接近的数是5 208,则波特率为9600.61,其误差约为0.006%,误码率很低可以确保通信正常。

( liupeng 50000000/5208=9600.61)

5: 误差允许范围

6:分频系数

计数器很容易实现分频。可用lpm-counter实现。

比如分频系数是2,那么,直接用q0作为输出即可。如果分频系数是4,那么q0,q1作为有效比特。

总而言之,要n整数分频,即计数n后清零重计数。至于50%占空比则另外考虑。奇数分频似不易实现50%占空比。

篇二 : 串口波特速率 如何识别你?

UART串口,作为单片机最常用的通讯接口已经深入每一个嵌入式工程师的脑海。[)UART串口有着简单、实用的特性,嵌入式工程师常常用来将其作为调试系统的重要工具。UART串口的配置参数有很多,但是最常用,且需要修改的参数只有通讯波特速率这一个。可是这仅有的一个参数又常常给我们带来许多困扰。那么,我们对于串口波特速率该如何识别呢?笔者在这里介绍三种识别串口速率的方法,供大家参考。 UART(Universal Asynchronous serial Receiver and Transmitter)异步串行接收/发送接口,是嵌入式系统里最为重要的接口之一,它不仅用于板级芯片之间的通讯,而且应用于实现系统之间的通信和系统调度中。UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输,其字符数据帧格式如下图所示:

UART字符数据帧格式

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

穷举法

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

常用串口波特速率

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

示波器法

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

上一部分,我们讲述了波形的帧格式,这里我们就利用波形,发送一个特殊的字符0x55(1010 1010B)。从理论上面分析,这个波形应该会产生一个按位翻转的波形效果。图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串口。

相关阅读

支商第一团队创始人、“支付宝营销”、“支商”概念提

支付宝商业,英文名称Alipay Business,简称支商,和&ldquo;智商&rdquo;谐音,最早提出&ldquo;支商&rdquo;概念的是全扫教育董事长唐江山

新概念英语第一册 (1)

New  Concept English    Unit 1   Excuse  me! 一个unit 是2个lesson             new  words and  expressions ex

串口通信-MSComm控件使用详解

MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。MSComm控件在串口编程时非常方便,程序员不必去花时间去了解

架构设计---soa与msa的概念

1. 前言随着现在互联网行业的发展,越来越多的框架、中间件、容器等开源技术不断地涌现,更好地来服务于业务,实现业务并解决问题。然

马桶MT:私密社交概念评测

今天快播的创始人王欣出狱后,发布了第一款面向社交市场的产品,让我们从社交场景的角度来看看这款产品其核心到底有无突破?一、产品综

分享到:

栏目导航

推荐阅读

热门阅读