一.stm32使用hal库串口接收发送测试

2023-05-16

一.hal库串口接收发送测试

1、串口的模式有3种,一是查询模式,二是中断模式,三是DMA模式

HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制
HAL_UART_Receive();串口轮询模式接收,使用超时管理机制
HAL_UART_Transmit_IT();串口中断模式发送
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Transmit_DMA();串口DMA模式接收

2、阻塞传输是调用这个函数并在等待时间内一直等待操作完成。
HAL_UART_Transmit
HAL_UART_Receive
查询的方式一般少用,这里不做过多介绍。
3、串口中断
串口中断函数
HAL_UART_TxHalfCpltCallback();一半数据发送完成时调用
HAL_UART_TxCpltCallback();数据完全发送完成后调用
HAL_UART_RxHalfCpltCallback();一半数据接收完成时调用
HAL_UART_RxCpltCallback();数据完全接受完成后调用
HAL_UART_ErrorCallback();传输出现错误时调用

.在串口中定义相关变量

uint8_t RxBuffer;//接收中断缓存
uint8_t Uart_RxBuffer[256];//接收中断
uint8_t Uart_RX_Cnt = 0;//接收中断计数
uint8_t AlmStr[]="Uart1数据溢出(大于256)!rn";//UART1 错误信息输出

在main的主循环外开启中断
HAL_UART_Receive_IT(&huart1,(uint8_t*)&RxBuffer,1);//开启接收中断

串口接收回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  UNUSED(huart);
  if(Uart_RX_Cnt >= 255)  //溢出判断
  {
     Uart_RX_Cnt = 0;
	memset(Uart_RxBuffer,0x00,sizeof(Uart_RxBuffer));//清空缓存,记得#include "string.h"
	HAL_UART_Transmit(&huart1, (uint8_t *)&AlmStr, sizeof(AlmStr),0xFFFF);

  }
 else
 {
	Uart_RxBuffer[Uart_RX_Cnt++] = RxBuffer;   //接收数据转存
	if((Uart_RxBuffer[Uart_RX_Cnt-1] == 0x0A)&&	(Uart_RxBuffer[Uart_RX_Cnt-2] == 0x0D)) //判断结束位
    {

		HAL_UART_Transmit(&huart1, (uint8_t *)&Uart_RxBuffer,Uart_RX_Cnt,0xFFFF); //将收到的信息发送出去

		Uart_RX_Cnt = 0;
	memset(Uart_RxBuffer,0x00,sizeof(Uart_RxBuffer)); //清空数组
    }
}
     HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxBuffer, 1);   //再开启接收中断
}

到这里中断方式的串口接收(并发送)完成。


二.重定向问题
函数版:
/*
  * 函数功能: 重定向c库函数printf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
*/

int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}
/*
  * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx 
  * 在串口上输入时,最后需要加空格,才能被存储
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无 
 */
int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  return ch;
}

寄存器版:
/*重定向Printf函数*/  
int fputc(int ch,FILE *f)  
{  
    return (SendChar(ch));  
}  
/*重定向Scanf函数*/  
int fgetc(FILE *f)  
{  
   return (SendChar(GetKey()));  
    /*调用scanf()在串口中输入数据时,必须以空格结束,否则无法完成发送*/  
}
int SendChar(int ch)  
{  
    while(!(USART1->SR & USART_FLAG_TXE));  
    USART1->DR = (ch & 0x1FF);  
    return ch;  
}  
int GetKey(void)  
{  
    while(!(USART1->SR & USART_FLAG_RXNE));  
    return ((int)(USART1->DR & 0X1FF));  
}  

主函数的循环体演示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实测代码:https://download.csdn.net/download/weixin_44386927/13772536

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一.stm32使用hal库串口接收发送测试 的相关文章

随机推荐

  • python的模块与包的关系

    模块和包的概念 python中的模块 xff0c 其实就是一个python的文件 xff0c 包含了很多类和函数 xff0c 基本上都是可以向外调用的 xff0c 或者整个文件都用来处理某个操作 xff0c 我们使用库和框架就是由模块和包构
  • 一小时学会Python基础练习的十四个练手题

    目录 1到100的加法搬家具办公室人员分配猜拳游戏乘公交车吃苹果九九乘法表烤地瓜奇偶100内相加三角形正方形文件备份学员管理系统 xff08 函数版 xff09 学员管理系统 xff08 面向对象版 xff09 mainmangerSyst
  • ROS Topic (话题通信总结)

    拿到一个功能包 xff0c 先运行一下 xff08 以turtlesim为例子 xff09 xff1a rusrun turtlesim turtlesim node 然后使用 rqt graph 和rostopic list 大致了解有哪
  • vector函数用法

    一维 基本用法 xff1a 1 头文件 include lt vector gt 2 创建vector对象 xff0c vector lt int gt vec 3 尾部插入数字 xff1a vec push back a 4 使用下标访问
  • Jetson nano串口的使用——UART

    UART串口使用两条杜邦线就可以实现数据发送和接收 xff0c 可以很方便的与其他扩展进行数据连接 xff0c 比如微雪的L76X GPS HAT就可以直接连接40Pin的GPIO接口通过UART串口进行数据传递 接下来具体说明Jetson
  • Python中[-1]、[:-1]、[::-1]、[n::-1]、[:,:,0]、[…,0]、[…,::-1] 的理解

    在python中会出现 1 1 1 n 1 0 0 1 xff0c 他们分别是什么意思呢 xff0c 这里就来详尽的说一下 xff1a 下面的a 61 1 2 3 4 5 1 xff1a 列表最后一项 1 xff1a 从第一项到最后一项 原
  • 贴片电阻字码阻值对照表

  • 使用sphinx生成python项目文档

    1 pip install sphinx 2 sphinx quickstart 3 修改 conf py import os import sys sys path insert 0 os path abspath 39 39 确保mod
  • 免费商用字体有哪些

    免费商用字体有哪些 一 思源字体 xff0c 可以免费商用的有 思源黑体 xff0c 思源宋体 xff0c 思源柔黑体 二 方正字体 xff0c 方正类字体可以免费商用的有 xff1a 方正仿宋 xff08 简 xff0c 繁 xff09
  • Qt:16进制字符串数据转整数数值函数

    span class token comment 16进制字符串数据转整数数值 span span class token keyword int span Setting span class token operator span sp
  • ESP-12F开发环境

    ESP 12F可以使用arduino IDE快速开发 1 首先安装arduino IDE xff1a 搜索直接下载即可 2 在文件 gt 首选项 gt 附加开发板管理器网址中添加ESP8266开发板 xff1a 网址 xff1a http
  • 第1章 电子设计与制作基础

    1 电子系统的分类 模拟电子系统数字电子系统模拟 数字混合系统微处理器 xff08 单片机 嵌入式 xff09 电子系统 2 电子系统的定义 通常 xff0c 将由电子元器件或部件组成的能够产生 传输 采集或处理电信号及信息的客观实体称为电
  • python requests timeout参数

    首先发一下牢骚 xff1a 不管是抄袭还是转载 xff0c 有点新东西行不行 xff0c 一味的转载有什么用呢 xff1f 东西还以那点东西 xff0c 让想解决问题的人查看一些一摸一样的文章 xff0c 只会浪费查询者的时间 况且 xff
  • c++配置http/post请求接收json数据

    照着教程编译操作都没问题 首先是配置curl库 给一个别人的编译链接curl库 vs2017 xff1a 亲测可用 c 43 43 编译curl库 测试代码 xff1a span class token macro property spa
  • c++ 编译过程

    c 43 43 编译过程引入 常见 xff1a 用gcc g 43 43 指令生成可执行文件 xff0c 对于大点的项目 xff0c 则是 xff1a configure span class token function make spa
  • c和c++有什么不同呢???

    区别联系 其实说起C和C 43 43 的区别 xff0c 我相信很多人其实立马就能脱口而出 xff1a C是面向过程编程的语言 xff0c 而C 43 43 是面向对象的编程语言 C是一个结构化语言 xff0c 重点在于算法和数据结构 xf
  • 关于stm32f4上对(28byj-48)步进电机的应用控制和解读。

    1 关于stm32f4上对 xff08 28byj 48 xff09 步进电机的应用控制和解读 xff08 1 ULN2003驱动模块电路 步进电机不能直接和单片机连接 xff0c 需要对应驱动模块提供电机所需的电流 电路图分析 xff1a
  • 对于stm32仿真器下载程序事常见的问题(No Target Connected 错误和SWD/JTAG Communication Failure错误)解决方案。

    一 对于stm32仿真器下载程序事常见的问题 xff08 No Target Connected 错误和SWD JTAG Communication Failure错误 xff09 解决方案 xff08 1 xff09 出现这种问题的本质是
  • 在CSDN写博客12年了,提几点建议

    从2020开始到现在一年多没有更新了 xff0c 一方面是在工作中burn out了 xff0c 其次是站在程序员的视角 xff0c CSDN的变化我认为一些地方有待改进 先说首页 头条 热点 内容有待提高 之前的首页内容有很多 纯技术的内
  • 一.stm32使用hal库串口接收发送测试

    一 hal库串口接收发送测试 1 串口的模式有3种 xff0c 一是查询模式 xff0c 二是中断模式 xff0c 三是DMA模式 HAL UART Transmit 串口轮询模式发送 xff0c 使用超时管理机制 HAL UART Rec