串口+DMA 数据收发编程实践

2023-05-16

更多交流欢迎关注作者抖音号:81849645041

目标

        了解DMA 的工作原理,通过配置 STM32F407 芯片的DMA,实现串口+ DMA数据收发。

原理

        基于USART的数据通讯中采用中断方式可以在接收到信息或需要发送数据时产生中断,在中断服务程序中完成数据的接收与发送,但是中断方式的CPU使用率要高。在简单的系统中,使用中断方式确实是一种好方法。但是在复杂的系统中,处理器需要处理串口通信,多个传感器数据的采集及处理,牵扯到多个中断的优先级分配问题。为了保证数据发送与接收的可靠性,需要把USART的中断优先级设计较高,但是系统可能还有其他的需要更高优先级的中断,必须保证其定时的准确,这样就有可能造成串行通讯的中断不能及时响应,从而造成数据丢失。 为了保证串行通讯的数据及时可靠的接收,同时兼顾其它任务不受影响,采用了基于DMA和中断方式相结合的USART串行通信方式。

        DMA,全称:Direct  Memory  Access,即直接存储器访问。DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个动作,传输动作本身是由DMA控制器来实现和完成的。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高。DMA最主要的作用是为CPU减小负担。

        STM32F4xx 系列的 DMA功能齐全,工作模式众多,适合不同编程环境要求。STM32F4xx 系列的 DMA 支持外设到存储器传输、存储器到外设传输和存储器到存储器传输三种传输模式。这里的外设一般指外设的数据寄存器,比如 ADC、SPI、I2C、DCMI等等外设的数据寄存器,存储器一般是指片内 SRAM、外部存储器、片内 Flash 等等。

        外设到存储器传输就是把外设数据寄存器内容转移到指定的内存空间。比如进行 ADC采集时我们可以利用 DMA 传输把 AD 转换数据转移到我们定义的存储区中,这样对于多通道采集、采样频率高、连续输出数据的 AD采集是非常高效的处理方法。

        存储区到外设传输就是把特定存储区内容转移至外设的数据寄存器中,这种多用于外设的发送通信。

        存储器到存储器传输就是把一个指定的存储区内容拷贝到另一个存储区空间。功能类似于 C语言内存拷贝函数 memcpy,利用 DMA传输可以达到更高的传输效率,特别是DMA传输是不占用 CPU的,可以节省很多 CPU资源。

        STM32F4xx 系列的 DMA可以实现外设寄存器与存储器之间或者存储器与存储器之间传输三种模式,这要得益于 DMA 控制器是采样 AHB主总线的,可以控制 AHB总线矩阵来启动 AHB事务DMA控制框图如下所示:

 

  • 外设通道选择

        STM32F4xx 系列资源丰富,具有两个 DMA 控制器,同时外设繁多,为实现正常传输,DMA需要通道选择控制。每个 DMA控制器具有 8个数据流,每个数据流对应 8个外设请求。在实现 DMA 传输之前,DMA控制器会通过 DMA数据流 x 配置寄存器 DMA_SxCR(x为 0~7,对应 8 个 DMA 数据流)的 CHSEL[2:0]位选择对应的通道作为该数据流的目标外设。

        外设通道选择要解决的主要问题是决定哪一个外设作为该数据流的源地址或者目标地址。

        DMA1请求映射如下表所示:

        DMA2请求映射如下表所示:

 

 

  • 仲裁器

        一个 DMA控制器对应 8个数据流,数据流包含要传输数据的源地址、目标地址、数据等等信息。如果我们需要同时使用同一个 DMA 控制器(DMA1 或 DMA2)多个外设请求时,那必然需要同时使用多个数据流,那究竟哪一个数据流具有优先传输的权利呢?这就需要仲裁器来管理判断了。

        仲裁器管理数据流方法分为两个阶段。第一阶段属于软件阶段,我们在配置数据流时可以通过寄存器设定它的优先级别,具体配置 DMA_SxCR寄存器 PL[1:0]位,可以设置为非常高、高、中和低四个级别。第二阶段属于硬件阶段,如果两个或以上数据流软件设置优先级一样,则他们优先级取决于数据流编号,编号越低越具有优先权,比如数据流 2 优先级高于数据流 3。

  • :FIFO

        每个数据流都独立拥有四级 32 位 FIFO(先进先出存储器缓冲区)。DMA传输具有 FIFO模式和直接模式。

        直接模式在每个外设请求都立即启动对存储器传输。在直接模式下,如果 DMA配置为存储器和外设之间传输,那么 DMA会将一个数据存放在 FIFO 内,如果外设启动 DMA 传输请求就可以马上将数据传输过去。

        FIFO模式下FIFO 用于在源数据传输到目标地址之前临时存放这些数据。可以通过 DMA 数据流x FIFO 控制寄存器 DMA_SxFCR 的 FTH[1:0]位来控制 FIFO 的阈值,分别为 1/4、1/2、3/4和满。如果数据存储量达到阈值级别时,FIFO 内容将传输到目标中。

        FIFO 对于要求源地址和目标地址数据宽度不同时非常有用,比如源数据是源源不断的字节数据,而目标地址要求输出字宽度的数据,即在实现数据传输时同时把原来 4 个 8位字节的数据拼凑成一个 32位字数据。此时使用 FIFO 功能先把数据缓存起来,分别根据需要输出数据。

  • :存储器端口、⑤:外设端口

        DMA控制器实现双 AHB主接口,更好利用总线矩阵和并行传输。DMA控制器通过存储器端口和外设端口与存储器和外设进行数据传输,关系如下图。DMA控制器的功能是快速转移内存数据,需要一个连接至源数据地址的端口和一个连接至目标地址的端口。

        DMA2(DMA 控制器 2)的存储器端口和外设端口都是连接到 AHB 总线矩阵,可以使用AHB 总线矩阵功能。DMA2 存储器和外设端口可以访问相关的内存地址,包括有内部Flash、内部 SRAM、AHB1 外设、AHB2外设、APB2 外设和外部存储器空间。

        DMA1 的存储器端口相比 DMA2 的要减少 AHB2 外设的访问权,同时 DMA1外设端口是没有连接至总线矩阵的,只有连接到 APB1外设,所以 DMA1 不能实现存储器到存储器传输。

  • 编程端口

        AHB从器件编程端口是连接置AHB2外设的。AHB2外设在使用DMA传输时需要相关控制信号。

        DMA寄存器包括:DMA低中断状态寄存器(DMA_LISR)、DMA高中断状态寄存器(DMA_HISR)、DMA低中断标志清除寄存器(DMA_LIFCR)、DMA高中断标志清除寄存器(DMA_HIFCR)、DMA流配置寄存器(DMA_SxCR)、DMA流数据个数寄存器(DMA_SxNDTR)、DMA流外设地址寄存器(DMA_SxPAR)、DMA流内存0地址寄存器(DMA_SxM0AR)、DMA流内存1地址寄存器(DMA_SxM1AR)、DMA流FIFO控制寄存器(DMA_SxM1AR)。

准备

 MDK5 开发环境。

STM32F4xx HAL库。

STM32F407 开发板。

STM32F4xx 参考手册。

STM32F407 开发板电路原理图。

串口调试助手软件。

USB转TTL模块。

步骤

  • 定义串口DMA发送和接收的结构体初始化变量。
DMA_HandleTypeDef UART1RxDMA_Handler; // 串口接收DMA句柄
DMA_HandleTypeDef UART1TxDMA_Handler; // 串口发送DMA句柄
  • 定义UART_DMA_Init()函数,在函数中实现串口DMA的初始化。

        第一步:使能DMA2时钟。

        第二步:分别配置UART1RxDMA_Handler和UART1TxDMA_Handler结构体变量中的参数,然后将两个结构体变量传入到HAL_DMA_Init函数中,以便初始化串口DMA。

        第三步:使能DMA2数据流7(串口DMA发送)中断。

// 串口DMA初始化
void UART_DMA_Init(void)
{
	__HAL_RCC_DMA2_CLK_ENABLE(); // 使能DMA2时钟
	
	// 接收DMA配置
	UART1RxDMA_Handler.Instance = DMA2_Stream5; // 数据流选择
	UART1RxDMA_Handler.Init.Channel = DMA_CHANNEL_4; // 通道选择
	UART1RxDMA_Handler.Init.Direction = DMA_PERIPH_TO_MEMORY; // 外设到存储器
	UART1RxDMA_Handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE; // FIFO不使能
	UART1RxDMA_Handler.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; // FIFO阈值
	UART1RxDMA_Handler.Init.MemBurst = DMA_MBURST_SINGLE; // 内存突发传输配置
	UART1RxDMA_Handler.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; // 存储器数据长度
	UART1RxDMA_Handler.Init.MemInc = DMA_MINC_ENABLE; // 内存寄存器地址是否自增
	UART1RxDMA_Handler.Init.Mode = DMA_CIRCULAR; // 循环模式
	UART1RxDMA_Handler.Init.PeriphBurst = DMA_PBURST_SINGLE; // 外设突发传输配置
	UART1RxDMA_Handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // 外设数据长度
	UART1RxDMA_Handler.Init.PeriphInc = DMA_PINC_DISABLE; // 外设地址非自增
	UART1RxDMA_Handler.Init.Priority = DMA_PRIORITY_MEDIUM; // 中等优先级
	HAL_DMA_Init(&UART1RxDMA_Handler);
		
	// 发送DMA配置
	UART1TxDMA_Handler.Instance = DMA2_Stream7; // 数据流选择
	UART1TxDMA_Handler.Init.Channel = DMA_CHANNEL_4; // 通道选择
	UART1TxDMA_Handler.Init.Direction = DMA_MEMORY_TO_PERIPH; // 外设到存储器
	UART1TxDMA_Handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE; // FIFO不使能
	UART1TxDMA_Handler.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; // FIFO阈值
	UART1TxDMA_Handler.Init.MemBurst = DMA_MBURST_SINGLE; // 内存突发传输配置
	UART1TxDMA_Handler.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; // 存储器数据长度
	UART1TxDMA_Handler.Init.MemInc = DMA_MINC_ENABLE; // 内存寄存器地址是否自增
	UART1TxDMA_Handler.Init.Mode = DMA_NORMAL; // 正常模式
	UART1TxDMA_Handler.Init.PeriphBurst = DMA_PBURST_SINGLE; // 外设突发传输配置
	UART1TxDMA_Handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // 外设数据长度
	UART1TxDMA_Handler.Init.PeriphInc = DMA_PINC_DISABLE; // 外设地址非自增
	UART1TxDMA_Handler.Init.Priority = DMA_PRIORITY_MEDIUM; // 中等优先级
	HAL_DMA_Init(&UART1TxDMA_Handler);
	
	HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 0, 0);
	HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);		
}
  • 定义DMA2数据流7(串口DMA发送)中断服务函数,在函数中调用HAL_DMA_IRQHandler处理DMA中断请求。
// 缓冲区 -> Tx 中断服务函数
void DMA2_Stream7_IRQHandler(void)
{
	HAL_DMA_IRQHandler(&UART1TxDMA_Handler);
}
  • 定义串口DMA接收数据函数。在函数中调用HAL_UART_Receive_DMA实现使用DMA从串口接收数据。
// 串口DMA接收数据
void UART_DMA_Receive(uint8_t *pData, uint16_t Size)
{
	HAL_UART_Receive_DMA(&UART1_Handler, pData, Size);	
}
  • 定义串口DMA发送数据函数。在函数中首先调用HAL_DMA_Start_IT开启串口DMA发送完成中断,并设置发送数据缓冲区地址、外设寄存器地址以及发送数据个数,然后调用SET_BIT配置串口DMA发送标志位(DMAT)。
extern uint8_t Rx_buffer[RXBUFFERSIZE]; // 发送数据缓冲区

// 串口DMA发送数据
void UART_DMA_Transmit(UART_HandleTypeDef *huart)
{
	HAL_DMA_Start_IT(UART1_Handler.hdmatx, (uint32_t)Rx_buffer, (uint32_t)&UART1_Handler.Instance->DR, RXBUFFERSIZE);
	SET_BIT(UART1_Handler.Instance->CR3, USART_CR3_DMAT);	
}
  • 修改串口初始化函数,将串口DMA发送和接收初始化句柄传入串口初始化结构体变量中(串口初始化代码请参考源码)。
// 初始化串口函数
void UART_Init(void)
{
	UART1_Handler.Instance = USART1; // 串口1
	UART1_Handler.Init.BaudRate = 115200; // 波特率
	UART1_Handler.Init.HwFlowCtl = UART_HWCONTROL_NONE; // 无硬件流控
	UART1_Handler.Init.Mode = UART_MODE_TX_RX; // 收发模式
	UART1_Handler.Init.Parity = UART_PARITY_NONE; // 无奇偶校验
	UART1_Handler.Init.StopBits = UART_STOPBITS_1; // 一个停止位
	UART1_Handler.Init.WordLength = UART_WORDLENGTH_8B; // 字长为8位格式
	UART1_Handler.hdmarx = &UART1RxDMA_Handler; // 传入接收DMA句柄
	UART1_Handler.hdmatx = &UART1TxDMA_Handler; // 传入发送DMA句柄
	HAL_UART_Init(&UART1_Handler); // 初始化串口
}
  • 在main.c文件中调用函数实现串口DMA数据收发。

        第一步:声明串口初始化句柄方便下面函数调用,并定义接收数据缓冲区。

        第二步:初始化系统时钟、DMA及串口。

        第三步:在循环中调用UART_DMA_Transmit和HAL_Delay函数,实现每隔一秒发送一组收到的数据。

extern UART_HandleTypeDef UART1_Handler; // UART 句柄
uint8_t Rx_buffer[RXBUFFERSIZE]; // 串口接收数据缓冲区

int main(void)
{
	CLOCLK_Init(); // 配置系统时钟为168M
	UART_DMA_Init(); // 串口DMA初始化
	UART_Init(); // 串口初始化	
	
	UART_DMA_Receive(Rx_buffer, RXBUFFERSIZE); // 使用DMA接收数据
	
	while(1)
	{
		HAL_Delay(1000); // 延时1s
		UART_DMA_Transmit(&UART1_Handler); // 发送数据
	}
}

现象

        将程序下载到开发板中,找到 USART1 引脚通过 USB 转串口模块连接到电脑上,打开串口助手,配置好波特率、数据位、校验位、停止位等,点击打开串口。将发送的数据添加到发送缓冲区,点击自动发送,可以看到接收缓冲区每隔1s会接收到返回的数据。

 

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

串口+DMA 数据收发编程实践 的相关文章

  • STM32H7xx 串口DMA发送&接收(LL库)

    文章目录 1 前言2 STM32H7实现2 1 关键步骤2 2 注意事项 3 代码仓库 1 前言 关于串口DMA收发实现 xff0c 不同CPU其套路都是类似的 xff0c 不同之处在于寄存器配置 依赖BSP库等差异 串口DMA收发详细实现
  • 使用DMA+SPI驱动Aliyun Things 上的ST7789H2 LCD屏幕

    目录 前言硬件CUBEMX时钟树GPIOSPI 代码部分LCD驱动中断服务函数测试代码现象 前言 1 xff1a 驱动程序参考自https blog csdn net BearPi article details 104311705 2 x
  • 【STM32】DMA原理,配置步骤超详细,一文搞懂DMA

    目录 DMA xff08 Direct Memory Access xff09 简介 DMA传输方式 DMA功能框图 DMA请求映像 DMA1控制器 DMA2控制器 通道 仲裁器 DMA主要特性 DMA处理 DMA数据配置 从哪里来到哪里去
  • linux的dma驱动

    硬件平台 xff1a TI的3530 内核 xff1a linux 2 6 36 功能 xff1a 将fpga的数据从内存的一个地方复制到内存另一个地方 初学dma感到很是吃力 xff0c 编写的内核驱动代码仔细看了一个星期 xff0c 才
  • STM32CubeMX配置串口DMA传输实现不定长数据收发

    串口简介 串口是全双工的串行通信协议 串口通信指串口按位 xff08 bit xff09 发送和接收字节 xff08 一个字节有8位 xff09 尽管比特字节 xff08 byte xff09 的串行通信慢 xff0c 但是串口可以在使用一
  • 中断与DMA

    中断 Cortex M3256 个优先级和 128 个抢占级悬起pending 中断中断的类型中断结构 DMA通道映射源传输和目标传输寄存器中断状态寄存器和中断标志清除寄存器通道x配置DMA stream x configuration r
  • STM32使用串口空闲中断(IDLE)和 DMA接收一串数据流

    STM32使用串口空闲中断 xff08 IDLE xff09 和 DMA接收不定长数据 方法一 使用宏定义判断IDLE标志位 空闲的定义是总线上在一个字节的时间内没有再接收到数据 xff0c USART IT IDLE空闲中断是检测到有数据
  • I/O的控制方式——查询,中断,dma

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

    该文档介绍stm32 uart1通过DMA方式发送和接收数据 xff0c 代码示例基于ucos ii操作系统 该文档参考https wenku baidu com view d44ef1380975f46526d3e1b5 html 中内容
  • stm32串口DMA方式向上位机连续发送数据

    目录 一 认识DMA1 DMA框图2 什么是DMA xff1f 3 DMA传输方式4 DMA传输参数5 DMA数据传输的四个要素6 DMA的应用场景 二 串口DMA方式向上位机发送数据1 实验要求2 通过STMCube配置项目 1 设置RC
  • STM32 DMA正常模式等待传输完成和开始下一次传输

    选择DMA的正常模式 xff0c 即DMA只传输一次 如果当传输完一次后 xff0c 还想再传输一次 xff0c 就需要重启DMA xff1a DMA Cmd DMA1 Channel6 DISABLE 重新设置源地址 重新设置目的地址 重
  • 在EBAZ4205 zynq7010上运行AXI_DMA中断回环测试

    在EBAZ4205 zynq7010上运行AXI DMA loop interrupt 整体的布局图 这是上面的一张接口图 下面对每个模块附上截图 AXI DMA的输出mm2s introut s2mm introut接到PS系统的中断触发
  • STM32通用定时器(原理、结构体、库函数、定时器中断每秒闪烁一次灯) —— 时钟源、分频值、重装载值

    参考 stm32定时器与定时器中断 作者 打酱油的 发布时间 2021 04 11 01 04 09 网址 https blog csdn net weixin 46098612 article details 115493737 参考 s
  • 多核架构中的 CPU 和内存访问

    我想知道如果 例如 CPU 的 2 个核心尝试同时访问内存 通过内存控制器 一般 如何处理内存访问 实际上 当内核和启用 DMA 的 IO 设备尝试以相同方式访问时 同样适用 I think 内存控制器足够智能 可以利用地址总线并同时处理这
  • arm64 上的 Linux:从 mmapped 相干 DMA 缓冲区发送数据时,sendto 导致“未处理的故障:对齐故障 (0x96000021)”

    我正在构建一个基于配备arm64 CPU的UltraScale FPGA的数据采集系统 数据通过DMA传输到RAM 驱动程序中的 DMA 缓冲区保留如下 virt buf i dma zalloc coherent pdev gt dev
  • Linux驱动程序DMA传输到PC作为主机的PCIe卡

    我正在开发一个 DMA 例程 将数据从 PC 传输到 PCIe 卡上的 FPGA 我阅读了 DMA API txt 和 LDD3 ch 15 详细信息 但是 我不知道如何从 PC 到 PCIe 卡上的一致 iomem 块进行 DMA 传输
  • 分配大的 DMA 缓冲区

    我想分配一个大的 DMA 缓冲区 大小约为 40 MB 当我使用dma alloc coherent 它失败了 我看到的是 cut here WARNING at mm page alloc c 2106 alloc pages nodem
  • 如何从cdev获取设备

    我正在编写一个内核模块 它将分配一些一致的内存并返回相应的虚拟和物理地址 我正在将模块注册为cdev 分配空间dma alloc coherent 我想使用 mmap 它dma common mmap dma common mmap 需要一
  • Linux 内核中的 DMA 映射和 DMA 引擎是什么?

    Linux 内核中的 DMA 映射和 DMA 引擎是什么 DMA映射API和DMA引擎API何时可以在Linux设备驱动程序中使用 任何真正的 Linux 设备驱动程序示例作为参考都会很棒 Linux 内核中的 DMA 映射和 DMA 引擎
  • 环形缓冲区和 DMA

    我试图了解从数据包到达网卡到目标应用程序收到数据包之间发生的所有事情 假设 缓冲区足够大 可以容纳整个数据包 我知道情况并非总是如此 但我不想介绍太多技术细节 一种选择是 1 Packet reaches the NIC 2 Interru

随机推荐

  • altium designer导出bom表和贴片图

    altium designer的简单使用 xff0c 做一下记录 1 导出bom表 xff0c https jingyan baidu com article cb5d6105133e8f005c2fe0fe html 2 导出贴片图 xf
  • 基于RPLIDAR激光雷达开发无人机机载室内二维重建装置(2)——RPLIDAR测试

    从官网上 xff08 http www slamtec com xff09 下载开发用的SDK及数据手册等相关资料 xff0c 但Arduino相关资料貌似已失效 xff0c 之后尝试从其他渠道下载 先安装对应系统的驱动 xff0c 之后打
  • Visio2016与office2016安装解决方法终极版

    基本解决方案 删除注册表 office软件在我们日常生活中的应用十分广泛 xff0c 在购买电脑时大部分会给电脑装上office家庭版 xff0c 但是有些人由于工作需要可能使用office更多的功能 xff0c 因此可以选择安装专业版 而
  • 微带天线学习

    微带天线学习 侧馈矩形微带天线同轴馈电矩形微带天线双频微带天线 学习方法是根据HFSS软件学习微带天线的优化 参数计算 xff0c 以及根据HFSS仿真结果进一步理解微带天线中参数对天线性能的影响 微带天线贴片尺寸计算方法及matlab代码
  • Zotero IEEE trans期刊cls格式调整

    Zotero IEEE trans期刊cls格式调整 Zotero软件自带的IEEE期刊的引用格式不符合期刊投稿要求 xff0c 因此需要改变cls文件 xff0c 改变引用格式 cls格式编辑网站 xff1a https editor c
  • ADS2021安装

    1 ADS简介 先进设计系统 Advanced Design system xff08 ADS xff09 Agilent Technologies 是领先的电子设计自动化软件 xff0c 适用于射频 微波和信号完整性应用 2 ADS的安装
  • Mysql整体介绍(适用于5.X版本)(上)(标贝科技)

    标贝科技 https ai data baker com source 61 qwer12 填写邀请码fwwqgs xff0c 每日免费调用量还可以翻倍 Mysql整体介绍 xff08 适用于5 X版本 xff09 标贝科技 Mysql 8
  • TE、TM、TEM模式的区别

    在一众电磁仿真软件的使用中 xff0c 牵涉到平面波的设置或Floquet端口的设置 在设置平面波时 xff0c 论坛里有不少人提到TE波 TM波 xff1b 在设置Floquet端口时 xff0c 又有不少人提到TE极化 TM极化 其实
  • linux下TCP socket编程入门案例(二)——非阻塞的TCP server&client

    文章目录 1 相关概念介绍1 1 阻塞与非阻塞1 2 两者区别1 3 select模型 2 编码实现2 1 代码改进2 2 实现服务端客户端 3 运行结果 在 上一篇 阻塞的TCP server amp client 中 xff0c 介绍了
  • cartographer 主从机rviz订阅地图出错

    cartographer 主从机rviz订阅地图出错 配置及想法 机器人以及虚拟机都是ubuntu16 43 kinetic xff0c 本意想在虚拟机端查看机器人cartographer的建图情况 直接在虚拟机端运行命令 rviz d t
  • TCP的连接和建立(三次握手和四次挥手)

    1 TCP连接的建立 连接的建立 xff0c 通常称为三次握手 建立连接前服务器处在收听状态 第一步 xff1a 客户机的TCP向服务器的TCP发送连接请求报文段 同步位 61 1 这时客户进程进入同步已发送状态 第二步 xff1a 服务器
  • 网络编程(8)自定义网络通讯协议

    C C 43 43 网络通讯真正要用起来 xff0c 不但要写一个好的网络服务器 xff0c 还要定好一套通讯协议才能真正实用 通讯协议业界目前除了用开源的如XMPP以外 xff0c 基本上都是自定义一套通讯协议 xff0c 自已负责封包
  • libtorch导致OPENCV错误:对‘cv::imread(std::string const&, int)’未定义的引用

    1 问题描述 xff1a 报错 xff1a cmakelist txt 提示 xff1a 如果你报了相同的错误 xff0c 但是没有安装libtorch的话 xff0c 可能是cmakelist中没有target link librarie
  • 串口调试助手-QT

    串口调试助手 该程序使用Qt框架 xff0c C 43 43 语言编译而成 项目文件介绍 xff1a main cpp 该文件为该程序的入口程序 mainwindow h 该文件为该程序的主要声明部分 mainwindow cpp 该文件为
  • 基于STM32的电机--电机概述

    文章目录 电机直流有刷电机步进电机伺服电机直流无刷电机舵机 电机 电机 xff1a 俗称 马达 xff0c 依据电磁感应定律实现 电能转换或传递 的一种电磁装置 包括 xff1a 电动机和发电机 电动机在电路中是用M表示 xff0c 它的主
  • 免费公测 标贝声音理解,检测声音性别和年龄

    古有听声辨位 xff0c 今有听声 识 人 说到声音 xff0c 其本质是不同频率声音的集合 xff0c 以波的形式振动 xff08 震动 xff09 传播 由于每个人的发声器官 xff08 口腔 鼻腔 声带 xff09 各不相同 xff0
  • 前后端分离Token验证流程

    1 根据header获取token request getHeader Authorization 2 判断token 是否存在 3 token 不存在 过滤器放行 存在 根据token 获取用户名 根据用户名查询用户记录 UserDeta
  • 车载毫米波雷达MIMO阵列的天线发射问题

    说明 关于MIMO Multiple Input Multiple Output xff0c 多发多收 就不做过多介绍了 xff0c MIMO技术用于车载毫米波雷达主要的目的是增加虚拟通道 xff0c 以期使用较少的收发天线数量来达到较大的
  • 毫米波雷达的硬件架构与射频前端

    说明 本篇博文梳理 车载 毫米波雷达的系统构成 xff0c 特别地 xff0c 对其射频前端各部件做细节性的原理说明 本篇博文会基于对这方面知识理解的加深以及读者的反馈长期更新内容和所附资料 xff0c 有不当之处或有其它有益的参考资料可以
  • 串口+DMA 数据收发编程实践

    更多交流欢迎关注作者抖音号 xff1a 81849645041 目标 了解DMA 的工作原理 xff0c 通过配置 STM32F407 芯片的DMA xff0c 实现串口 43 DMA数据收发 原理 基于USART的数据通讯中采用中断方式可