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的函数重载