精华内容
下载资源
问答
  • HAL库串口中断接收

    千次阅读 2018-11-17 20:02:00
    然后开启串口中断,在中断中接收数据。但是不要在中断中处理数据,中断中尽量少做一些事情 2.编程中用到的函数 (1)HAL库中提供了很多串口操作的函数,有轮询模式收发,中断模式收发和DMA模式收发,我这里用的是...

    1.利用CubeMX配置串口1

    (1)配置串口1波特率为9600,波特率设置的太高有时会收不到消息,我碰到过。然后开启串口中断,在中断中接收数据。但是不要在中断中处理数据,中断中尽量少做一些事情
    1392333-20181117151546465-760941921.jpg

    2.编程中用到的函数


    (1)HAL库中提供了很多串口操作的函数,有轮询模式收发,中断模式收发和DMA模式收发,我这里用的是中断模式
    1392333-20181117152634637-733885637.jpg
    (2)这里用到的三个函数,我说一下他们的意思,其他函数类似
    HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef huart, uint8_t pData, uint16_t Size);
    //该函数功能为开启串口接收中断,并指定存储接收数据的缓存区,设置从串口接收的数据大小。这里要特别注意,该函数只有从串口接收到Size个数据后才会返回,不然会阻塞。
    HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef huart, uint8_t pData, uint16_t Size, uint32_t Timeout);
    //该函数功能为发送数据到指定串口,pData为数据地址,Size为数据大小,Timeout为超时时间。
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
    //该函数为串口接收完数据后的回调函数,在串口中断中,会依次调用以下这些函数:USART1_IRQHandler(),HAL_UART_IRQHandler(&huart1),UART_Receive_IT(),HAL_UART_RxCpltCallback()。回调函数在主函数中可以自己实现,HAL库只有定义,没有具体实现,我们可以在回调函数中做一些处理,来处理我们得到的数据。

    3.代码实现


    (1)这里做一个简单的串口与上位机串口助手通信的实验,将串口助手发送给开发板串口1的数据回发到串口助手。注意,在利用CubeMX生成的代码进行编程时,自己添加的代码一定要加在各种“BEGIN”和“END”之间。
    (2)首先在main中设置全局变量uint8_t RxCounter1=0,RxBuffer1[50]={0},RxTemp1=0,F_Usart1=0;用来保存从串口收到的数据,F_Usart1为接收完成标志,在while中会一直检测它是否变化,然后进行相关操作。RxTemp1为单缓冲区,接收一个字节时可用
    1392333-20181117161400924-742162294.jpg
    (3)在main()函数中while()之前开启串口接收中断,填好相关参数,HAL_UART_Receive_IT(&huart1,&RxTemp1,1);这里这么设置,先把数据保存到RxTemp1,然后再在回调函数中保存到RxBuffer1中,是为了把串口发来的数据完整的存储在RxBuffer1中,方便我进行其他处理
    1392333-20181117193658312-151646064.jpg
    (4)实现回调函数,这里有两种方法,方法一可以保存数据再进行操作,方法二直接发送数据,不进行操作,仔细看图中注释
    1392333-20181117193924518-2055357068.jpg
    (5)在while中的处理
    1392333-20181117200437982-1957774276.jpg

    4.补充说明


    (1)至此,串口实验基本完成。在这里说一下我项目里碰到的另外一个问题,我里面有两个串口通信要处理,先要在程序里发送数据到串口3,然后要把串口3反馈的内容进行一些处理后发送到串口1,这时候需要把开启中断函数里(HAL_UART_Receive_IT(&huart3,&RxBuffer3[RxCounter3++],1);)的数据缓冲区直接设为全局数组,然后回调函数里直接写开启中断的函数即可,不再需要RxTemp1标志位,但是要注意每次程序发送数据后要 延迟200ms,不然数据会收不到。看图中针对串口3的操作即可
    1392333-20181117195002322-88334606.jpg

    1392333-20181117195051999-1217580915.jpg
    1392333-20181117195138369-506610281.jpg

    转载于:https://www.cnblogs.com/yf4695/p/9975230.html

    展开全文
  • 在使用过程中几乎不需要去修改HAL库本身代码, 直接使用现有HAL库接口就可以快速方便的开发应用程序, 配合CubMx对开发人员来说实在是太友好了, 今天介绍个自用的串口中断接收的使用方法, 先看下HAL库串口中断接收的...

    STM32的HAL库将底层包装的很完备了, 在使用过程中几乎不需要去修改HAL库本身代码, 直接使用现有HAL库接口就可以快速方便的开发应用程序, 配合CubMx对开发人员来说实在是太友好了, 今天介绍个自用的串口中断接收的使用方法, 先看下HAL库的串口中断接收的序列图:

    从图中可以看出从第 3步到第7步已经形成一个接收闭环了, HAL库的调用方式上图已说明, 需要用户自己去实现的部分就是重写HAL_UART_RxCpltCallback这个函数, 下面介绍下我使用的接收方法.

    基本原理是使用了自定义的队列进行串口数据的接收存储与处理, 下面具体说下:

    重写的回调函数:

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *aHuart)
    {
    	HAL_StatusTypeDef status;
    
    	if (aHuart->Instance == USART1)
    	{
    		UART1_ReceiveByte(m_Uart1_RcvByte);
    		status = HAL_UART_Receive_IT(aHuart, &m_Uart1_RcvByte, 1);
    	}
    }

    在这里使用了一个字节的变量用于串口数据的接收, 具体接收处理在UART1_ReceiveByte()这个函数中处理, 这么处理的好处是可以更灵活的接收不定长的数据, 在UART1_ReceiveByte函数中的处理更像传统的中断处理方式, 直接处理接收到的单字节即可.

    UART1_ReceiveByte函数中我的处理方式是根据对接设备的协议进行一次预处理, 申请一个足够装下一条协议数据的缓存区对接收到的数据进行截取, 然后将截取到的数据推入到指定队列中.

    然后在消息处理循环中去读取队列中的协议数据, 进行二次判断并进行相应的消息处理即可.

    至此, 该串口中断接收数据处理流程就已完成了.

    展开全文
  • 发送接收两个函数  /*##-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;
     

     

     

    展开全文
  • stm32 cubemx hal库 串口收发 中断接收 包括 MDK项目 和 stm32的cubemx 项目 使用hal最新的库函数开发 cubemx 4.26.1 有中文注释
  • 关于STM32 HAL库 串口接收中断 串口每次接收到一个数据都会进入中断,而只有huart->RxXferCount减小到0了,才会进入中断回调函数。可以从下图中看出。 所以,中断接收的过程就是 (pTxBuffPtr,TxXferSize 和 ...

    关于STM32 HAL库 串口接收中断

    串口每次接收到一个数据都会进入中断,而只有huart->RxXferCount减小到0了,才会进入中断回调函数。可以从下图中看出。
    在这里插入图片描述
    在这里插入图片描述
    所以,中断接收的过程就是
    在这里插入图片描述
    (pTxBuffPtr,TxXferSize 和 TxXferCount 三个变量分别用来设置串口发送的数据缓存指针,发送的数据量和还剩余的要发送的数据量。
    pRxBuffPtr,RxXferSize 和RxXferCount 则是用来设置接收的数据缓存指针,接收的最大数据量以及还剩余的要接收的数
    据量。)

    过程

    当接收到一个字符之后,在函数
    UART_Receive_IT中会把数据保存在串口句柄的成员变量pRxBuffPtr缓存中,并且使RxXferSize +1,RxXferCount -1,当RxXferCount 减小到0的时候,就会调用接收完成回调函数
    HAL_UART_RxCpltCallback 进行处理。

    1.CUBEMX配置的MX_USART1_UART_Init()中是没有开启中断的,需要加上

    HAL_UART_Receive_IT(&huart1, (u8 *)aRxBuffer, RXBUFFERSIZE);
    

    其中aRxBuffer是我们自己定义的临时缓冲区,如果它的长度RXBUFFERSIZE = 1,则每次进入中断之后,都会进入中断回调函数。
    2.回调函数每调用一次,库的设置会自动将中断关闭,所以需要再次开启,这里我们放在了USART1_IRQHandler(),中断入口函数中。

    3.读取USARTx->SR能避免莫名其妙的错误,所以在中断入口函数中加了

    while(HAL_UART_GetState(&huart1) != HAL_UART_STATE_READY)//等待就绪
    
    展开全文
  • //HAL库使用的串口接收缓冲 UART_HandleTypeDef UART1_Handler; //UART句柄 int fputc(int ch, FILE *f){ HAL_UART_Transmit (&huart1,(uint8_t *)&ch,1,0xffff); return ch; } int fgetc(FILE *f) { uint8_t ch = ...
  • 最小系统:STM32F103RCT6 开发环境:STM32CUBEIDE ...所以直接发送直接接收是不可行的。 我们可以定义自己的数据包,定义帧头帧尾 将自定义规则的数据放在中间(不追求严谨可不考虑校验位)。 代码: /* * protol.h
  • [STM32系列]一、HAL库串口中断接收

    千次阅读 2019-09-09 14:41:50
    [STM32系列]一、HAL库串口中断接收1、前言2、回调函数3、HAL库中断接收函数使用 1、前言 HAL即硬件抽象层(英语:Hardware Abstraction Layer),实现了不同硬件的统一接口操作。这就极大的简化了程序员的移植工作...
  • stm32采用hal库时,如何多次进入中断接收数据的两种方法,一种是对中断函数进行改造,另一种是对接收回调函数进行改造。
  • 输出:system.out对象 输入:system.in scanner接收控制台输入;Scanner(system.in);使用nextInt();nextDouble(); 单目+ -、赋值:右到左
  • 一.hal库串口接收发送测试 1、串口的模式有3种,一是查询模式,二是中断模式,三是DMA模式 HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制 HAL_UART_Receive();串口轮询模式接收,使用超时管理机制 HAL_...
  • 首先简单研究一下什么时候会出现overrun的问题,配置正常的HAL串口中断接收如下 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { /* judge interrupt source */ if(huart ->Instance == USART2) {...
  • HAL库串口中断

    2021-09-27 10:26:31
    一,配置串口初始化 void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; ...
  • STM32 HAL实现串口中断接收

    千次阅读 2020-03-28 17:20:58
    一、串口设置 1. 异步模式 2. 参数 3. 中断使能 4. 生成代码如下 /* USART6 init function */ static void MX_USART6_UART_Init(void) { huart6.Instance = USART6; huart6.Init.BaudRate = 115200; huart6....
  • STM32 HAL库+串口DMA+空闲中断(IDLE)实现不定长数据接收,可以用来参考学习使用,简单易懂。
  • HAL使用太死板HAL串口中断接收HAL使用起来太不灵活,限制太多,后面如有时间,将使用寄存器和HAL混合操作的方式。 如使用串口中断接收,在接收到数据后,库里做了关闭接收非空中断RXNEIE,如下 HALDMA发送...
  • STM32使用HAL库串口接收中断

    万次阅读 热门讨论 2019-03-16 22:16:31
    下面讲解使用HAL库配置串口1,使串口1可以使用中断接收字节并原样返回。 1. STM32CubeMX对串口1作如下配置 2. 添加如下代码 ​ uint8_t uart1_rxbuf[10]; // 用于存放接收到的数据 void MX_USART1...
  • HAL库串口中断笔记

    千次阅读 2019-02-22 09:22:53
    UART_Receive_IT(UART_HandleTypeDef *huart) 调用了 HAL_UART_RxCpltCallback(huart); UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma) 调用了 HAL_UART_RxCpltCallback(huart);  UART_Receive_...
  • 1、 HAL_UART_Init初始化基本...2、 串口 MSP 函数 HAL_UART_MspInit 函数,设置GPIO和中断优先级。 HAL_NVIC_EnableIRQ(USART1_IRQn); //使能 USART1 中断通道 HAL_NVIC_SetPriority(USART1_IRQn,3,3); //抢占优先级
  • CubeMX,HAL库使用串口发送中断接收一、CubeMX界面配置二、MDK代码 不得不说HAL库和标准相比确实简单多了。。。 一、CubeMX界面配置 选择完 异步通讯模式 后,其余默认即可。 打开串口中断 二、MDK代码 在/* ...
  • 2021/07/20 悍匠暑假集训第三天单个串口收发1、串口在cubeMX中配置2、串口接收中断与空闲中断3、串口发送数据4、串口中断接收字符串数据注意:每次中断只能接收一个字符!!!为了实现多次数据返回,我们要在中断...
  • MX串口配置方法见:CubeIDE 利用自带HAL库 串口收发 一、代码自动生成以后的项目及代码结构: main.c中,调用了串口初始化 串口初始化函数赋值了串口的参数 相当于底层的初始化,配置引脚、并开启...
  • STM32 HAL库 串口DMA接收不定长数据 整体思路:我是用的CUBEMX软件生成的工程,使能了两个串口串口2用来接收不定长的数据,串口1用来发送串口2接收到的数据;串口2我找了一个UBLOX卫星模块,每秒输出不定长的定位...
  • https://www.cnblogs.com/1024E/p/13347732.html
  • 使用的时候发现:接收完一个字节立即用DMA的方式发送出去,会出现数据的丢失,如用串口调试助手发送1234,返回的只有13 目前只能用缓存buf+协议结束(如0x0d,0x0a)的方式解决。 stm32cubeMX的配置界面如下: 1.使用...

空空如也

空空如也

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

hal库串口中断接收发送