文章目录

  • 寄存器及自定义变量
    • 状态寄存器
      • USART_SR
      • USART_RX_BUF[USART_REC_LEN]
      • u16 USART_RX_STA
  • 串口初始化
    • uart_init(u32 bound)
  • 串口中断函数
    • USART1_IRQHandler(void)
  • 主函数

寄存器及自定义变量

状态寄存器

USART_SR

主要关注该状态寄存器的以下两位:TC与RXNE。
TC:发送完成状态位。若置位,则代表串口发送完成
RXNE:读数据寄存器非空。若置位,则代表串口接收到数据

USART_RX_BUF[USART_REC_LEN]

定义该项为数组,用于接收缓存

u16 USART_RX_STA

该项为用户定义的变量,在本程序中将其视为寄存器,各个位定义如下:
bit15:接收完成标志位
bit14:接收到0x0D的标志位
bit13~0:数据位

串口初始化

uart_init(u32 bound)

void uart_init(u32 bound)
{//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);    //使能USART1,GPIOA时钟//USART1_TX   GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9//USART1_RX     GPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;       //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   //收发模式USART_Init(USART1, &USART_InitStructure); //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART1, ENABLE);                    //使能串口1
}

串口中断函数

USART1_IRQHandler(void)

void USART1_IRQHandler(void)                 //串口1中断服务程序
{u8 Res;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res =USART_ReceiveData(USART1);   //读取接收到的数据if((USART_RX_STA&0x8000)==0)//接收未完成{if(USART_RX_STA&0x4000)//接收到了0x0d{if(Res!=0x0a){USART_RX_STA=0;//接收错误,重新开始}else{USART_RX_STA|=0x8000;    //接收完成了}                                }else //还没收到0X0D{   if(Res==0x0d){USART_RX_STA|=0x4000;}else{USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;USART_RX_STA++;if(USART_RX_STA>(USART_REC_LEN-1)){USART_RX_STA=0;//接收数据错误,重新开始接收    }}         }}          }
}

代码运行逻辑:
首先判断状态寄存器USART_SR的RXNE状态,若置位,则代表接收到数据;
然后将接收到的数据放入Res中;
然后判断接收是否完成:根据自定义的变量USART_RX_STA的bit15和bit14位是否为1来判断是否接收到了回车键,若接收到了回车键,则接收完成,跳出中断函数。若没有接收完成,则将Res中的数据放入自定义数组USART_RX_BUF[]中,数组位数为USART_RX_STA&0X3FFF(USART_RX_STA的bit0~bit13位代表数据长度,bit14和bit15位为回车标志位)。

主函数

if(USART_RX_STA&0x8000)
{                      len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度printf("\r\n您发送的消息为:\r\n\r\n");for(t=0;t<len;t++){USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束}printf("\r\n\r\n");//插入换行USART_RX_STA=0;

基于stm32F103ZE单片机的USART串口使用相关推荐

  1. PIC单片机学习—USART串口

    PIC单片机学习-USART串口 最近做了几个项目都用到了PIC单片机,在这几个项目之前我只用到了51单片机和STM32来做控制类的项目,用PIC单片机的时候发现使用的时候和51单片机还是有所区别,有 ...

  2. 基于51单片机的双机串口通信排队叫号系统(LCD显示)设计

    基于51单片机的双机串口通信排队叫号系统(LCD显示)设计 1 开发环境 视频讲解 2 功能说明介绍 3 仿真图 4 程序 5 原理图 6 视频讲解 7 设计报告 7.1 设计目的 7.2 设计要求及 ...

  3. 基于STM32F407的HMI USART串口屏步进电机控制程序

    目录 前言 一.效果 二.屏幕设计 三.部分代码 1.main.c 2.usart.c 3.其余代码 总结:参考+工程代码 前言 前段时间老师给了我一个项目,让我用HMI USART串口屏控制步进电机 ...

  4. 基于单片机串口远程多路温湿度采集仿真-基于单片机ADC0809八路电压采集系统设计-基于单片机16x32点阵多模式显示仿真设计-基于单片机餐厅呼叫控制系统仿真设计-基于STM32单片机的智能水杯设计

    1220基于单片机ADC0809八路电压采集系统设计-毕设课设资料 数码管显示,测量八路电压表. #define addo (5.0/255.0) #define zero 0.005 //用于校准A ...

  5. 基于STM32安装Stm32CubeMX,配合Keil完成LED流水灯和USART串口通讯程序,及其管脚的时序波形观察

    目录 一.使用HAL库完成LED流水灯 (一).用STM32CUBEMX生成工程文件 (二).用Keil仿真调试并生成hex文件 (三).用STM32串口烧录程序 (四).实物连接 二.使用HAL库完 ...

  6. sTC8G1K08+通过串口显示内部电压_基于51单片机的数字电流电压表

    请点上面蓝色字    即可免费订阅!  1.简述 本文介绍了基于STC89C52单片机为核心,分别以ACS712-05芯片和串联分压电路为为电流检测和电压检测电路,并通过AD0809数模转换芯片对电压 ...

  7. 单片机红外通信c语言,基于C语言的计算机与多单片机红外无线串口通信的实现.doc...

    基于C语言的计算机与多单片机红外无线串口通信的实现 基于C语言的计算机与多单片机红外无线 串口通信的实现 黄文亮 信息学院 电子信息工程专业 指导教师 刘传菊 摘要:计算机与一台或多台单片机的通信系统 ...

  8. 基于51单片机的多路温度检测调节串口传输系统

    本设计基于51单片机的多路温度检测调节串口传输系统(仿真+源码+视频讲解) 仿真:proteus8.9 程序编译器:keil 4 编程语言:C语言 编号C0009 [腾讯文档]C0009 网盘链接 资 ...

  9. K_A11_002 基于STM32等单片机驱动DS18B20串口与OLED0.96双显示

    K_A11_002 基于STM32等单片机驱动DS18B20 串口与OLED0.96双显示 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 时序 对应程序: 四.部分代码说明 1.接 ...

最新文章

  1. 大型高并发高负载网站的系统架构(转)
  2. 安装Typora情况下,Windows右键新建菜单中增加新建md文件
  3. GPG96244QS1屏驱动难题
  4. try代码块中出现异常后try内程序会继续执行还是直接抛出异常?
  5. ajax请求php省略后缀,如何在PHP中更安全地处理Ajax请求?
  6. 胜利大逃亡 三维BFS
  7. transform、accumulate —— C++ 下的 MapReduce
  8. 汉字笔画动图怎么做_怎么用flash制作汉字笔顺的动画
  9. HTML流式布局是什么,什么是流式布局?流式布局是什么意思?
  10. Angular学习笔记第三章——创建组件
  11. PS:成功解决点击PS中的裁剪工具时,整张图片消失掉或者整张图片变的及其小的问题
  12. 小米手机第三方卡刷软件_小米Max卡刷教程_小米Max用recovery刷第三方系统包
  13. Clickhouse 各种工具函数知识 -<日期函数>
  14. java 字符串转时间,时间转字符串
  15. 解决PS中:无法将图片存储为Web存储格式,及如何将图片大小修改成10KB的问题
  16. globalmapper如何选取图像上的点_图像去雾的算法历史与综述
  17. matlab排序函数——sort
  18. OncoImmunity成为获得机器学习新抗原预测技术临床应用CE-IVD标记的首家公司
  19. php 知道面积怎么算周长,CAD怎么计算面积和周长
  20. 实例二:上海房屋2017年成交信息分析

热门文章

  1. 徐州大学路用两年时间超越了北京路
  2. 数字量输入扩展模块支持modbus
  3. 论文实证方法Stata应用2023
  4. AtCoder题解——Beginner Contest 170——E - Smart Infants
  5. php修改table样式,CSS怎么设置table边框样式
  6. uglifyjs 压缩js代码使用指南
  7. 【文学文娱】《人间七月是晴天》
  8. 2020高校专业就业热度指数发布,计算机科学与技术排名第一
  9. 弘毅一体计算机配置似乎是正确的但,浙江省杭州市2020届高三4月份模拟考试语文试题[答案][含答案]...
  10. 操作系统(十五)——mmap