stm32HAL库 串口接收不定长数据(DMA传输)

2023-05-16

相信大家很多初学者都会遇到串口接收不定长数据的情况。
对于初学者可能看着有点难理解,多看几遍就好,亲测能用。
话不多说上菜上菜!!!!

此代码是本人在具体工程应用,实测稳定。

有不足之处还请发现问题的小伙伴指出,大家共同进步。

此处省略stm32CubeIDE 配置过程*********************************
串口配置过程如下:
其他几个串口也是如下进行配置(正常使用的话只使能DMA接收即可)

波特率设置
波特率设置
NVIC中断配置
在这里插入图片描述
DMA配置
在这里插入图片描述

新建usr_uart_rec.h头文件,内容如下:

#ifndef USR_UART_REC_USR_UART_REC_H_
#define USR_UART_REC_USR_UART_REC_H_

#include "main.h"

#define MAX_REC_COUNT  36//可随根据实际使用情况进行调整

typedef struct
{
	uint8_t ReciveBuff[MAX_REC_COUNT];//接收缓冲区
	uint8_t uartRecCount;//接收数据的计数器
	uint8_t RecFlag:1;//接收标志位  主要用于数据处理
}DMAuartReciveBuff;


typedef struct
{
	DMAuartReciveBuff userUart1;
	DMAuartReciveBuff userUart2;
	DMAuartReciveBuff userUart3;
	DMAuartReciveBuff userUart4;
	DMAuartReciveBuff userUart5;
	DMAuartReciveBuff userUart6;
}UART_REC;


typedef struct
{
	uint8_t DMAbuff[MAX_REC_COUNT];
}uBbuffer;

typedef struct
{
	uBbuffer usr_uart1;
	uBbuffer usr_uart2;
	uBbuffer usr_uart3;
	uBbuffer usr_uart4;
	uBbuffer usr_uart5;
	uBbuffer usr_uart6;
}UART_MEMCPY_BUFF;//复制DMA的数据  用于解析

extern UART_MEMCPY_BUFF usr_dma_Data;
extern UART_REC userUart;

void USR_UART_Init();//串口初始化函数
void UART1_IRQ_DataGet();//在串口中断服务函数中添加此函数用于缓存数据
void UART2_IRQ_DataGet();
void UART3_IRQ_DataGet();
void UART4_IRQ_DataGet();
void UART5_IRQ_DataGet();
void UART6_IRQ_DataGet();

#endif /* USR_UART_REC_USR_UART_REC_H_ */

新建usr_uart_rec.c头文件,内容如下:


#include "main.h"
#include "usart.h"
#include "usr_uart_rec.h"
#include "string.h"



UART_REC userUart;
UART_MEMCPY_BUFF usr_dma_Data;


void USR_UART_Init()//串口初始化函数
{
	__HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);//启动IDLE中断
	__HAL_UART_ENABLE_IT(&huart3,UART_IT_IDLE);//启动IDLE中断
	__HAL_UART_ENABLE_IT(&huart4,UART_IT_IDLE);//启动IDLE中断
	__HAL_UART_ENABLE_IT(&huart5,UART_IT_IDLE);//启动IDLE中断
	__HAL_UART_ENABLE_IT(&huart6,UART_IT_IDLE);//启动IDLE中断
	__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);//启动IDLE中断

	userUart.userUart1.uartRecCount = 0;

//	  注意串口DMA 发送时候应该如下顺序初始化DMA 和串口
//	  MX_DMA_Init();
//	  MX_USART1_UART_Init();
//	  MX_UART4_Init();
//	  MX_UART5_Init();
//	  MX_USART2_UART_Init();
//	  MX_USART3_UART_Init();
//	  MX_USART6_UART_Init();

	HAL_UART_Receive_DMA(&huart1, (uint8_t *)&userUart.userUart1.ReciveBuff, sizeof(userUart.userUart1.ReciveBuff));
	HAL_UART_Receive_DMA(&huart2, (uint8_t *)&userUart.userUart2.ReciveBuff, sizeof(userUart.userUart2.ReciveBuff));
	HAL_UART_Receive_DMA(&huart3, (uint8_t *)&userUart.userUart3.ReciveBuff, sizeof(userUart.userUart3.ReciveBuff));
	HAL_UART_Receive_DMA(&huart4, (uint8_t *)&userUart.userUart4.ReciveBuff, sizeof(userUart.userUart4.ReciveBuff));
	HAL_UART_Receive_DMA(&huart5, (uint8_t *)&userUart.userUart5.ReciveBuff, sizeof(userUart.userUart5.ReciveBuff));
	HAL_UART_Receive_DMA(&huart6, (uint8_t *)&userUart.userUart6.ReciveBuff, sizeof(userUart.userUart6.ReciveBuff));
}



void UART1_IRQ_DataGet()//在串口1的中断服务函数中添加此函数用于缓存数据
{
	if(USART1 == huart1.Instance)
	{
		if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE))
		{
			HAL_UART_DMAStop(&huart1);
			userUart.userUart1.uartRecCount = MAX_REC_COUNT - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);//用于统计DMA接收到了多少数据
			userUart.userUart1.RecFlag = true;
//			printf("userUart.userUart1.uartRecCount is %d",userUart.userUart1.uartRecCount);
//			memcpy(&usr_dma_Data.usr_uart1.DMAbuff,&userUart.userUart1.ReciveBuff,userUart.userUart1.uartRecCount);
//			memset((uint8_t *)&userUart.userUart1.ReciveBuff,0,sizeof(userUart.userUart1.ReciveBuff));
//			userUart.userUart1.uartRecCount = 0;
			HAL_UART_Receive_DMA(&huart1, (uint8_t *)&userUart.userUart1.ReciveBuff, sizeof(userUart.userUart1.ReciveBuff));
			__HAL_UART_CLEAR_IDLEFLAG(&huart1);
		}
	}
}

void UART2_IRQ_DataGet()//在串口1的中断服务函数中添加此函数用于缓存数据
{
	if(USART2 == huart2.Instance)
	{
		if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE))
		{
			HAL_UART_DMAStop(&huart2);
			userUart.userUart2.uartRecCount = MAX_REC_COUNT - __HAL_DMA_GET_COUNTER(&hdma_usart2_rx);//用于统计DMA接收到了多少数据
			userUart.userUart2.RecFlag = true;
//			printf("userUart.userUart2.uartRecCount is %d",userUart.userUart2.uartRecCount);
//			memcpy(&usr_dma_Data.usr_uart2.DMAbuff,&userUart.userUart2.ReciveBuff,userUart.userUart2.uartRecCount);
//			memset((uint8_t *)&userUart.userUart2.ReciveBuff,0,sizeof(userUart.userUart2.ReciveBuff));
//			userUart.userUart2.uartRecCount = 0;
			HAL_UART_Receive_DMA(&huart2, (uint8_t *)&userUart.userUart2.ReciveBuff, sizeof(userUart.userUart2.ReciveBuff));
			__HAL_UART_CLEAR_IDLEFLAG(&huart2);
		}
	}
}

void UART3_IRQ_DataGet()//在串口1的中断服务函数中添加此函数用于缓存数据
{
	if(USART3 == huart3.Instance)
	{
		if(__HAL_UART_GET_FLAG(&huart3,UART_FLAG_IDLE))
		{
			HAL_UART_DMAStop(&huart3);
			userUart.userUart3.uartRecCount = MAX_REC_COUNT - __HAL_DMA_GET_COUNTER(&hdma_usart3_rx);//用于统计DMA接收到了多少数据
			userUart.userUart3.RecFlag = true;
//			printf("userUart.userUart3.uartRecCount is %d",userUart.userUart3.uartRecCount);
//			memcpy(&usr_dma_Data.usr_uart3.DMAbuff,&userUart.userUart3.ReciveBuff,userUart.userUart3.uartRecCount);
//			memset((uint8_t *)&userUart.userUart3.ReciveBuff,0,sizeof(userUart.userUart3.ReciveBuff));
//			userUart.userUart3.uartRecCount = 0;
			HAL_UART_Receive_DMA(&huart3, (uint8_t *)&userUart.userUart3.ReciveBuff, sizeof(userUart.userUart3.ReciveBuff));
			__HAL_UART_CLEAR_IDLEFLAG(&huart3);
		}
	}
}

void UART4_IRQ_DataGet()//在串口1的中断服务函数中添加此函数用于缓存数据
{
	if(UART4 == huart4.Instance)
	{
		if(__HAL_UART_GET_FLAG(&huart4,UART_FLAG_IDLE))
		{
			HAL_UART_DMAStop(&huart4);
			userUart.userUart4.uartRecCount = MAX_REC_COUNT - __HAL_DMA_GET_COUNTER(&hdma_uart4_rx);//用于统计DMA接收到了多少数据
			userUart.userUart4.RecFlag = true;
//			printf("userUart.userUart1.uartRecCount is %d",userUart.userUart1.uartRecCount);
//			memcpy(&usr_dma_Data.usr_uart4.DMAbuff,&userUart.userUart4.ReciveBuff,userUart.userUart4.uartRecCount);
//			memset((uint8_t *)&userUart.userUart4.ReciveBuff,0,sizeof(userUart.userUart4.ReciveBuff));
//			userUart.userUart4.uartRecCount = 0;
			HAL_UART_Receive_DMA(&huart4, (uint8_t *)&userUart.userUart4.ReciveBuff, sizeof(userUart.userUart4.ReciveBuff));
			__HAL_UART_CLEAR_IDLEFLAG(&huart4);

			//顺便处理收到的数据
		}
	}
}

void UART5_IRQ_DataGet()//在串口1的中断服务函数中添加此函数用于缓存数据
{
	if(UART5 == huart5.Instance)
	{
		if(__HAL_UART_GET_FLAG(&huart5,UART_FLAG_IDLE))
		{
			HAL_UART_DMAStop(&huart5);
			userUart.userUart5.uartRecCount = MAX_REC_COUNT - __HAL_DMA_GET_COUNTER(&hdma_uart5_rx);//用于统计DMA接收到了多少数据
			userUart.userUart5.RecFlag = true;
//			printf("userUart.userUart1.uartRecCount is %d",userUart.userUart1.uartRecCount);
//			memcpy(&usr_dma_Data.usr_uart5.DMAbuff,&userUart.userUart5.ReciveBuff,userUart.userUart5.uartRecCount);
//			memset((uint8_t *)&userUart.userUart5.ReciveBuff,0,sizeof(userUart.userUart5.ReciveBuff));
//			userUart.userUart5.uartRecCount = 0;
			HAL_UART_Receive_DMA(&huart5, (uint8_t *)&userUart.userUart5.ReciveBuff, sizeof(userUart.userUart5.ReciveBuff));
			__HAL_UART_CLEAR_IDLEFLAG(&huart5);
		}
	}
}




void UART6_IRQ_DataGet()//在串口1的中断服务函数中添加此函数用于缓存数据
{
	if(USART6 == huart6.Instance)
	{
		if(__HAL_UART_GET_FLAG(&huart6,UART_FLAG_IDLE))
		{
			HAL_UART_DMAStop(&huart6);
			userUart.userUart6.uartRecCount = MAX_REC_COUNT - __HAL_DMA_GET_COUNTER(&hdma_usart6_rx);//用于统计DMA接收到了多少数据
			userUart.userUart6.RecFlag = true;
//			printf("userUart.userUart1.uartRecCount is %d",userUart.userUart1.uartRecCount);
//			memcpy(&usr_dma_Data.usr_uart6.DMAbuff,&userUart.userUart6.ReciveBuff,userUart.userUart6.uartRecCount);
//			memset((uint8_t *)&userUart.userUart6.ReciveBuff,0,sizeof(userUart.userUart6.ReciveBuff));
//			userUart.userUart1.uartRecCount = 0;
			HAL_UART_Receive_DMA(&huart6, (uint8_t *)&userUart.userUart6.ReciveBuff, sizeof(userUart.userUart6.ReciveBuff));
			__HAL_UART_CLEAR_IDLEFLAG(&huart1);
		}
	}
}

注释掉的部分可用于调试,本人不建议在中断中处理大量数据,因为容易死机哦。

在使用串口DMA的时候需要注意以下问题:
在使用 stm32CubeIDE生成代码之后,按照官方的初始化流程有点点问题,会导致串口接收不到数据,所以要稍作修改,改变初始化流程:如下所示(最主要的是先初始化DMA 再初始化相关串口)这是一位博主针对DMA串口接收数据失败写的文章

  MX_DMA_Init();
  MX_USART1_UART_Init();
  MX_UART4_Init();
  MX_UART5_Init();
  MX_USART2_UART_Init();
  MX_USART3_UART_Init();
  MX_USART6_UART_Init();

最后在stm32f4xx_it.c 如下,将自定义的函数加到中断服务函数中即可 例如:

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
  UART1_IRQ_DataGet();
  /* USER CODE END USART1_IRQn 1 */
}

void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */

  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */
  UART2_IRQ_DataGet();
  /* USER CODE END USART2_IRQn 1 */
}

void USART3_IRQHandler(void)
{
  /* USER CODE BEGIN USART3_IRQn 0 */

  /* USER CODE END USART3_IRQn 0 */
  HAL_UART_IRQHandler(&huart3);
  /* USER CODE BEGIN USART3_IRQn 1 */
  UART3_IRQ_DataGet();
  /* USER CODE END USART3_IRQn 1 */
}

void UART4_IRQHandler(void)
{
  /* USER CODE BEGIN UART4_IRQn 0 */

  /* USER CODE END UART4_IRQn 0 */
  HAL_UART_IRQHandler(&huart4);
  /* USER CODE BEGIN UART4_IRQn 1 */
  UART4_IRQ_DataGet();
  /* USER CODE END UART4_IRQn 1 */
}

void UART5_IRQHandler(void)
{
  /* USER CODE BEGIN UART5_IRQn 0 */

  /* USER CODE END UART5_IRQn 0 */
  HAL_UART_IRQHandler(&huart5);
  /* USER CODE BEGIN UART5_IRQn 1 */
  UART5_IRQ_DataGet();
  /* USER CODE END UART5_IRQn 1 */
}

void USART6_IRQHandler(void)
{
  /* USER CODE BEGIN USART6_IRQn 0 */

  /* USER CODE END USART6_IRQn 0 */
  HAL_UART_IRQHandler(&huart6);
  /* USER CODE BEGIN USART6_IRQn 1 */
  UART6_IRQ_DataGet();  
  /* USER CODE END USART6_IRQn 1 */
}

需要注意的是 此代码在接收完成后会有一个软件标志位被置1,使用完数据之后需要用户手动清零。

userUart.userUart1.RecFlag = true;//串口1接收完成的中断标志

userUart.userUart1.uartRecCount = MAX_REC_COUNT - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);//用于统计DMA接收到了多少数据

具体如何使用呢,举个例子(串口1):

uint8_t PowerRecBuff[23];

void PowerDataAnalyze()//解析电池的数据
{
	if(userUart.userUart1.RecFlag )
	{
		userUart.userUart1.RecFlag = false;//清除标志位
		memcpy((uint8_t *)&PowerRecBuff,(uint8_t *)&userUart.userUart1.ReciveBuff, userUart.userUart1.uartRecCount);
		RSOC = PowerRecBuff[23];
	/*
	使用者亦可在此处进行数据处理
	具体怎么处理不用我多说了吧---哈哈 加油。
	*/
		userUart.userUart1.uartRecCount = 0;
		memset((uint8_t *)&userUart.userUart1.ReciveBuff,0, sizeof(userUart.userUart1.ReciveBuff));
	}
}

自此完结。此代码亲测可用,对于初学者可能有点难理解。学习哪有不难的,就因为难所以才要学呀

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

stm32HAL库 串口接收不定长数据(DMA传输) 的相关文章

  • 使用DMA+SPI驱动Aliyun Things 上的ST7789H2 LCD屏幕

    目录 前言硬件CUBEMX时钟树GPIOSPI 代码部分LCD驱动中断服务函数测试代码现象 前言 1 xff1a 驱动程序参考自https blog csdn net BearPi article details 104311705 2 x
  • STM32F4 DMA

    STM32F4有2个DMA xff0c 每个DMA控制器有8个数据流 xff0c 每个数据流有多达8个通道 xff0c 但是DMA1 控制器 AHB 外设端口与 DMA2 控制器的情况不同 xff0c 不连接到总线矩阵 xff0c 因此 x
  • 【STM32】DMA原理,配置步骤超详细,一文搞懂DMA

    目录 DMA xff08 Direct Memory Access xff09 简介 DMA传输方式 DMA功能框图 DMA请求映像 DMA1控制器 DMA2控制器 通道 仲裁器 DMA主要特性 DMA处理 DMA数据配置 从哪里来到哪里去
  • STM32F4 SPI RX/TX DMA 读写FLASH数据

    STM32 使用DMA读写FLASH数据需要注意以下几点 xff1a 1 SPI全双工模式下 xff0c 无论读写FLASH数据均需要同时使能RX TX DMA 2 写数据时回读数据应当丢弃 xff0c 读数据时应当发送0xff来启动SPI
  • STM32带FIFO的DMA传输应用示例

    STM32系列芯片都内置DMA外设 xff0c 其中很多系列的DMA配备了FIFO 这里以STM32F429芯片及开发板为例 xff0c 演示一下带FIFO的DMA传输实现过程 大致情况是这样的 xff0c 我用TIMER1通道1的比较事件
  • STM32 DMA +串口 收发数据(不用频繁进入中断) STM32G473 hal库

    1 1 实现方法 利用DMA接收串口数据 xff0c 在一定程度上会节省CPU 的消耗 大多数串口接收都是接收一个字节就中断一次 xff0c 如果串口上需要实时接收大量的数据 xff0c 这就会导致频繁进入中断 xff0c 这样一来 xff
  • I/O的控制方式——查询,中断,dma

    早期 xff0c I O串行 xff0c 查询方式 发展 xff0c I O并行 xff0c 两种方式其一是中断方式 xff0c 其二是dma方式 xff0c 使得外部设备能直接与主存储器信息交换 xff0c 减轻了cpu的工作量 技术继续
  • FIFO与DMA

    FIFO存储器是一个先入先出的双口缓冲器 xff0c 即第一个进入其内的数据第一个被移出 xff0c 其中一个存储器的输入口 xff0c 另一个口是存储器的输出口 主要有三个方面的作用 xff1a 1 xff09 对连续的数据流进行缓存 x
  • UART+DMA数据传输

    DMA的概念 DMA xff08 Direct Memory Access xff09 即直接内存访问 xff0c DMA传输方式无需CPU直接控制传输 xff0c 通过硬件为RAM I O设备开辟一条直接传输数据的通路 xff0c 能使C
  • STM32使用串口空闲中断接收不定长数据帧-USART_IT_IDLE使用(不使用DMA方式)

    STM32使用串口空闲中断接收不定长数据帧 USART IT IDLE使用 xff08 不使用DMA方式 xff09 前言串口空闲中断介绍清中断方法串口中断处理函数串口中断用到的全局变量定义串口初始化 xff08 使能接收中断 空闲中断 x
  • STM32】 DMA原理,步骤超细详解,一文看懂DMA

    如需转载请注明地址 xff1a https blog csdn net as480133937 article details 104927922 DMA的基本介绍 什么是DMA DMA的基本定义 DMA xff0c 全称Direct Me
  • 16. GD32F103C8T6入门教程-adc 使用教程2-dma+连续扫描方式采集数据

    adc 使用教程2 dma 连续扫描方式采集数据 adc 的扫描模式就是把配置了规则或注入通道按照配置的顺序采集一轮 adc 的连续转换模式就是把配置了规则或注入通道按照配置的顺序采集N轮 注意 dma使用时存在一个外设映射到一个dam外设
  • STM32ADC多通道采集(基于DMA)

    首先简单介绍DMA DMA Direct Memory Access 直接内存存取 用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输 无需CPU干预 节省CPU资源 ADC转换出来的值直接赋值给定义好的变量中 配置好的DMA可
  • DMA基本概念与常见寄存器设置

    什么是DMA DMA Direct Memory Access 即直接存储访问 DMA传输方式无需CPU直接控制传输 通过硬件为RAM I O设备开辟一条直接传输数据的通路 能使CPU的效率大为提高 每一种体系结构DMA传输不同 编程接口也
  • STM32CubeMX—串口空闲中断+DMA接收

    一 实验说明 实验平台 STM32F103C8T6 实验内容 使用串口一空闲中断结合DMA 完成不定长数据接收 STM32的串口接收数据的方式 1 轮询接收 所谓轮询 就是在主函数中判断接收完成的标志位 举个不太恰当例子 就比如 此时你正在
  • STM32CubeMX HAL库串口+DMA+IDLE空闲中断不定长度数据接收和发送

    本文开发环境 MCU型号 STM32F103ZET6 IDE环境 MDK 5 29 代码生成工具 STM32CubeMx 5 3 0 HAL库版本 STM32Cube FW F1 V1 8 0 STM32Cube MCU Package f
  • 多核架构中的 CPU 和内存访问

    我想知道如果 例如 CPU 的 2 个核心尝试同时访问内存 通过内存控制器 一般 如何处理内存访问 实际上 当内核和启用 DMA 的 IO 设备尝试以相同方式访问时 同样适用 I think 内存控制器足够智能 可以利用地址总线并同时处理这
  • DMA 与中断驱动的 I/O

    我不太清楚 DMA 和中断 I O 之间的区别 当前正在阅读操作系统概念 第 7 版 具体来说 我不确定在这两种情况下何时会发生中断 以及在这两种情况下 CPU 在什么时候可以自由地执行其他工作 我一直在读但不一定能调和的东西 中断驱动 通
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • glBufferSubData什么时候返回? [复制]

    这个问题在这里已经有答案了 我想将一个非常大的内存块的内容传输到足够大的 GPU 缓冲区 然后立即更改 CPU 上的内存内容 伪代码是这样的 glBindBuffer very large buffer glBufferSubData ve

随机推荐

  • sudo rosdep init报错的解决方式

    Ubuntu16 04下安装ROS时 xff0c 执行到sudo rosdep init这一步时会遇到问题 xff0c 如下图所示 xff1a 尝试了很多办法 xff0c 都没有成功的 后来参考了https www ioiox com ar
  • VS版本和VC版本的对应【完整版】

    看到网上杂七杂八 xff0c 很乱 xff0c 索性自己发帖多版本开发福音 xff08 该帖不更新了 xff0c 请看参考里连接中的官方文档 xff0c 非常清楚 xff0c 还保持最新 xff09 MSC 1 0 MSC VER 61 6
  • 搭建运行激光slam环境中遇到的问题

    1 先是踩了一些坑 xff0c 重复安装了一些库 xff0c 因为ros noetic里面就自带了一些库 xff0c 所以安装的时候重复安装了 解决方法 xff1a 删掉重装 另外缺少一些库 xff0c 乱装一顿 xff0c 居然凑齐 Ub
  • mac上用VSCode搭建 c++ 工程,用于学习Opengl

    先下载VSCode安装c c 43 43 插件 xff0c 安装微软这个 创建一个文件夹作为项目 xff0c 然后用VSCode打开这个目录在这个文件夹中创建好四个目录 xff0c 分别是src xff0c lib include bin
  • 刷赞与评论

    网站自动刷帖 xff0c 刷赞 xff0c 刷评论等网络推广方式的基本实现 里面的思路有东西
  • 系统复制-快速重装系统

    ubuntu 直接把安装好常用软件和环境的系统打包成镜像 xff0c 用systemback安装 xff0c 便捷很多 之前那种 xff0c ubuntu安装都要好久 xff0c 少说也得20分钟吧 xff0c 之前就是等 xff0c 等它
  • 机器人 控制领域

    机器人 控制领域好像没太有很新很有用的工作 xff0c 还是依据Dynamic Model的Motion Planning更接近于任务层 其实 xff0c 感觉自己喜欢的不是控制 而是motion xff0c motion control
  • 树莓派电压过低 串口数据错误增多

    调试过程中 xff0c 树莓派串口读单片机上传的数据 的程序突然一堆checksum error 换一块满电的LiPo电池就大幅减少了报错 一开始猜测原因 可能是电压过低导致CPU运行慢了 xff08 可能叫做 降频 xff09 xff0c
  • 机器人知识体系

    纲 机电力算控感 知识体系体系各元素特点体系的建立和完善 机电力算控感 知识体系 机械 电子电气 力学 xff08 静力学与动力学分析 流体力学 材料力学等 xff09 计算 xff08 通用计算机和嵌入式计算机 xff09 控制理论 感知
  • OpenCV之imwrite()等基本操作

    参考 xff1a Opencv之imwrite 函数的用处 imwrite 函数用来保存图片 opencv3中的imwrite函数是用来输出图像到文件 xff0c 其声明如下 xff1a CV EXPORTS W bool imwrite
  • 麦克纳姆轮全向移动原理

    什么是麦克纳姆轮 在竞赛机器人和特殊工种机器人中 xff0c 全向移动经常是一个必需的功能 全向移动 意味着可以在平面内做出任意方向平移同时自转的动作 为了实现全向移动 xff0c 一般机器人会使用 全向轮 xff08 Omni Wheel
  • 卡尔曼滤波(KF)与扩展卡尔曼滤波(EKF)的一种理解思路及相应推导(1)

    前言 xff1a 从上个世纪卡尔曼滤波理论被提出 xff0c 卡尔曼滤波在控制论与信息论的连接上做出了卓越的贡献 为了得出准确的下一时刻状态真值 xff0c 我们常常使用卡尔曼滤波 扩展卡尔曼滤波 无迹卡尔曼滤波 粒子滤波等等方法 xff0
  • Qt Cmake添加*.qrc资源文件

    cmake minimum required VERSION 3 5 project Test LANGUAGES CXX 这里 file GLOB RECURSE QRC SOURCE FILES CMAKE CURRENT SOURCE
  • IOS 加载本地HTML

    web qtt以 folder形式添加到项目中 xff0c 注意是蓝色的颜色 创建swift项目 xff0c 写入如下代码 span class token comment span span class token comment Vie
  • C#实现:将十进制数转换为十六进制(含完整源码)

    C 实现 将十进制数转换为十六进制 含完整源码 在C 中 我们可以使用基础数据类型来存储整数值 如int long等 而十进制数是我们最常用的数制 但有些场景下需要将其转换为其它进制 如十六进制 本文将介绍如何使用C 来实现将十进制数转换为
  • 怎样用串口发送结构体-简单协议的封包和解包

    先说解决方案 xff0c 细节和实现代码都放在正文 下位机 xff1a 把结构体拆分成8位的整型数据 xff0c 加上数据包头和包尾 xff0c 然后按顺序单个单个地发出 xff1b 上位机 xff1a 把串口里的数据读取出来 xff0c
  • 计算机网络学习笔记——IP Header Checksum(校验和)的计算方法

    从TCP IP协议看到IP数据报 xff0c 看到Checksum的算法描述 xff0c 不甚了了 The checksum field is the 16 bit one s complement of the one s complem
  • 在Ubuntu18.04中更新指定python版本以及pip

    在Ubuntu18 04中更新指定python版本以及pip 更新指定python版本 xff08 eg python3 8 xff09 xff1a 参考 教你Ubuntu安装python3 7 xff0c 并更新python默认指向 xf
  • 【MATLAB数学建模编程实战】遗传算法求解最短路径(附代码及运行效果)

    欢迎关注 xff0c 本专栏主要更新MATLAB仿真 界面 基础编程 画图 算法 矩阵处理等操作 xff0c 拥有丰富的实例练习代码 xff0c 欢迎订阅该专栏 xff01 xff08 等该专栏建设成熟后将开始收费 xff0c 快快上车吧
  • stm32HAL库 串口接收不定长数据(DMA传输)

    相信大家很多初学者都会遇到串口接收不定长数据的情况 对于初学者可能看着有点难理解 xff0c 多看几遍就好 xff0c 亲测能用 话不多说上菜上菜 xff01 xff01 xff01 xff01 此代码是本人在具体工程应用 xff0c 实测