精华内容
下载资源
问答
  • 串口通信波特率计算
    千次阅读
    2021-05-06 23:25:53

    串口通信之波特率计算

    在信息传输通道中,携带数据信息的信号单元叫作码元(因为串口是1bit进行传输的,所以其码元就代表一个二进制数),每秒通过信号传输的码元数称为码元的传输速率,简称“波特率”,常用符号“Baud”表示,其单位为“波特每秒”(Bps)。串口常见的波特率有4800、9600、115 200等,此处我们选用9600的波特率进行讲解。
    通信信道每秒传输的信息量称为位传输速率,简称“比特率”,其单位为“每秒比特数”(bps)。比特率可由波特率计算得出,公式为
    比特率=波特率×单个调制状态对应的二进制位数
    如果使用的是9600的波特率,其串口的比特率为
    9600Bps×1bit = 9600bps
    由计算得串口发送或者接收1bit数据的时间为一个波特,即1/9600s,如果用50MHz(周期为20ns)的系统时钟来计数,需要计数的个数为cnt = (1s×10**9)ns/9600bit)ns/20ns ≈ 5208个系统时钟周期,即每位数据之间的间隔要在50MHz的时钟频率下计数5208次。
    上位机通过串口发送8bit数据时,会自动在发8bit有效数据前发一个波特时间的起始位,也会自动在发完8bit有效数据后发一个停止位。同理,串口助手接收上位机发送的数据前,必须检测到一个波特时间的起始位才能开始接收数据,接收完8bit的数据后,再接收一个波特时间的停止位。

    更多相关内容
  • 摘要 对串行通信波特率自动识别的方法进行深入的研究和分析;创新性地提出在码元宽度捕捉的基础上,用求最大公约数的方法进行波特率的自动识别,实现了不对待测系统发送的数据进行特殊要求即实现其串行通信数据的...
  • 串口通信波特率

    千次阅读 2021-05-25 08:42:42
    但是在串口通信中,传输码元(符号)就是比特(bit),即波特率=比特率。 串口通信按照字节传输,1Byte到底有几位? 串口模式下,若波特率是9600,1秒种只能传送9600/10=960Byte数据,而不是9600/8=12.
    1. 波特率的定义
      波特率表示每秒钟传送的码元(符号)的个数,单位是波特(Baud,symbol/s)。
    2. 与比特率的关系
      通过不同的调制方式,可以在一个码元符号上负载多个bit位信息。
      在这里插入图片描述
      其中I为传信率,S为波特率,N为每个符号承载的信息量。比特率=波特率*单个调制状态对应的二进制位数。
      但是在串口通信中,传输码元(符号)就是比特(bit),即波特率=比特率=时钟周期的数值。
    3. 串口通信按照字节传输,1Byte到底有几位?
      串口模式下,若波特率是9600,1秒种只能传送9600/10=960Byte数据,而不是9600/8=1200Byte数据。
      这是因为在网络传输的时候为了区别一个字节的开始和结束需要在每个字节前加一位0,后面加一位1。其中有8个b是表示数据,另外2b是控制信息。在串口模式下传送数据,传送1Byte有效数据需要10位。
      在这里插入图片描述
    4. FPGA中的串口通信
      版权声明:本文为CSDN博主「Crazzy_M」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
      什么是波特率,波特率怎么计算

    假设系统时钟50M,波特率115200. 则传输1bit需要 1/115200s=8.68us。需要计数50*10^6/115200=434个。那么1Byte(串口传输格式为:1bit起始位+8bit数据位+1bit停止位)是不是循环计数10次434就可以传输完毕。
    在这里插入图片描述

    1. 什么时候去采样串口线上的数据呢?
        观察上图,Buad_Flag信号(通道2)表示了传输1Bit传输的间隔,每遇到1个Buad_Flag=1的信号,数据线上切换1次数据,所以两个Buad_Flag=1之间的数据是稳定的数据,根据抽样定理是不是应该在两个Buad_Flag=1信号的中间去采样数据呢,其实就是在1bit数据持续期间的中间点采样,才能得到最稳定的数据。
      ————————————————
    展开全文
  • 串行通信是终端和主机之间的主要通信方式,通信波特率一般选择1800、4800、9600和 19200等。终端的类型有很多种,其通信速率也有很多种选择。主机怎样确定终端的通信速率呢?
  • 串行数据通信是各种单片机多机应用系统和...文中提出了一种由从机自动适应主机波特率的新方法,此法方便实用,握手时间快。此方法成功地应用于SST89C54/58构成的IAP编程系统中,同样也适用于各种类型的单片机系统。
  • 随着计算机应用的日益普及,与计算机进行信息交互的终端也越来越多,其中串行通信是终端与计算机之间的主要通信方式。通常情况下,接收方必须知道发送方的发送速率,帧结构,并采用相同的速率及帧结构进行接收,才能...
  • 串行通信波特率的自动识别、电子技术,开发板制作交流
  • 如图,串口助手有两种模式,分别是hex模式和文本模式,但是我在测试发送数据时,16进制遇见了奇怪的现象. switch(tempbuf) { case 0: P2_0=0;//unsigned char tempbuf; break;//tempbuf = SBUF; ...

    如图,串口助手有两种模式,分别是hex模式和文本模式,但是我在测试发送数据时,16进制遇见了奇怪的现象.

    switch(tempbuf)
    				{
    					case 0: P2_0=0;//unsigned char tempbuf;
    					break;//tempbuf = SBUF;
    					case 15: P2_1=0;
    					break;
    					case 16: P2_2=0;
    					break;
    					case 48: P2_3=0;
    					break;
    					default: P2=0XFF;
    				
    				}

    代码如上,但是这个时候只要上电P2_0就会是低电平,可能是因为单片机变量初始化的时候就默认为0所导致的.

    所以我做了实验验证,定义一个变量,如果他为0,则P2=0;然后8灯全亮,结论成立.但是我在查资料时,发现还有例外.

    (7条消息) 51单片机有关变量及初始化问题_小黄瓜的博客-CSDN博客

    引用如下

    "如果定义一个变量,不对这个变量进行初始化,其变量默认初值为0。虽然大部分正确,但也是在一定条件下,即所有程序中所有变量占用的字节之和要小于128B,大于128B必须初始化,否则默认值是不确定。同时超过了128B还需要在keil 中重新设置存储器存储模式:

      1、small 

      2、compact

      3、large

    这三种也相当于最小模式下 定义变量用pdata 、 xdata  如 u8 pdata A[20],xdata u16 data[100] l来定义."

    于是重新设置初始化后继续操作,这次发现,我发送0-15数据时正确,但是发送16(0x10)

    单片机要么不亮,要么亮的错位.

    经过多方排查,发现是波特率设置错误

    我选择的是工作方式1,所以波特率计算公式为:波特率 =(2^SMOD / 32) * 定时器T1的溢出率,SMOD为PCON寄存器的最高位值(0或1)

    经过计算为2^0/32/(256-0xfd)*10000000=10416而我选择的波特率是9600,误差8%

    要解释原因,先看概念

    比特率(Bitrate)表示每秒钟传输的二进制位数,单位为比特每秒(bit/s)。

    波特率(Baudrate)表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标。

    码元是通讯信号调制的概念,通讯中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元。

    然后发送的符号通过高低电平实现,

     如图,5个码元,当波特率为5收到的数据为01010,化为16进制为A

    如果波特率为10,收到的数据变为0011001100,化为16进制为CC

    修改波特率后,问题解决.

    展开全文
  • 关于串口通信波特率的几点思考

    万次阅读 多人点赞 2017-11-05 20:43:41
    关于单片机串口通信波特率的缺点与思考

    首先想说,12MHZ真的是有问题。
    我使用的是
    STC89C52RC的单片机,他的最小系统板的的晶振是12Mhz,但是这个开发板上买的晶振就没写频率!!!我一直以为这是默认的11.0592Mhz,因为之前用的最小系统板都是这个频率。在没有使用串口通信的时候,不管是11.0592M还是12M,都对程序的影响不是很大,所以一直没有太注意这方面的问题。
    直到今天,需要用到UART串口通信,搞了快两天,输出到电脑端一直是乱码!!!真的差点都放弃了。现在想想幸好当时没有放弃。现在终于想通了。
    其实就是晶振的问题。实际上我的这个板子上是12Mhz,而书上和我在网上找到的例程上面都是按照11.0592M计算的。所以我在一个错误的基础上面,肯定找不到正确的出路。

    首先,通信波特率的定时器初值的计算公式:

    TH1 = TL1 = 256 - 晶振/12/16/波特率/2.

    如果写了PCON=0X80,就不需除2.,PCON为电源管理寄存器,他的最高位可以把波特率提高一倍。
    在这里 ,256是8位定时器的溢出值,也就是TL1的溢出值。12是说一个一个机器周期等于12个时钟周期,值得关注的是16,在51单片机内置的串口模块中,他采取的方式是把一位信号采集16次,然后把第7、8、9次取出来,如果这三次中其中有两次是高电平的话,就认定这一位数据是1,如果两次数据是低电平,就认为是0.这样可以提高通信的容错率。

    首先先说一下为什么波特率 要设置成4800,9600,19200等等类似这样的 数?为什么不是12345?我在一片博客中找到了可能的答案。
    传送门:http://blog.sina.com.cn/s/blog_6202cb4101011udd.html


    1:根据电、传输介质等的物理特性结合串口设备使用的要求
    为了保证有效通讯,根据电、传输介质等的物理特性结合串口设备使用的要求,确定RS232最大传输速率只能是115200,然后逐级二分得到57600,28800,19200……为适应这些速率,设计相应的晶振频率。
    2:这是由电信线路特性决定的
    电话线路的带通是300--3KHz,当时HAYES先搞的modem,所以用的2400HZ信号,对应波特率是2400。由于基本频率确定了,以后采用的提高通讯速率的方法都是在2400基础上倍频的,所以形成了9600,19200。

    不管哪种说法,都是先有波特率再有晶振频率。重点:先有波特率再有晶振频率!!!!

    也就是说,人们首先通过实验发现了合适的传输波特率,然后根据这个波特率及其倍频,计算出了合适的单片机时钟频率,也即是我们的晶振频率。

    使用多了会发现,采用这个公式计算的时候,有时候会出现小数点的情况。这也是为什么晶振使用11.0592的原因。当使用这个频率的晶振,计算的时候,基本不会出现小数点 。而使用12M的时候,很多小数点。

    那么我们先不管这个11.0592到底是怎么来的?我们就看一下这个频率和12M的频率的对比,他们分别使用的时候,计算出来的TH1的初值到底是多少。
    下面表格的数据是我通过上面的公式计算出来的。

     

    可以看出,在12M的时候,只有把波特率2400bps/s最合适,误差是0.16%,这样就不会产生乱码了,TH1和TL1都设为0xf3。其他小数点都不合适,四舍五入的话,误差率也比较大。9600的情况下会有7.8%的误差,所以会产生乱码,其实我试了一次,9600波特率的时候,无法实现传输。但是我不是很清楚他的这个误差是怎么算出来的,如果你看到这个,又恰巧你知道 这个问题,那么想麻烦你在下面回复一下,谢谢。

    在12M晶振下,我尝试了用2400波特率和4800波特率进行传输,结果如下,

    这是4800波特率的,可以看到,误差还是挺大的了。

     

    这是2400波特率的传输,发现基本没有错误:

     

    还有一点,就是我发现,在程序里面 是直接把那个公式写进去还是先自己算出来值化为16进制,在赋给TH1和TL1,这两种情况的传输效果是不同的。我估计就是因为12M晶振的问题,因为用公式算出来 的值小数点挺多的,会产生误差 ,而自己给的是一个确定的值。所以尽量自己先算出来,然后赋值,这样比较精确,实在不知道的话,就把小数点的尾数是进位还是舍去都试一遍,看看哪个的传输效率更高一点。

    下面是直接用公式的,发现误差很大。基本上收不到数据。

     

     2400的波特率计算公式也是一样,基本收不到数据,只有自己计算出来才行

     

    下面是在另一篇博客里的发现的相关内容:
    传送门:http://blog.163.com/cobain_731/blog/static/2060972022012330115642462/

    为什么51单片机的晶振一般使用11.0592?
    用11.0592晶振的原因是51单片机的定时器导致的。用51单片机的定时器做波特率发生器时,如果用11.0592Mhz的晶振,根据公式算下来需要定时器设置的值都是整数;如果用12Mhz晶振,则波特率都是有偏差的,比如9600,用定时器取0XFD,实际波特率10000,一般波特率偏差在4%左右都是可以的,所以也还能用STC90C516 晶振12M 波特率9600 ,倍数时误差率6.99%,不倍数时误差率8.51%,数据肯定会出错。 这也就是串口通信时大家喜欢用11.0592MHz晶振的原因,在波特率倍速时,最高可达到57600,误差率0.00%。 用12MHz,最高也就4800,而且有0.16%误差率,但在允许范围,所以没多大影响。

    总结:

    1、检查你的晶振频率,尽量自己先算出定时器初始值。然后赋给TH1。

    2、如果你的晶振是12Mhz的,那么很遗憾,虽然你的频率很高,但是当你使用UART串口的时候会很难受。只能选取2400,    0xf3,有一个小技巧,你也可以使用倍频,把PCON| = 0x80,然后使用4800.计算出来的值和2400一样,但是快了一倍。

    3、如果你的晶振是11.0592Mhz的话。也慢不到哪里去,普通需求还是可以满足的。但是他的优势体现在你使用UART串口的时候,很多波特率可以选择。所以就很nice。

    展开全文
  • 本软件大大的可以减少开发者的时间省略计算51串口波特率
  • RS-232 也称标准串口,最常用的一种串行通讯接口,比如我们的电脑主机的9针串口 ,最高速率为20kb/s RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其传送距离最大为约15米。所以RS-232适合本地设备之间的...
  • STM8L 串口通信波特率异常

    千次阅读 2018-12-14 15:03:50
    串口配置 2400/9600/57600/115200 波特率出现异常  使用16M时钟的时候,2400和115200不正常,乱码,但是在这中间频率又是好的;修改时钟才能适应不同时钟频率。。。;看寄存器配置是完全没有问题的。  经过分析,...
  • 实现功能:串口通讯程序波特率9600 使用芯片:STC15F104E 晶振:12MHZ 波特率:9600 编译环境:Keil
  • 430单片机串口通讯波特率计算的基础代码,有很详细的注释哦
  • 本人自己开发的计算波特率的小工具,方便实用。欢迎大家使用。可以设置集中晶振频率和各种波特率
  • 12M的晶振,为什么波特率为4800的时候正常,为9600的时候就发回来错误呢,求大佬解答/*波特率为9600*/#include "reg52.h"typedef unsigned int u16;typedef unsigned char u8;void UsartInit(){SCON=0X50;TMOD=0X20;...
  • 描述波特率(Baud Rate) 单位 bps -- 每秒传送的字节数 Byte Per Second.。(BaudRate) 模拟线路信号的速率,也称调制速率,以波形每秒的振荡数来衡量。如果数据不压缩,波特率等于每秒钟传输的数据位数,如果数据进行...
  • 51单片机串行波特率计算

    万次阅读 多人点赞 2019-06-19 21:48:58
    在这种方式下,数据从 RXD 端串行输出或输入,同步信号从 TXD 端输出,波特率固定不变,为振荡率的 1/12 。该方式是以 8 位数据为一帧,没有起始位和停止位,先发送或接收最低位。 常用于串行口外接移位寄存器,以...
  • 在分析单片机串行口及定时器特性的基础上,提出两种单片机与PC机之间波特率自动检测的 设计方案,即查表法和计算法。这两种方案简单、易行、可靠,尤其计算法不受系统主频的影响,在工程 实际中具有较高的实用价值
  • 最近买了一款lora传输模块,上面参数显示空中通信速率为2.4bps,我的串口设备波特率为115200,应该就等于比特率了吧?(2400小于115200) ,那意思是不是都没法正常传输了,求科普解惑
  • 串口通信波特率计算和连接图。通常在芯片或设备中为了监视或控制接口状态,都会引用到接口控制寄存器。SCON就是51芯片的串行口控制寄存器。它的寻址地址是98H,是一个可以位寻址的寄存器,作用就是监视和控制51...
  • 一、串行通信波特率是如何进行设置的? 51单片机工作在方式0和方式2的波特率是固定的,分别为、64或32。方式1和方式3的波特率是可变的,需由定时器产生,当T1作为波特率发生器时, 可推导出当SMOD=0时...
  • 单片机串口通信波特率计算

    万次阅读 2016-10-13 09:22:03
    在模式0和模式2下,串口波特率固定,模式0为Fosc/12。模式2为Fosc/32或Fosc/64,具体由PCON寄存器的SMOD位决定。 在模式1和模式3下,波特率是一个可变值,波特率可以由定时器1产生(8052可以由定时2产生),那么...
  • STC89C51 串口通信波特率设置

    千次阅读 2020-08-13 09:21:43
    STC89C51 串口通信波特率设置 //9600 T2L = 0xE0; //设定定时初值 T2H = 0xFE; //设定定时初值 //115200 T2L = 0xE8; //设定定时初值 T2H = 0xFF; //设定定时初值`
  • 单片机串行通讯波特率计算软件。可以选择晶振频率,计算TH0 TL0等等,使用方便。
  • 官方:我的理解:关于为什么加这种约定:二、计算波特率串口通信1.公式2.12M和11.05926M晶振区别3.串口通信收发代码三、总结 前言 很多同学在学习单片机过程中遇到了很多的问题,比如串口串口是单片机的一块...
  • 1. 运行 ttermpro.exe 串口超级终端软件,波特率115200 2. 连接开发板的串口到PC的串口(注间串口号一定要一致) 3. 开发板上电后数码管显示:0000,同时串口超级终端软件显示:“=======Ready=======”,这是收到...
  • 不管是什么单片机,在使用串口通信的时候,有一个非常重要的参数:波特率。什么是波特率波特率就是每秒传送的字节数。双方在传输数据的过程中,波特率一致,这是通讯成功的基本保障。下面以STM32单片机为例,讲解...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,228
精华内容 14,091
关键字:

串口通信波特率

友情链接: mytopforms.rar