一.hal库串口接收发送测试
1、串口的模式有3种,一是查询模式,二是中断模式,三是DMA模式
HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制
HAL_UART_Receive();串口轮询模式接收,使用超时管理机制
HAL_UART_Transmit_IT();串口中断模式发送
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Transmit_DMA();串口DMA模式接收
2、阻塞传输是调用这个函数并在等待时间内一直等待操作完成。
HAL_UART_Transmit
HAL_UART_Receive
查询的方式一般少用,这里不做过多介绍。
3、串口中断
串口中断函数
HAL_UART_TxHalfCpltCallback();一半数据发送完成时调用
HAL_UART_TxCpltCallback();数据完全发送完成后调用
HAL_UART_RxHalfCpltCallback();一半数据接收完成时调用
HAL_UART_RxCpltCallback();数据完全接受完成后调用
HAL_UART_ErrorCallback();传输出现错误时调用
一.在串口中定义相关变量
uint8_t RxBuffer;
uint8_t Uart_RxBuffer[256];
uint8_t Uart_RX_Cnt = 0;
uint8_t AlmStr[]="Uart1数据溢出(大于256)!rn";
在main的主循环外开启中断
HAL_UART_Receive_IT(&huart1,(uint8_t*)&RxBuffer,1);
串口接收回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
UNUSED(huart);
if(Uart_RX_Cnt >= 255)
{
Uart_RX_Cnt = 0;
memset(Uart_RxBuffer,0x00,sizeof(Uart_RxBuffer));
HAL_UART_Transmit(&huart1, (uint8_t *)&AlmStr, sizeof(AlmStr),0xFFFF);
}
else
{
Uart_RxBuffer[Uart_RX_Cnt++] = RxBuffer;
if((Uart_RxBuffer[Uart_RX_Cnt-1] == 0x0A)&& (Uart_RxBuffer[Uart_RX_Cnt-2] == 0x0D))
{
HAL_UART_Transmit(&huart1, (uint8_t *)&Uart_RxBuffer,Uart_RX_Cnt,0xFFFF);
Uart_RX_Cnt = 0;
memset(Uart_RxBuffer,0x00,sizeof(Uart_RxBuffer));
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxBuffer, 1);
}
到这里中断方式的串口接收(并发送)完成。
二.重定向问题
函数版:
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
寄存器版:
int fputc(int ch,FILE *f)
{
return (SendChar(ch));
}
int fgetc(FILE *f)
{
return (SendChar(GetKey()));
}
int SendChar(int ch)
{
while(!(USART1->SR & USART_FLAG_TXE));
USART1->DR = (ch & 0x1FF);
return ch;
}
int GetKey(void)
{
while(!(USART1->SR & USART_FLAG_RXNE));
return ((int)(USART1->DR & 0X1FF));
}
主函数的循环体演示:
实测代码:https://download.csdn.net/download/weixin_44386927/13772536
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)