ROS stm32F4串口+DMA通信

2023-11-14

介绍

本博文基于stm32F407,利用uart3发送数据,并由uart3接收ROS通过串口发送的数据后由uart1发送回ROS。以下,主要针对于调试过程中的问题的总结

发送数据错位

发送协议:

0 1 2 …11
0xaa 0xa DATA

初始化:

MYDMA_Config_Inter(DMA1_Stream3,DMA_Channel_4,
				  (u32)&USART3->DR,(u32)TxBuffer,
				  TxBufferSize,DMA1_Stream3_IRQn, DMA_DIR_MemoryToPeripheral);

主函数使能uart3发送

USART_DMACmd(USART3, USART_DMAReq_Tx, ENABLE);
MYDMA_Enable(DMA1_Stream3, TxBufferSize);    

在代码中要注意初始化发送的大小应该和在主函数使能发送的大小应该一致,如果不一致会出现数据错位,导致ROS在解析数据的过程中会把后续接收的数据过程中,直接认为数据不对而直接丢弃数据。

uart接收

在调试过程中,一开始只开启了空闲中断,但是一直出现ROS第一次发送的数据无法接收,而后续的数据可以接收到。后面才发现空闲中断无法接收第一次发送的数据。
解决方法:
初始化时开启接收中断,进入接收中断后在开启空闲中断并关闭接收中断

void USART3_IRQHandler(void) {
	// 空闲中断
	if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET) {
		
		DMA_Cmd(DMA1_Stream1, DISABLE);

		DMA_ClearFlag(DMA1_Stream1, DMA_FLAG_TCIF1|DMA_FLAG_FEIF1|DMA_FLAG_DMEIF1
					 |DMA_FLAG_TEIF1|DMA_FLAG_HTIF1);
		DMA_SetCurrDataCounter(DMA1_Stream1, USART_REC_LEN);
    	DMA_Cmd(DMA1_Stream1, ENABLE);
  }
	// 接收中断
	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) {
		
		DMA_Cmd(DMA1_Stream1, DISABLE);
		
		DMA_ClearFlag(DMA1_Stream1, DMA_FLAG_TCIF1|DMA_FLAG_FEIF1
					 |DMA_FLAG_DMEIF1|DMA_FLAG_TEIF1|DMA_FLAG_HTIF1);
		DMA_SetCurrDataCounter(DMA1_Stream1, USART_REC_LEN);
   	    DMA_Cmd(DMA1_Stream1, ENABLE);
		USART_ITConfig(USART3, USART_IT_IDLE, ENABLE); 
		USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);
	}
} 

以下是接收数据后直接开启UART1,并通过UART1发送,并通过长度判断来实现对不定长的数据的接收

void DMA1_Stream1_IRQHandler() {
	// clear flag, and waiting for finishing receiving
	if (DMA_GetFlagStatus(DMA1_Stream1, DMA_FLAG_TCIF1) != RESET) {
		DMA_Cmd(DMA1_Stream1, DISABLE); // close DMA, forbidden having other data flow in 
		UART3_ReceiveSize = USART_REC_LEN - DMA_GetCurrDataCounter(DMA1_Stream1);
		if (UART3_ReceiveSize != 0) {
			USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
			MYDMA_Enable(DMA2_Stream7, UART3_ReceiveSize);
		}
		
		DMA_ClearFlag(DMA1_Stream1, DMA_FLAG_TCIF1|DMA_FLAG_FEIF1|DMA_FLAG_TEIF1|DMA_FLAG_HTIF1|DMA_FLAG_DMEIF1);
		DMA_SetCurrDataCounter(DMA1_Stream1, USART_REC_LEN);
		DMA_Cmd(DMA1_Stream1, ENABLE);
	}
}

ROS端部分程序

while (ros::ok()) {
	if (ser.available()) {
		ser.read(r_buffer, rBUFFERSIZE);
		if (data_analyse(r_buffer) != 0) {
			for (int i = 0; i < 4; ++i){
				posx.cvalue[i] = r_buffer[2+i];
				posy.cvalue[i] = r_buffer[6+i];
				vx.cvalue[i] = r_buffer[10+i];
				vy.cvalue[i] = r_buffer[14+i];
				angular_v.cvalue[i] = r_buffer[18+i];
				pose_angular.cvalude[i] = r_buffer[22+i];
			}
			ROS_INFO("posx: [%f],posy: [%f],vx: [%f],vy.: [%f],angular_v: [%f],pose_angular: [%f]", posx.fvalue,posy.fvalue,vx.fvalue,vy.fvalue,angular_v.fvalue,pose_angular.fvalue);
		}
		ros::spinOnce();
	}
}

后续会公开代码,请期待我的代码分享,谢谢!

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

ROS stm32F4串口+DMA通信 的相关文章

  • 初识顶点/片元着色器

    5 2 一个最简单的顶点 片元着色器 5 2 1 顶点 片元着色器的基本结构 一个 Unity Shader 的基本结构 它包含了 Shader Properties SubShader Fallback 等语义块 顶点 片元着色器的结构与

随机推荐

  • 理解互斥量和信号量 作者: JuKevin

    理解互斥量和信号量 作者 JuKevin 互斥量 Mutex 互斥量表现互斥现象的数据结构 也被当作二元信号灯 一个互斥基本上是一个多任务敏感的二元信号 它能用作同步多任务的行为 它常用作保护从中断来的临界段代码并且在共享同步使用的资源 M
  • python key=lambda 元素: 元素[字段索引]用法

    key lambda 元素 元素 字段索引 x x 字母可以随意修改 比如改成y y 也行 排序方式按照中括号 里面的维度进行排序 0 按照第一维排序 1 按照第二维排序 2 按照第三维排序 依此类推 如二维 class Solution
  • Python3,实用技巧之:三类(7种)拼接字符串方式

    三类拼接字符串方式 1 引言 2 格式化类 2 1 来自C的 方式 2 2 format 拼接方式 2 3 面向对象模板拼接 3 拼接类 3 1 常用的 方式 3 2 类似元组的方式 3 3 join方法 4 插值类 4 1 f strin
  • 使用MySQL APT库在Linux上安装MySQL

    添加APT仓库 访问https dev mysql com downloads repo apt 选择下载适合自己平台的deb包 执行下面的命令 安装下载的软件包 sudo dpkg i PATH version specific pack
  • 审视HR SaaS:谁在成为中国的 “IBM+ Workday”?

    在国内的商业环境下 未来 梳理流程等咨询管理能力 或将成为HR SaaS厂商的重要竞争力 国内HR SaaS在 IBM Workday 的模式下 或将迎来新一轮增长 作者 斗斗 编辑 皮爷 出品 产业家 2023年 HR SaaS 正式宣布
  • 功率MOS管保护电路设计

    功率MOS管自身拥有众多优点 但是MOS管具有较脆弱的承受短时过载能力 特别是在高频的应用场合 所以在应用功率MOS管对必须为其设计合理的保护电路来提高器件的可靠性 功率MOS管保护电路主要有以下几个方面 1 防止栅极 di dt过高 由于
  • Git是什么?可以用来做什么?如何使用?

    看完本文之后你能收获什么 1 知道git是什么 可以用来干什么 2 会使用git进行版本控制 3 知道如何继续深度学习git git用来干什么 不知道你工作的时候有没有遇到这样的情况 比如说 做BIM建模 你手中有一份模型初稿 但现在需要在
  • java设计模式(二十二)策略模式

    目录 定义 模式结构 角色职责 代码举例 适用场景 优缺点 定义 策略模式 Strategy Pattern 属于对象的行为模式 其用意是针对一组算法 将每一个算法封装到具有共同接口的独立的类中 从而使得它们可以相互替换 策略模式使得算法可
  • APP内嵌h5页面在android低版本出现白屏问题(vue项目)

    前段时间在处理一个vue项目时 在vivo和华为的android5 0系统出现白屏 没有任何报错信息 之后特地买了两台真机进行测试 经过分段调试 一步步排查 最后发现是这段代码出错 到底什么问题 对比一下这段代码 很明显 参数默认值的问题
  • 警惕UNIX下的LD_PRELOAD环境变量

    警惕UNIX下的LD PRELOAD环境变量 前言 也许这个话题并不新鲜 因为LD PRELOAD所产生的问题由来已久 不过 在这里 我还是想讨论一下这个环境变量 因为这个环境变量所带来的安全问题非常严重 值得所有的Unix下的程序员的注意
  • 【blender基础】02 交互-吸附模式与衰减编辑

    02 交互 吸附模式与衰减编辑 1 吸附 1 1 吸附至的可选项 增量 1 2 吸附至的可选项 活动元素 1 3 吸附至的可选项 顶点 1 3 1 背面剔除 1 3 2 旋转对齐目标 1 4 吸附至的可选项 面 1 5 吸附至的可选项 体积
  • QLoRA

    一 概述 title QLORA Efficient Finetuning of Quantized LLMs 论文地址 https arxiv org pdf 2305 14314 pdf 代码 GitHub artidoro qlora
  • 毕设系列 - 基于stm32的车牌识别 - 单片机 嵌入式 物联网 机器视觉

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 设计原理 5 部分核心代码 5 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉
  • Unty3d 中textmeshpro如何生成中文字体

    1 打开TextMeshPro Font Asset Creator 2 在 Unity 中使用 TextMeshPro 的文本解决方案 当要生成字库图集时 需要通过插件提供的 Font Asset Creator 工具 但是每次都需要重新
  • PhotoShop 之用画笔工具擦除

    最近看了一篇课程 使用渐变工具生成彩虹 并用画笔工具擦除部分图像 1 首先 为图像添加一个图层 2 用渐变工具生成彩虹渐变图像 3 添加图层蒙版 4 前景色设置为黑色 原先为红色 5 使用画笔工具 预设像素设置为150 6 使用画笔进行擦除
  • 双非保研北邮人工智能学院的逆袭之路

    作者 ShawnPi 编辑 CVHub 来源 https zhuanlan zhihu com p 601052513 引言 刚经历过激烈的保研和一段时间的迷茫 希望此帖可以帮助到计算机专业的学弟学妹们 希望能从多维度 多视角解读计算机保研
  • 部署并安装Discuz

    安装前一定要安装apche和mysql数据库 没有安装用以下密令下载 apche下载密令 rpm qa grep httpd mysql下载密令 yum install y mariadb server 安装好这两项后安装php php安装
  • 如何将kaggle中的数据导入到谷歌提供的colab(保姆级教学)

    前言 由于cloab的使用需要梯子 直接将自己电脑里的数据上传到colab里面时网速一直是一个头痛的问题 为了解决这个问题我们可以直接跳过从kaggle里面下载数据的那一步 直接让kaggle的数据导入到colab里面 准备步骤 注册一个k
  • 前端(HTML+CSS+JS)

    前端基础 HTML 文档类型声明 基本结构 块级元素和行内元素 图片 文件路径 常用属性 超链接 文本格式化标签 注释 列表 无序列表 有序列表 自定义列表 表格 表格结构 table属性 tr属性 td属性 表单 form 表单域里的in
  • ROS stm32F4串口+DMA通信

    ROS stm32F4串口 DMA通信 介绍 发送数据错位 uart接收 ROS端部分程序 介绍 本博文基于stm32F407 利用uart3发送数据 并由uart3接收ROS通过串口发送的数据后由uart1发送回ROS 以下 主要针对于调