串行通信方式:将数据字节分成一位一位的行驶在一条传输线上进行传输,如图:

异步串行通讯方式:异步串行通信数据格式一般为字符格式,一个字符一个字符(即一帧)地传输,每个字符一位一位的传输,各个位是以固定的时间(即波特率)传送的,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束,字符间的间隙没有固定的间隔要求。每一个字符的前面都有一位起始位(低电平),字符本身由5-7位数据位组成,接着字符后面是一位校验位(也可以没有校验位),最后一位或一位半或两位停止位,停止位后面是不定长的空闲位。其一帧字符信息由4部分组成:起始位、数据位、奇偶检验位、停止位。停止位和空闲位都规定为高电平,这样就保证了起始位开始处有一个下跳沿。

通讯的发送和接收设备使用各自的时钟控制数据的发送和接收,为使双方收发协调,要求发送和接收的时钟尽可能一致(即波特率要一致),所以收发设备都要保持一致的协议配置,波特率、停止位、数据位、校验位等。如图:

帧格式:

波特率:波特率即数据传速率,表示每秒传送二进制代码的位数,它的单位是b/s。波特率对于CPU与外界的通信是很重要的,假设数据传送的速率是120字符/s,而每个字符格式包含10个代码位(一个起始位,一个中止位、8位数据位D0-D7),这是传送的波特率为:10bit/字符*120字符/s = 1200 b/s。波特率即为1200 b/s。每一位的时间即为1/1200。

串行口结构:51单片机串行口是一个可编程全双工的通信接口,具有Uart(通用异步收发器)的全部功能,能同时进行数据的发送与接收,也可作为同步一位寄存器使用。其主要由两个独立的串行数据缓冲寄存器SBUF (一个发送,一个接收)和发送控制器、接收控制器,输入移位寄存器及若干控制门电路。如图:

上图中有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H,可同时发送、接收数据。发送缓冲器只能写入,不能读出;接收缓冲器只能读出,不能写入。

上图中可以看出,接收器是双缓冲结构,在前一个字节被从接收缓冲器SBUF读出之前,第二个字节即开始接收(串行输入至移位寄存器),但是,在第二个字节接收完毕而前一个字节CPU未读取时,会丢失前一个字节。

串行口的发送和接收都是以特殊功能寄存器SBUF的名义进行读、写的。当向SBUF发送“写”命令时(SBUF = num,假设num是我已经定义好的一个变量),即是向发送缓冲器SBUF装载并开始由TXD引脚向外发送一帧数据,发送完后发送中断标志位TI则自动置1。

在满足串行口接收中断标志位RI = 0的条件下,置允许接收位REN = 1,就会接收一帧数据进入移位寄存器,并装载到接收SBUF中,同时使RI = 1,当发读SBUF命令时(num = SBUF),便由接收缓冲器SBUF取出信息通过89c51内部总线送CPU。

对于发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误,一般不需要用双缓冲结构来保持最大传送速率。

串口方式1:10位数据异步通讯口,1起始,8数据,1停止,TXD(P3.1)为数据发送引脚,RXD(P3.0)为数据接收引脚。其传输波特率可变,对51而言,波特率有定时器1的溢出率而决定,一般而言,在单片基于单片机,单片机与计算机,计算机与计算机串口通讯时,基本都市选择方式1,所以此种方式必须掌握

串口方式1的编程实现:

方式1数据输出时序图如下:

当数据被写入SBUF寄存器后,单片机自动开始从起始位发送数据,发送到停止位的开始时,由内部硬件将TI置1,向CPU申请中断,接下来可在中断服务程序中进行相关处理。

接收过程中,数据从输入移位寄存器右边移入,起始位移至输入移位寄存器的最左边,
控制电路进行最后一次移位,当RI=0且SM2=0(或结收到的停止位为1)时,
将接受到的9位数据前8位数据装入接收SBUF,第九位(停止位)进入RB8,并置RI=1,向CPU申请中断,

串行口控制字及控制寄存器

SCON:

SM0、SM1工作方式控制位

SM2:多机通信控制位,1-允许、0-不允许;主要用于方式2和方式3。

REN:串行接收允许位(相当于串行接收的开关,在串行通信接收控制过程中,如果满足RI = 0和REN = 1的条件,就允许接收。)。1-允许、0-不允许

TB8:发送数据第九位

RB8:接收数据第九位

TI:发送中断标志位,在一帧数据发送完时被置位。在串行发送到停止位的开始时由硬件置位,可用软件查询。它同时也申请中断。TI置位意味着向CPU提供“发送缓冲器SBUF已空”的信息,CPU可以准备发送下一帧数据。串行口发送中断被响应后,TI不会自动清0,必须软件清0.

RI:接收中断标志位,接收中断标志,在接收到一帧数据后由硬件置位。当RI = 1时,申请中断,表示一帧数据接收结束,并已装入接收SBUF中,要求CPU取走数据,CPU响应中断,取走数据。RI位也必须由软件来清0。

串行发送中断标志TI和接收中断标志RI是同一个中断源,CPU事先不知道是发送中断TI还是接收中断RI产生的中断请求,所以,在全双工通信时,必须由软件来判别。复位时SCON所有位都清0.

小结: 
此处意在理解串口传输的几个要点: 
①串口数据由TX和RX(发送和接收)两根数据线组成。 
②串口数据在51单片机内,是由SBUF寄存器来存储的,且每次只能存储一位(即一个字节)。 
③串口数据发送过程:读SBUF,将一位数据从TX传送出去,同时发送完毕TI置1。 
④串口数据接收过程:写SBUF,将一位数据从RX接收进来,同时接收完毕RI置1。 
⑤虽然从程序上看都是SBUF,但实际上内部读操作和写操作是针对不同的寄存器操作的。 
⑥无论是单片机内部串口间传输、与外部串口传输,数据均可先存入存储区(如数组,flash等),然后逐位传输。

串口数据接收举例:

串口数据接收与发送都应该做成一个完整的数据包,包括包头、数据长度、数据位、校验位等;

接收一包数据不能只考虑接收一包正确的数据,还应考虑如果收到错误的数据、不完整的数据等该怎么处理,如下:

/******************************************************************************************************************
*@brief: 串口接收中断函数
*@param:
*@return:
*@descriptions: 数据收到包头0xA5开始接收指定长度的数据
*               1、有数据但没有包头0xA5,则丢弃不接收
*               2、数据有包头0xA5,但数据大于指定长度,则只接收指定的长度,多余的丢弃
*               3、数据有包头0xA5,但数据小于指定长度或50ms内没有收到完整的数据包,则不做处理
*               4、正常收到一包数据,但立即又收到一包正常的数据包,则后一包数据丢弃
********************************************************************************************************************/
uint8 UartFlagRxE = 0;  /*一包数据接收完成*/
uint8 UartRxIndex = 0;
uint8 UartRxHead =0;
uint8 UartFlagRxErr =0; /*数据出错标志位,0表示没有错;1表示数据出错*/
uint8 UartFlagRxRrrCount =0; /*数据出错计数,收到错误数据,50ms后重新开始*/
xdata uint8 UartRxPackage[UART_RX_BUFF_LEN];
xdata uint8 UartTxPackage[UART_TX_BUFF_LEN];
void uart_interrupt()  interrupt 4
{if(RI ==1)  /*接收完一个字节,RI就被硬件置一,需软件清零*/{RI =0;   /*清中断准备接收下一字节*/if(UartFlagRxE == 0)  /*解决注释中第4个问题,当UartRxPackage处理完后,UartFlagRxE会置零,才可以接收新的数据*/{if(UartRxHead ==0)  {if(SBUF0 == 0xA5) /*检测到包头*/{                   UartRxHead =1;       /*置一,下一个字节就在下一段程序保存*/UartRxIndex = 0;        /*数组指针从0开始缓存*/UartRxPackage[UartRxIndex++] =SBUF0;   /*保存包头*/ }}else{UartRxPackage[UartRxIndex++] =SBUF0; /*保存剩余的数据*/                 if(UartRxIndex >= UART_RX_PACK_LEN)  /*一包数据接收完成*/{UartRxHead = 0;            /*接收完一包数据,从0开始重新接收*/              UartFlagRxE =1;   /*接收完一包数据*/UartFlagRxErr = 0;}else    /*收到包头开始计时50ms内没有收到完整的数据包,视为数据错误,清零重新开始;UartRxHead变量要置零*/      {UartFlagRxErr = 1;UartFlagRxRrrCount = 0;/*可在定时器中计时*/}} }           }
}

可能会遇到的问题:

  • 初始化后,发送一串初始化信息,如“UartSendString("uart_init");”,串口助手接收的是“art_init”,‘u’没有接收到;可能是串口初始化时TI被置一了(TI = 1;),应该TI被置零的(TI= 0)。

使用UART作为数据传输需要注意:

  • 发送方的数据封装;接收方的数据解析
  • 收到错误数据该怎么处理;
  • 收到数据比正常一包数据要大,该怎么处理;
  • 收到一包数据,包头正确,后面数据不完整,该怎么处理;

51单片机的UART应用相关推荐

  1. 51单片机入门——UART串口通信

    文章目录 前言 1.什么是串行通信 2. USB转串口通信 3. IO 口模拟 UART 串口通信 4 UART串口通信的基本应用 4.1 通信的三种类型 4.2 UART模块 4.3 UART 串口 ...

  2. 【自学51单片机】11 -- UART串口通信

    文章目录 1.串行通信的初步认识 2.USB转串口通信 3.UART串口通信的基本应用 3.1 通信的三种基本类型 3.2 UARM模块介绍 3.3编写UART串口步骤及程序 4.串口调试助手 5.通 ...

  3. 51单片机C语言波特率十六进制,理解51单片机串口通信的波特率与USB转串口通信...

    RS232 在我们电脑上,一般都会有一个9针的串行接口,这个串行接口叫做RS232接口,它和UART通信有关联,但是由于现在笔记本电脑不带9针串口,所以和单片机通信越来越趋于使用USB虚拟串口. 九针 ...

  4. 51单片机串口通信模板_深入理解51单片机串口通信及通信实例

    串口通信的原理 串口通信(SerialCommunications)的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一 ...

  5. 51单片机开发系列一-51单片机开发环境搭建以及入门汇编代码

    51单片机开发系列一 51单片机开发环境搭建以及入门汇编代码 象棋小子    1048272975 1. 51单片机概述 51单片机是对所有兼容Intel 8031指令系统的单片机的统称.目前教科书基 ...

  6. 基于51单片机的无线遥控器制作

    基于51单片机的无线遥控器制作 资源链接:https://download.csdn.net/download/qq_41676952/10965512 目前单片机渗透到我们生活的各个领域,几乎很难找 ...

  7. AutoLeaders控制组——51单片机学习笔记(定时器、串口通信)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...

  8. 51单片机串口向电脑发送数据

    声明:本人跟随b站江科大学习,我的所有文章仅记录我的学习总结,以防我以后忘了,有地方回忆,况且江科大的资料都是开源的.我也希望大家多多去看江科大的视频,讲的是真的好,我的文章仅限看过视频学习过的,过段 ...

  9. 51单片机IO模拟UART

    一. IO模拟UART发送 串口通信属于 串行 异步 半双工的通信模式 1. 最近在调试一个IO模拟UART的程序,把调试过程中遇到的问题总结一下.对于UART的发送部分(主机模式)还是比较容易实现的 ...

最新文章

  1. Spring中SmartLifecycle和Lifecycle的作用和区别
  2. 同一个Spring-AOP的坑,我一天踩了两次,深坑啊
  3. linux公社 java算法_Java快速排序算法
  4. SQL Server索引进阶第十篇:索引的内部结构
  5. #获得请求来源ip_以太网数据包TCP、IP、ICMP、UDP、ARP协议头结构详解
  6. flutter字体不跟随系统_Flutter自定义字体无法加载
  7. expo运行android studio,一、用Expo开发react-native :快速开始
  8. php画弧,php绘制一条弧线的方法
  9. jupyter notebook matplotlib绘制动态图并显示在notebook中
  10. 单片机练习 - 计时器
  11. GD32F450以太网(1):ETH 外设接口简介
  12. 百度网盘不限速方法 直接跑满带宽
  13. 容器安全技术容器发展历程
  14. ZLG震撼发布开源GUI引擎AWTK
  15. 技术干货 | 网易云信大规模聊天室系统架构解析
  16. pdfbox将pdf转换成图片时,提示STSong-Light字体缺失:No glyph for 20154 (CID 0ca6) in font STSong-Light
  17. arduino获取TDS数据再由ESP01发送到服务器,微信小程序显示
  18. 天空卫士监控行为显示叉_天空卫士发布统一内容安全解决方案,助力企业数据安全...
  19. 分析paypal 电子礼品卡提交模式
  20. 电动汽车充电桩资料搜集

热门文章

  1. 阅读《精通Python爬虫框架Scrapy》
  2. excel vba如何在不打开的情况下获取.pdf文件的打印页码数
  3. 163邮箱会员揭秘,163邮箱注册,你最想了解的几件事
  4. 什么是运维?运维开发需要做哪些事情?
  5. 计算机考研11408总分418上岸攻略
  6. 计算机磁盘密码解锁,Bitlocker加密磁盘但是没有密码加密,我的电脑是专业版
  7. ESP8266用点灯app接入小爱同学
  8. 创作者基金 11 月亮点
  9. 【uniapp】将uni-app开发的安卓程序运行到雷电模拟器上进行调试
  10. VRChat简易教程4-使用VRC的接口实现物体的移动(VRC的action和trigger接口)