UART uart 串口发送数据 HAL_UART_Transmit(huart, pData, Size, Timeout) 1 2 3 4 5 6 7 8 9 10 11 HAL_UART_Transmit(huart, pData, Size, Timeout) * @param huart This parameter can be 1 &huart1 2 &huart2 3 &huart3 Pointer to a UART_HandleTypeDef structure that contains the configuration information for the specified UART module. * @param pData Pointer to data buffer (u8 or u16 data elements). * @param Size Amount of data elements (u8 or u16) to be sent * @param Timeout Timeout duration * @retval HAL status
Size 参数 也可使用 sizeof()函数
例子:
HAL_UART_Transmit(&huart1, (uint8_t*)&"Hello\r\n", 7, 0xffff);
uart 串口接收数据 HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 注意:HAL 默认不开启串口接收,所以需要先调用此函数开启接收
1 2 3 4 5 6 7 8 9 HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) * @param huart This parameter can be 1 &huart1 2 &huart2 3 &huart3 * @param pData Pointer to data buffer (u8 or u16 data elements). * @param Size Amount of data elements (u8 or u16) to be received. * @retval HAL status
例:HAL_UART_Receive_IT(&huart1,(uint8_t *) &USART1_NewData ,1); //开启串口1 接收数据(一个字节)存放到USART1_NewData数组
中断回调函数 介绍 与标准库不同,HAL库在处理中断时中断函数里面只有最简单的中断来源
触发中断后,中断函数跳转到"中断回调函数"执行用户的代码
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 1 2 3 4 5 6 7 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) * @param huart This parameter can be 1 &husart1 2 &husart2 3 &husatr3 * @retval None
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//串口中断回调函数 { if(huart ==&huart1)//判断中断来源(串口1) { printf("%c",USART1_NewData); //把收到的数据以 a符号变量 发送回电脑 if((USART1_RX_STA&0x8000)==0){//接收未完成 if(USART1_RX_STA&0x4000){//接收到了0x0d if(USART1_NewData!=0x0a)USART1_RX_STA=0;//接收错误,重新开始 else USART1_RX_STA|=0x8000; //接收完成了 }else{ //还没收到0X0D if(USART1_NewData==0x0d)USART1_RX_STA|=0x4000; else{ USART1_RX_BUF[USART1_RX_STA&0X3FFF]=USART1_NewData; //将收到的数据放入数组 USART1_RX_STA++; //数据长度计数加1 if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//接收数据错误,重新开始接收 } } } HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_NewData,1); //再开启接收中断 } if(huart ==&huart2)//判断中断来源(串口2) { if(RS485orBT){//当RS485orBT标志位为1时是RS485模式,为0时是蓝牙模式 USART2_RX_BUF[0]=USART2_NewData;//将接收到的数据放入缓存数组(因只用到1个数据,所以只存放在数据[0]位置) USART2_RX_STA++;//数据接收标志位加1 }else{ printf("%c",USART2_NewData); //把收到的数据以 a符号变量 发送回电脑 } HAL_UART_Receive_IT(&huart2,(uint8_t *)&USART2_NewData, 1); //再开启接收中断 } if(huart ==&huart3)//判断中断来源(串口3:WIFI模块) { printf("%c",USART3_NewData); //把收到的数据以 a符号变量 发送回电脑 HAL_UART_Receive_IT(&huart3,(uint8_t *)&USART3_NewData,1); //再开启接收中断 } }
重写printf函数 1
Core->Src syscalls.c 属性->c/c++ Bulid->勾选"Exclude resource from bulid" (将文件不编译)
2
Core->Inc 添加retarget.h
Core->Src 添加retarget.c
3
开启USART1
RetargetInit(&huart1); 初始化uart1
printf("xxx")函数 串口发送xxx字样
__weak __weak 前缀是弱函数前缀
当不被定义时弱函数本身编译
当被同名函数定义后弱函数不被编译
类似于java的函数重载