糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > STM32cube HAL库 UART串口中断方式收发任意长度 调试笔记

STM32cube HAL库 UART串口中断方式收发任意长度 调试笔记

时间:2019-04-25 05:55:00

相关推荐

STM32cube HAL库 UART串口中断方式收发任意长度 调试笔记

STM32Cube对于新项目的开发能节省不少时间,从繁琐芯片初始化中解脱出来

1.STM32 UART初始化部分,配置好工程,采用STM32cube生成代码,初始化即已经完成。

2.串口中断方式的发动作:HAL_UART_Transmit_IT

没做任何处理的情况下,我们在程序中使用printf会把信息打印到显示屏中去,这时我们需要将printf重定向就能将printf的消息打印到串口中 去。在主函数中添加如下函数:

int fputc(int ch, FILE *f)

{

HAL_UART_Transmit_IT(&huart1, (uint8_t *)&ch, 1);

osDelay(1);

return 0;

}

//即完成重定向,执行printf即能将任意长度的字符发送到串口中。

3.串口中断的收动作:HAL_UART_Receive_IT

HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1);//程序不会在这个语句停留,直接会按照中断方式把接收数据存放在value中,但是这个语句只能使能一次串口中断。所以要在中断服务函数或者回调函数中重新使能

代码:

//接收缓存初始化

#define MAX_RECV_LEN 1024

uint8_t msg_buff[MAX_RECV_LEN] = {0};uint8_t * msg = msg_buff;static int flag = false;

//接收中断回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle){uint8_t ret = HAL_OK;msg++;if( msg == msg_buff + MAX_RECV_LEN){msg = msg_buff;}do{ret = HAL_UART_Receive_IT(UartHandle,(uint8_t *)msg,1);}while(ret != HAL_OK);if(*(msg-1) == '\n') //接收以\n为结尾字符,则表示接收完成{flag = true;}}

void uart_main(void){extern UART_HandleTypeDef huart1;HAL_UART_Receive_IT(&huart1, (uint8_t *)msg, 1); //开启第一次中断while(1){if (flag == true){printf("msg_buff = %s\r\n",msg_buff);memset(msg_buff, 0, sizeof(msg_buff)); //清空缓存区// 指向接收缓存的头部msg = msg_buff;(&huart1)->pRxBuffPtr = msg;flag = false;}osDelay(10);}}

如果觉得《STM32cube HAL库 UART串口中断方式收发任意长度 调试笔记》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。