当前位置:   article > 正文

细说MCU修改回调函数调用模式的方法

细说MCU修改回调函数调用模式的方法

目录

1、硬件及工程 

2、实现方法

(1)修改while(1)中的代码:

(2)修改2

(3)修改3

(4)修改4

(5)修改5

3、下载并运行


        在本文作者的文章中:细说ARM MCU的串口发送数据的实现过程-CSDN博客  https://wenchm.blog.csdn.net/article/details/139598451

        串口每接收到1字节的数据,就调用一次回调函数。实际上,可以通过修改参数,在接收了一定长度的数据之后再调用回调函数。下面尝试当串口接收到3字节数据后再调用一次回调函数。

1、硬件及工程 

         文章依赖的硬件及工程配置同本文作者的其他文章:细说ARM MCU的串口接收数据的实现过程-CSDN博客 https://wenchm.blog.csdn.net/article/details/139541112

2、实现方法

        为此,需要将HAL_UART_Receive_IT()函数中的Size参数设置为3,也就是把在main.h中声明的RXBUFFERSIZE修改为3,可以直接在main.h中修改。

        假如串口助手向MCU一次发送3字节的数据,其中第二个字节的数据是有意义的,而前后两个字节是编码,作为帧头和帧尾(可以任意设置,此处分别用字符“S”和“E”来表示,它们在ASC Ⅱ码表中对应的十六进制数分别为0x53和0x45)。当MCU通过串口接收到3字节的数后,可以首先判断帧头和帧尾是否正确,如果正确,再进行下一步的处理。

(1)修改while(1)中的代码:

  1. while(1)
  2. {
  3. /*USERCODE BEGIN 3 */
  4. if((RxBuffer[0] == 0x53)&&(RxBuffer[2] == 0x45)&&(CommFlag == 1))
  5. {
  6. CommFlag = 0;
  7. if(RxBuffer[1]==0x10)
  8. {
  9. HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
  10. HAL_UART_Transmit_IT(&huart2,CommOkMessage,19);
  11. }
  12. else
  13. {
  14. HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
  15. HAL_UART_Transmit_IT(&huart2,CommErrMessage,22);
  16. }
  17. }
  18. }
  19. /*USER CODE END 3 */

        例子中,实现了用中断方式接收串口数据,并通过回调函数一次性处理串口接收的多字节数据;此外,还使用中断和非中断方式实现了串口数据发送。

(2)修改2

  1. /* USER CODE BEGIN PV */
  2. uint8_t CommOkMessage[]="Everything is OK\r\n";
  3. uint8_t CommErrMessage[]="Received ErrorData\r\n";
  4. uint8_t CommFlag =0;
  5. uint8_t RxBuffer[RXBUFFERSIZE]={0};
  6. /* USER CODE END PV */

(3)修改3

  1. /* USER CODE BEGIN 4 */
  2. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  3. {
  4. CommFlag =1;
  5. HAL_UART_Receive_IT(&huart2,(uint8_t *)RxBuffer,RXBUFFERSIZE);
  6. }
  7. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  8. {
  9. HAL_GPIO_WritePin(BUZ_GPIO_Port,BUZ_Pin,GPIO_PIN_RESET);
  10. HAL_Delay(100); //延时
  11. HAL_GPIO_WritePin(BUZ_GPIO_Port,BUZ_Pin,GPIO_PIN_SET);
  12. }
  13. /* USER CODE END 4 */

(4)修改4

  1. /* Private defines -----------------------------------------------------------*/
  2. #define KEY_Pin GPIO_PIN_13
  3. #define KEY_GPIO_Port GPIOC
  4. #define KEY_EXTI_IRQn EXTI15_10_IRQn
  5. #define BUZ_Pin GPIO_PIN_4
  6. #define BUZ_GPIO_Port GPIOA
  7. #define LEDF_Pin GPIO_PIN_5
  8. #define LEDF_GPIO_Port GPIOA
  9. #define RXBUFFERSIZE 3 //接收缓冲区的长度

(5)修改5

  1. /* USER CODE BEGIN 2 */
  2. HAL_UART_Receive_IT(&huart2,(uint8_t*)RxBuffer,RXBUFFERSIZE);
  3. /* USER CODE END 2 */

3、下载并运行

        通过串口助手,先发送3次53 10 45,应该收到3次数据正确的提示;再发送3次53 20 45,应该收到3次数据错误的提示。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/712527
推荐阅读
相关标签
  

闽ICP备14008679号