一.在HAL库中使用串口(dma)模式接收发送测试

2023-05-16

1.串口DMA的配置:DMA作为一种数据传输的工具,主要在串口中起到传输数据的作用。配置dma时需要将接收设置成循环模式,发送为正常模式。在串口中断中处理数据。
在这里插入图片描述
在这里插入图片描述
2.代码补充

在usart.h中
#define BUFFER_SIZE  200  //数组容量大小 
extern  volatile uint8_t rx_len ;  //接收一帧数据的长度
extern volatile uint8_t recv_end_flag; //一帧数据接收完成标志
extern uint8_t rx_buffer[200];  //接收数据缓存数组

extern void DMA_Usart1_Send(uint8_t *buf,uint8_t len);//dma发送
extern void DMA_Usart1_Send(uint8_t *buf,uint8_t len);//dma接收
usart.c中添加
 volatile uint8_t rx_len ;  //接收一帧数据的长度
 volatile uint8_t recv_end_flag; //一帧数据接收完成标志
 uint8_t rx_buffer[200];  //接收数据缓存数组

 void DMA_Usart1_Send(uint8_t *buf,uint8_t len);//dma发送
 void DMA_Usart1_Send(uint8_t *buf,uint8_t len);//dma接收

int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

//在usart初始化函数中添加的代码
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //使能IDLE中断
//DMA接收函数,此句一定要加,不加接收不到第一次传进来的实数据,是空的,且此时接收到的数据长度为缓存器的数据长度
HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);
usart.c中添加
void DMA_Usart1_Send(uint8_t *buf,uint8_t len)//串口发送封装
{
 if(HAL_UART_Transmit_DMA(&huart1, buf,len)!= HAL_OK) //判断是否发送正常,如果出现异常则进入异常中断函数
  {
   Error_Handler();
  }
}

void DMA_Usart1_Read(uint8_t *Data,uint8_t len)//串口接收封装
{
   HAL_UART_Receive_DMA(&huart1,Data,len);//重新打开DMA接收
}
usart.c中添加
uint8_t rx_tmp[BUFFER_SIZE]={0};
uint16_t lens=0,Flags=0;
//串口一中断函数
void USART1_IRQHandler(void)
{

    uint32_t tmp_flag = 0;
    uint32_t temp;
    tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志位

    if((tmp_flag != RESET))//idle标志被置位
    { 
      __HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位
      //temp = huart1.Instance->SR;  //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能
      //temp = huart1.Instance->DR; //读取数据寄存器中的数据
      //这两句和上面那句等效

      HAL_UART_DMAStop(&huart1); //停止传输
      temp  =  __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); // 获取DMA中未传输的数据个数   
      //temp  = hdma_usart1_rx.Instance->NDTR;
      //读取NDTR寄存器 获取DMA中未传输的数据个数,
      //这句和上面那句等效
      rx_len =  BUFFER_SIZE - temp;
      //总计数减去未传输的数据个数,得到已经接收的数据个数
      recv_end_flag = 1; // 接受完成标志位置1
      }
      if(recv_end_flag == 1)  //接收完成标志
      {
       // DMA_Usart1_Send(rx_buffer, rx_len);
        memcpy(rx_tmp,rx_buffer,rx_len);
        Flags=19;
        rx_len = 0;//清除计数
        recv_end_flag = 0;//清除接收结束标志位
        //清接收缓存
        memset(rx_buffer,0,rx_len);
      }
	HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);//重新打开DMA接收
  	HAL_UART_IRQHandler(&huart1);
}

在main.c中添加
extern uint16_t lens,Flags;
extern uint8_t rx_tmp[BUFFER_SIZE];

uint8_t Senbuff[] = "Output Message by "; //定义数据发送数组

//直接通过串口dma发送
 DMA_Usart1_Send((uint8_t *)Senbuff, sizeof(Senbuff));
	if(Flags==19)
		{
			printf("pc debug print:%s ",rx_tmp);
		    memset(rx_tmp,0,BUFFER_SIZE);
		    Flags=10;
		}


uint16_t  get_uart2_data(unsigned char *pd,unsigned short *len)
{
	//接收完成标志 
	if(as==19)
	{
		*len=200;
		memcpy(pd,rx_tmp,200);
		//printf("pc debug print:%s ",rx_tmp);
		printf("pc debug print:%s ",pd);
	    memset(rx_tmp,0,200);
	    as=10;
		return 1;
     }	
	return 0;
}


源码:https://download.csdn.net/download/weixin_44386927/56833040
在这里插入图片描述

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

一.在HAL库中使用串口(dma)模式接收发送测试 的相关文章

  • HTTP报文是什么

    x1f4e2 x1f4e2 如果说http是因特网的信使 xff0c 那么http报文就是他用来送信的包裹了 1 x1f4da 什么是报文 在度娘的介绍中 x1f4e3 报文 message 是网络中交换与传输的数据单元 xff0c 即站点
  • STM32串口接收数据处理方法

    STM32串口接收数据处理方法 STM32串口接收定长数据处理方法 STM32串口接收定长数据的处理方法非常简单 xff0c 我目前做项目都是用的这个 xff0c 也可用做处理MODBUS协议 xff0c 直接上代码 span class
  • VScode常用命令

    VScode 的常用快捷键和插件 一 VScode 的常用快捷键 1 注释 xff1a a 单行注释 xff1a ctrl 43 k ctrl 43 c 或 ctrl 43 b 取消单行注释 xff1a ctrl 43 k ctrl 43
  • 彻底搞懂线程、进程、多线程、多进程和多任务的关系

    首先 xff0c 从定义开始 xff0c 先看一下教科书上 进程和线程定义 xff1a 进程 xff1a 资源分配的最小单位 线程 xff1a 程序执行的最小单位 心中默念 xff0c 啥啥啥 xff0c 写的这是啥 1 进程 进程是程序执
  • vmware-workstation-and-device-credential-guard-are-not-compatible

    1 off hyper v feature 2 bcdedit set hypervisorlaunchtype off
  • Ubuntu下配置Multipath TCP(MPTCP)By内核下载(一)

    一 MPTCP介绍 多路径TCP xff08 MPTCP xff09 是一种通过修改TCP来实现同时使用多个IP地址 接口方法 xff0c MPTCP向应用程序提供常规的TCP接口 xff0c 同时实际上跨多个子流传播数据 这样做的好处包括
  • 解决Ubuntu20.04插入英伟达计算卡后无法开机问题-Ubuntu双显卡切换

    解决Ubuntu20 04插入英伟达计算卡后无法开机问题 Ubuntu双显卡切换 问题详述问题分析问题解决 ubuntu双显卡切换 问题详述 本人新配了一台个人使用的机器学习服务器 对环境配置可能有影响的硬件如下 xff1a 华硕B660M
  • python PyQt5使用QT designer不显示问题

    初学Pyqt5记录走过 的坑 xff01 1 窗口自适应 xff1a 窗口自适应我的理解就是使用栅格布局 xff0c 调整后会根据窗口大小调整比例 先把自己需要的截面放在UI上 xff0c 然后使用栅格布局即按Ctrl 43 r即可预览 x
  • opencv跑yolo报错Failed to parse NetParameter file

    64 TOC cv2 error OpenCV 3 4 5 opencv 3 4 5 modules dnn src darknet darknet importer cpp 214 error 212 Parsing error Fail
  • Java自学

    JAVA自学 一 需要掌握的知识点二 资源中心 教程 练习 三 工作要求 图片 一 需要掌握的知识点 java基础 xff08 多线程 IO xff08 nio xff0c bio xff0c aio xff09 xff09 各种数据结构
  • python解析DataMatrix Code二维码

    span class token comment 安装 span span class token triple quoted string string 39 39 39 sudo apt get install libdmtx0a pi
  • SpringBoot中使用自定义异常Exception

    记录一下SpringBoot中使用自定义异常操作方法 代码如下 创建ServiceException class span class token keyword public span span class token keyword c
  • kafka的安装与使用(一)

    kafka的安装与使用 xff08 一 xff09 最近接触消息中间件 xff0c 把使用过程中记录一下 xff01 1 下载与安装 任何文档都要以官方文档为准 xff0c 英文多看两眼你会发现比上次更加熟悉了 xffe3 xffe3 xf
  • 【GITEE】解决 Push rejected

    问题背景 xff1a 更新了台式电脑后 xff0c 从gitlee上拉了代码 xff0c 重新push后就一直报错 xff1a Push single to origin single was rejected by remote 问题解决
  • 一小时学会Python3爬虫基础(二)基础语法 输入输出 关键字 注释

    目录 前言集成环境 编辑器基本语法缩进换行标识符关键字注释输入 输出总结 前言 python作为一门编程语言 xff0c 也跟其他语言一样有自己的逻辑语法 xff0c 那什么是语法 xff1f 跟人一样每个人都有自己说话一套方法 集成环境
  • windows 生成self-sign证书

    打开powershell 管理员身份运行 New SelfSignedCertificate CertStoreLocation Cert LocalMachine My DnsName 34 mysite local 34 Friendl
  • 一小时学会Python3爬虫基础(四)完整解析格式化输出和数据类型转换

    目录 前言格式化输出格式化符号 s格式化函数format格式化表示 f string 转义符和结束符 n意思就是 换行 new line t 叫做水平制表符 tab xff0c r 是回车符carriage return结束符 数据类型转换
  • 一小时学会Python3爬虫基础(七)高级数据的全部操作:字典

    目录 前言字典1 字典格式2 创建有效字典2 创建空字典3 字典类型转换 字典增加和修改1 增加2 修改 字典查找1 key键查找2 get 3 keys 4 values 5 items 字典循环遍历1 遍历字典的key值2 遍历字典的v
  • Python处理异常代码的基本操作,原来都大同小异!

    目录 什么是异常 xff1f 如何捕获异常 xff1f 1 异常的写法2 捕获指定异常3 捕获多个异常4 捕获异常的描述5 捕获所有异常6 异常的else7 finally8 自定义异常模块9 异常传递思路 总结 什么是异常 xff1f 简
  • 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
  • 一.在HAL库中使用串口(dma)模式接收发送测试

    1 串口DMA的配置 xff1a DMA作为一种数据传输的工具 xff0c 主要在串口中起到传输数据的作用 配置dma时需要将接收设置成循环模式 xff0c 发送为正常模式 在串口中断中处理数据 2 代码补充 在usart span cla