精华内容
下载资源
问答
  • dma中断定长发送本来很简单的一个问题让hal搞的头大,调来调去的,说好的彻底封装呢,确实很彻底啊,不废话了,实测之后说说的理解吧,不对的话请大佬指正。 hal_uart_transmit_dma如果配置好了dam,开启了通道,...

    dma中断定长发送本来很简单的一个问题让hal搞的头大,调来调去的,说好的彻底封装呢,确实很彻底啊,不废话了,实测之后说说的理解吧,不对的话请大佬指正。
    hal_uart_transmit_dma如果配置好了dam,开启了通道,直接用这个函数。那么这个函数里面是个啥样的。
    函数主体:
    HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
    {
    uint32_t *tmp;

    /* Check that a Tx process is not already ongoing */
    if(huart->gState == HAL_UART_STATE_READY)
    {
    if((pData == NULL ) || (Size == 0U))
    {
    return HAL_ERROR;
    }

    /* Process Locked */
    __HAL_LOCK(huart);
    
    huart->pTxBuffPtr = pData;
    huart->TxXferSize = Size;
    huart->TxXferCount = Size;
    
    huart->ErrorCode = HAL_UART_ERROR_NONE;
    huart->gState = HAL_UART_STATE_BUSY_TX;
    
    /* Set the UART DMA transfer complete callback */
    huart->hdmatx->XferCpltCallback = UART_DMATransmitCplt;
    
    /* Set the UART DMA Half transfer complete callback */
    huart->hdmatx->XferHalfCpltCallback = UART_DMATxHalfCplt;
    
    /* Set the DMA error callback */
    huart->hdmatx->XferErrorCallback = UART_DMAError;
    
    /* Set the DMA abort callback */
    huart->hdmatx->XferAbortCallback = NULL;
    
    /* Enable the UART transmit DMA Stream */
    tmp = (uint32_t*)&pData;
    HAL_DMA_Start_IT(huart->hdmatx, *(uint32_t*)tmp, (uint32_t)&huart->Instance->DR, Size);
    
    /* Clear the TC flag in the SR register by writing 0 to it */
    __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC);
    
    /* Process Unlocked */
    __HAL_UNLOCK(huart);
    
    /* Enable the DMA transfer for transmit request by setting the DMAT bit
       in the UART CR3 register */
    SET_BIT(huart->Instance->CR3, USART_CR3_DMAT);
    
    return HAL_OK;
    

    }
    else
    {
    return HAL_BUSY;
    }
    }

    除了相关的初始化外,只要的就是HAL_DMA_Start_IT,很熟悉吧,对了就是势能一次dma,然后__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC);清除一下串口接收完成标志(不知道如果开启了串口中断的话是个什么鬼情况,按道理应该是优先级的问题)再然后最后一步就是启动一次dma传输SET_BIT(huart->Instance->CR3, USART_CR3_DMAT);据说hal库里面没有相关函数所有得用寄存器了。
    当然在hal_dma_start_it里面是势能了所有接收/发送的相关句柄的中断情况的。
    那么调用了hal_uart_transmit_dma,他的回调函数在哪里呢,我是真的让这个东西看哭了,看手册发现这个回调函数还是串口发送的回调函数 HAL_UART_Receive_DMA(&huart1,(uint8_t *)aRxMessage,10);
    实测代码:
    //stm32f1xx_it.c中的DMA中断句柄
    void DMA1_Channel5_IRQHandler(void)
    {
    /* USER CODE BEGIN DMA1_Channel5_IRQn 0 */

    /* USER CODE END DMA1_Channel5_IRQn 0 */
    printf(“here DMA1_Channel5_IRQHandler”);
    HAL_DMA_IRQHandler(&hdma_usart1_rx);//串口接收DMA通道
    /* USER CODE BEGIN DMA1_Channel5_IRQn 1 */

    /* USER CODE END DMA1_Channel5_IRQn 1 */
    }

    //在main.c中通过重载来处理DMA接收的数据
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
    /* Prevent unused argument(s) compilation warning */
    UNUSED(huart);

    //printf("%c",aRxBuffer[ss]);
    

    /* NOTE : This function should not be modified, when the callback is needed,
    the HAL_UART_RxCpltCallback can be implemented in the user file
    */

       for (i=0;i<100;i++){
    
                printf("%c",aRxMessage[i]);
    
        }
    
       HAL_UART_Receive_DMA(&huart1,(uint8_t *)aRxMessage,10);
    
    
    //HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 10,0xFFFF);
    

    }
    /* USER CODE END 4 */

    使用串口DMA接收数据,即使不使用“接收一半数据中断”,在接收一半数据后,也会触发相应的DMA通道中断句柄,全部数据接收完成后,又触发相应的DMA通道中断句柄,通过DMA通道中断句柄,而DMA中断句柄最终还是会调用串口接收中断回调函数,所以最终接收的数据可以通过重载串口接收中断回调函数来处理

    在stm32f1xx_it.c中的与串口接收相关的DMA通道中断句柄函数,注意这个中断句柄与接收或发送相对应,也就是说发送和接收是2个不同DMA通道中断句柄。比如使用 HAL_UART_Receive_DMA(&huart1,(uint8_t *)aRxMessage,6) 在下面的代码中,我接收到3个数据就会触发printf(“here DMA1_Channel5_IRQHandler”) 接收到6个数据,又触发printf(“here DMA1_Channel5_IRQHandler”),同时这接收到的6个数据,通过重载串口接收中断回调函数来处理。(其实这整个流程就是调用HAL_UART_Receive_DMA函数后还是会回到标准库中找到DMA1_Channel5_IRQHandler相关流通道的中断函数,然后进入HAL_DMA_IRQHandler,这个是hal库中给的统一的dma中断处理函数,然后在里面判断是哪一种中断标志,然后调用相关的串口回调处理函数处理数据),hal库的好处就是我们省去了中间调来调去的过程,用户直接用串口回调函数就好了,对了记得最后如果还要继续调用一次HAL_UART_Receive_DMA继续接收,反正我是没有清除中断标志位的,不知道是不是清除串口中断就可以了,明天测试下发送。有问题的话可以在讨论下,反正我觉得没有标准库好用,可是stmcube好用啊!

    展开全文
  • 文章目录使用printf函数DMA串口接收发送数据 使用printf函数 STM32 HAL库 UART使用printf 主函数中添加如下代码 /* USER CODE BEGIN 0 */ //1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件) #...

    使用printf函数

    STM32 HAL库 UART使用printf
    主函数中添加如下代码

    /* USER CODE BEGIN 0 */
    
    //1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)
    #include <stdio.h>
    
    //2、在main文件中重定义<fputc>函数 如下:
    // 发送数据
    int fputc(int ch, FILE *f)
    {
    HAL_UART_Transmit(&huart1,(uint8_t *)&ch, 1, 0xFFFF);// USART1 可以换成 USART2 等
    while (!(USART1->SR & UART_FLAG_TXE));
    return (ch);
    }
    // 接收数据
    int GetKey (void) {
    while (!(USART1->SR & UART_FLAG_RXNE));
    return ((int)(USART1->DR & 0x1FF));
    }
    /* USER CODE END 0 */
    
    printf("\n\r while循环中!!!\n\r");
    

    在这里插入图片描述

    DMA串口接收发送数据

    STM32—cubeMX+DMA+USART 接收任意长度的数据

    1、串口初始化

    CubeMx自动生成,在USERcode添加

    /**
      * @brief USART1 Initialization Function
      * @param None
      * @retval None
      */
    static void MX_USART1_UART_Init(void)
    {
    
      /* USER CODE BEGIN USART1_Init 0 */
    
      /* USER CODE END USART1_Init 0 */
    
      /* USER CODE BEGIN USART1_Init 1 */
    
      /* USER CODE END USART1_Init 1 */
      huart1.Instance = USART1;
      huart1.Init.BaudRate = 115200;
      huart1.Init.WordLength = UART_WORDLENGTH_8B;
      huart1.Init.StopBits = UART_STOPBITS_1;
      huart1.Init.Parity = UART_PARITY_NONE;
      huart1.Init.Mode = UART_MODE_TX_RX;
      huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
      huart1.Init.OverSampling = UART_OVERSAMPLING_16;
      if (HAL_UART_Init(&huart1) != HAL_OK)
      {
        Error_Handler();
      }
      /* USER CODE BEGIN USART1_Init 2 */
    	__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能idle中断
    	HAL_UART_Receive_DMA(&huart1,rx_buffer,buffsize);//打开DMA接收,数据存入rx_buffer数组中。
      /* USER CODE END USART1_Init 2 */
    
    }
    
    
    2、接收中断处理
    /**
      * @brief This function handles USART1 global interrupt.
      */
    void USART1_IRQHandler(void)
    {
      /* USER CODE BEGIN USART1_IRQn 0 */
    	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  = hdma_usart1_rx.Instance->NDTR;// 获取DMA中未传输的数据个数,NDTR寄存器分析见下面
    		rx_len =  buffsize - temp; //总计数减去未传输的数据个数,得到已经接收的数据个数
    		recv_end_flag = 1;	// 接受完成标志位置1	
    	 }
      /* USER CODE END USART1_IRQn 0 */
      HAL_UART_IRQHandler(&huart1);
      /* USER CODE BEGIN USART1_IRQn 1 */
    
      /* USER CODE END USART1_IRQn 1 */
    }
    
    3、主循环函数
      while (1)
      {	
    		
    
    		if(recv_end_flag ==1)
    		{
    //			printf("\n\r while循环中!!!\n\r");
    			printf("rx_len=%d\r\n",rx_len);//打印接收长度
    //			PackageSendData((uint8_t *) rx_buffer, &rx_len);
    			HAL_UART_Transmit(&huart1,rx_buffer, rx_len,200);//接收数据打印出来
    			for(uint8_t i=0;i<rx_len;i++)
    				{
    					rx_buffer[i]=0;//清接收缓存
    				}
    			rx_len=0;//清除计数
    			recv_end_flag=0;//清除接收结束标志位
    		}
    		HAL_UART_Receive_DMA(&huart1,rx_buffer,buffsize);//重新打开DMA接收	
    }
    

    在这里插入图片描述

    打包发送数据

    /***********************************************************************************************************
    * 函数名称: PackageSendData()
    * 输入参数: data,要发送的数据的首地址; *len,发送数据的总长度
    * 返回值  : 无
    * 功    能: 根据通信协议,封装要发送的数据
    ************************************************************************************************************/
    void PackageSendData(u8* data, u8* len)
    {
      u8 temp[64],temp1[64],i,j = 0;
      u16 crc;
      
      memset(&temp[0], 0, sizeof(temp));
      memset(&temp1[0], 0, sizeof(temp1));
      memcpy(&temp[2], data, *len); //复制传输数据
      temp[0] = FrameHeader; //加入帧头
      temp[1] = *len+3; //加入长度值
      crc = CRC16MODBUS(&temp[1], *len+1); //计算CRC16校验值
      memcpy(&temp[*len+2], &crc, 2); //复制校验值
      for(i=3; i < *len+3+j; )
      {
        if((temp[i]==FrameHeader)||(temp[i]==FrameEnd))//如果传输的数据中有和帧头或帧尾一样的数据则插入转义符
        {
          memset(&temp1[0], 0, sizeof(temp1));
          memcpy(&temp1[0], &temp[i], *len+3+j-i);
          temp[i] = 0x5C; //加入转义符 ‘\'
          memcpy(&temp[i+1], &temp1[0], *len+3+j-i);
          i = i+2;
          j++;
        }
        else
          i++;
      }
      temp[*len+4+j] = FrameEnd;
      memcpy(data, &temp[0], *len+5+j);
      *len = *len+5+j;
    }
    
    	/* UART_Transmit test BEGIN 串口数据发送测试*/
    	u8 cnt;
    	cnt = 5;
    	u8 uart2BUF[32] = {0X2A,0X2B,0x2C,0x2D,0x2E,0x2F,0x21,0x22};
    	PackageSendData((uint8_t *) uart2BUF, &cnt);
    	HAL_UART_Transmit(&huart2,(uint8_t *)uart2BUF,cnt,0XFF);
    		/* UART_Transmit test END*/
    

    在这里插入图片描述

    接收指定协议数据

    验证接收数据有效性

    发送 01 02
    打包后数据为 9A 05 01 02 E1 90 9B
    在这里插入图片描述

    /***********************************************************************************************************
    * 函数名称: UnpackReceivedData()
    * 输入参数: data,要解包的数据的首地址,*len 要解包的数据的总长度(不包括帧头和帧尾)
    * 返回值  : 1, 数据有效, 0,数据无效。
    * 功    能: 解包接收到的数据并判断数据有效性
    ************************************************************************************************************/
    u8 UnpackReceivedData(u8* data, u8* len)
    {
      u16 crc,crctemp;
      
      memcpy(&crctemp,(data+*len-3),2); //复制数据中的CRC校验值
    	printf("crctemp=%d\r\n",crctemp);
      crc = CRC16MODBUS(data, *len-3); //计算数据的CRC16校验值
    	printf("crc=%d\r\n",crc);
      if(crctemp == crc) //校验值正确
        return 1;
      
      return 0;
    }
    

    CRC校验范围为数据长度位 + 数据 不包括帧头
    在这里插入图片描述

    展开全文
  • 发送接收两个函数  /*##-2- Start the transmission process #####################################*/  /* While the UART in reception process, user can transmit data through   "aTxBuffer"...

    发送和接收两个函数

      /*##-2- Start the transmission process #####################################*/  
      /* While the UART in reception process, user can transmit data through 
         "aTxBuffer" buffer */
      if(HAL_UART_Transmit_IT(&UartHandle, (uint8_t*)aTxBuffer, TXBUFFERSIZE)!= HAL_OK)
      {
        Error_Handler();
      }
      
      /*##-3- Wait for the end of the transfer ###################################*/   
      while (UartReady != SET)
      {
      }
      
      /* Reset transmission flag */
      UartReady = RESET;
      
      /*##-4- Put UART peripheral in reception process ###########################*/  
      if(HAL_UART_Receive_IT(&UartHandle, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)
      {
        Error_Handler();
      }

    下面是zhon重点:::::

    开始我以为这两个只是中断发送和中断接收函数,原来还有使能发送中断和接收zh中断的作用,如果不执行这两个函数,就不会使能发送中断或接收中断,从而下面这两个回调函数的内容就不会执行,尤其是接收中断,执行一次后要再zhi'执行一次HAL_UART_Receive_IT这个函数,才能再次启用接收中断

    谢谢这篇文章的作者:

    https://blog.csdn.net/ouening/article/details/79218971

     

     @brief  ·¢ËÍÍê³ÉÖжϻص÷º¯ÊýTx Transfer completed callback
      * @param  UartHandle: UART handle. 
      * @note   This example shows a simple way to report end of IT Tx transfer, and 
      *         you can add your own implementation. 
      * @retval None
      */
    void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle)
    {
      /* Set transmission flag: transfer complete */
      UartReady = SET; 
      LED1_OFF();
    }

    /**
      * @brief  ½ÓÊÕÍê³ÉÖжϻص÷º¯ÊýRx Transfer completed callback
      * @param  UartHandle: UART handle
      * @note   This example shows a simple way to report end of DMA Rx transfer, and 
      *         you can add your own implementation.
      * @retval None
      */
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
    {
      //uint8_t* pc;
      //uint8_t ch = 0;
     

     

     

    展开全文
  • 最小系统:STM32F103RCT6 开发环境:STM32CUBEIDE ...所以直接发送直接接收是不可行的。 我们可以定义自己的数据包,定义帧头帧尾 将自定义规则的数据放在中间(不追求严谨可不考虑校验位)。 代码: /* * protol.h

    最小系统:STM32F103RCT6
    开发环境:STM32CUBEIDE
    实现功能:OPENMV作为上位机发送识别物体后获取的坐标信息,加上帧头帧尾表示信息结构

    举个例子,如果你需要发送两个坐标(x,y),发送的坐标信息之间没有间隔。那数据流应该是这个样子:xyxyxyxyxyxy
    单片机在接受时很容易分不清本次接收的值是x坐标还是y坐标。所以直接发送直接接收是不可行的。
    我们可以定义自己的数据包,定义帧头帧尾 将自定义规则的数据放在中间(不追求严谨可不考虑校验位)。

    代码:

    /*
     * protol.h
     *
     *  Created on: 2020年9月27日
     *      Author: kindresy
     */
    
    #ifndef INC_PROTOL_H_
    #define INC_PROTOL_H_
    
    
    
    #include "usart.h"
    #include "string.h"
    #include "stdio.h"
    #include "stdbool.h"
    
    #define  DataLength 24
    
    typedef struct __Protol_HandleTypedef
    {
    	uint8_t  FrameHead;
    	uint8_t  FrameTail;
    	uint8_t  Rxpacker[DataLength];
    	uint8_t  rec;
    	uint8_t  count;
    	uint8_t  data;
    	bool  packflag;
    
    }ProtolHandleTypedef;
    
    void Protol_Init(uint8_t  FrameHead,uint8_t  FrameTail,ProtolHandleTypedef * protol);
    bool Usart_DataGet(ProtolHandleTypedef * protol);
    
    #endif /* INC_PROTOL_H_ */
    
    /*
     * protol.c
     *
     *  Created on: 2020年9月27日
     *      Author: kindresy
     */
    #include "protol.h"
    
    void Protol_Init( uint8_t  FrameHead,
    				   uint8_t  FrameTail,
    				   ProtolHandleTypedef * protol)
    {
    	protol->FrameTail=FrameTail;
    	protol->FrameHead=FrameHead;
    	memset(protol->Rxpacker,0,DataLength);
    	protol->packflag=false;
    	protol->rec     =0;
    	protol->count   =0;
    	protol->data    =0;
    }
    
    bool Usart_DataGet(ProtolHandleTypedef * protol)
    {
    
    	if(protol->data == protol->FrameHead)
    	{
    
    		memset(protol->Rxpacker,0,DataLength);
    		protol->rec=1;
    		protol->count=0;
    		protol->packflag=false;
    		return protol->packflag;
    
    	}
    
    	else if(protol->data == protol->FrameTail)
    	{
    
    		protol->rec=0;
    		protol->packflag=true;
    
    	}
    
    	if(protol->rec)
    	{
    
    		protol->Rxpacker[protol->count++]=protol->data;
    		protol->packflag=false;
    
    	}
    	return protol->packflag;
    
    }
    
    ProtolHandleTypedef ov_usart;
    ProtolHandleTypedef * ov_usarthandler=&ov_usart;
    
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
    	if(huart == &huart1)
    	{
    		if(Usart_DataGet(ov_usarthandler))
    		{
    			HAL_UART_Transmit(&huart2,&(ov_usarthandler->data),1,100);
    
    		}
    	}
    	HAL_UART_AbortReceive_IT(&huart1);
    	HAL_UART_Receive_IT(&huart1,&(ov_usarthandler->data),1);
    }
    
    int main()
    {
    	//..........
    	Protol_Init(0xff,0xfe,ov_usarthandler);
    	HAL_UART_Transmit_IT(&huart1,&ov_usarthandler->data,1);
    
    }
    
    

    需要注意的事:
    HAL库的串口接收中断每次接收完毕都需要重新开启
    HAL_UART_Transmit_IT(&huartx,&protol->data,1);

    展开全文
  • 关于STM32 HAL库 串口接收中断 串口每次接收到一个数据都会进入中断,而只有huart->RxXferCount减小到0了,才会进入中断回调函数。可以从下图中看出。 所以,中断接收的过程就是 (pTxBuffPtr,TxXferSize 和 ...
  • 输出:system.out对象 输入:system.in scanner接收控制台输入;Scanner(system.in);使用nextInt();nextDouble(); 单目+ -、赋值:右到左
  • 用STM32 HAL库,串口使用中断模式,发现程序有时候会进去死锁状态,原因应该是串口在发送过程中,这时候数据又被发送过去了,然后就很容易会死锁了。上网找了相关的资料,见链接:...
  • 2.1 HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 2.2HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 三、代码详解 3.1 main()函数 3.2 ...
  • CubeMX,HAL库使用串口发送中断接收一、CubeMX界面配置二、MDK代码 不得不说HAL库和标准库相比确实简单多了。。。 一、CubeMX界面配置 选择完 异步通讯模式 后,其余默认即可。 打开串口中断 二、MDK代码 在/* ...
  • HAL库串口中断接收

    千次阅读 2018-11-17 20:02:00
    然后开启串口中断,在中断接收数据。但是不要在中断中处理数据,中断中尽量少做一些事情 2.编程中用到的函数 (1)HAL库中提供了很多串口操作的函数,有轮询模式收发,中断模式收发和DMA模式收发,我这里用的是...
  • HAL库使用太死板HAL串口中断接收HAL库...HAL库DMA发送目前,我用的是DMA发送,本来向直接将数据扔给DMA,不想开发送DMA的中断,但是,HAL库考虑的比较周详,使用HAL库的DMA发送API,就会使用了DMA句柄中的相关标志位
  • 一.hal库串口接收发送测试 1、串口的模式有3种,一是查询模式,二是中断模式,三是DMA模式 HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制 HAL_UART_Receive();串口轮询模式接收,使用超时管理机制 HAL_...
  • STM32 HAL CubeMX 串口IDLE接收空闲中断+DMA

    万次阅读 多人点赞 2020-03-22 11:01:56
    【STM32】HAL库 STM32CubeMX教程十一—DMA (串口DMA发送接收) 本篇文章我们仅针对例程进行详解剖析 本篇文章提供两种方法: 一种是 :IDLE 接收空闲中断+DMA 一种是: IDLE 接收空闲中断+RXNE接收数据中断 都可完成...
  • 2021/07/20 悍匠暑假集训第三天单个串口收发1、串口在cubeMX中配置2、串口接收中断与空闲中断3、串口发送数据4、串口中断接收字符串数据注意:每次中断只能接收一个字符!!!为了实现多次数据返回,我们要在中断...
  • [STM32系列]一、HAL库的串口中断接收

    千次阅读 2019-09-09 14:41:50
    [STM32系列]一、HAL库的串口中断接收1、前言2、回调函数3、HAL中断接收函数使用 1、前言 HAL即硬件抽象层(英语:Hardware Abstraction Layer),实现了不同硬件的统一接口操作。这就极大的简化了程序员的移植工作...
  • ST推的HAL库,在整个接收过程中,是没有用到串口的接收空闲中断,它的处理有三种,分别是轮询,接收完成中断(每一个字节一次),DMA接收。 整个Hal库把接收发送过程都封装好了,就用最简单的轮询方式看,先看...
  • STM32 HAL库 CAN总线收发-中断方式接收

    千次阅读 多人点赞 2019-11-11 10:48:02
    CAN总线收发,中断方式接收 平台:战舰mini板,STM32F103RB STM32CUBEMX V5.3 TrueSTUDIO V9.3 配置CAN CAN波特率计算方法:时钟主频 / 分频 / (tq1 + tq2 + swj) stm32f103的CAN的时钟主频是36M,分9频就是4M,在...
  • 使用的时候发现:接收完一个字节立即用DMA的方式发送出去,会出现数据的丢失,如用串口调试助手发送1234,返回的只有13 目前只能用缓存buf+协议结束(如0x0d,0x0a)的方式解决。 stm32cubeMX的配置界面如下: 1.使用...
  • https://www.cnblogs.com/1024E/p/13347732.html

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,463
精华内容 1,785
关键字:

hal中断发送接收