1.定义了三种传输方式:阻塞传输,中断传输、DMA传输
HAL_UART_Transmit; HAL_UART_Receive
HAL_UART_Transmit_IT; HAL_UART_Receive_IT
HAL_UART_Transmit_DMA; HAL_UART_Receive_DMA
此外还定义了两个中断回调函数,供中断和DMA使用,分别在数据传输一半和完成时使用
voidHAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef*huart);
voidHAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
voidHAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);
2.阻塞传输
阻塞传输是调用这个函数并在等待时间内一直等待操作完成。
uint8_t aTxbuffer[]="enter 10 characters:\n";
uint8_t aRxBuffer;
uint8_t Usart1_RxBuff[10];
uint8_t Usart1_Rx_Cnt = 0;
int main(void)
{
HAL_Init();
Sysclk_config();
USART1_UART_Init(19200);
printf("input your string:\n");
HAL_UART_Transmit(&huart1 ,(uint8_t*)aTxbuffer,sizeof(aTxbuffer),10);
HAL_UART_Receive(&huart1,(uint8_t*)Usart1_RxBuff,10,10);
HAL_UART_Transmit(&huart1 ,(uint8_t*)Usart1_RxBuff,10,10);
}
可以添加循环语句,循环输入输出。
3.中断传输
配置串口,开启中断,在中断处理函数中进行输入语句的输出。
HAL_UART_Transmit_IT发送立即执行,执行完成后调用HAL_UART_TxCpltCallback回调函数。因此用户重新定义这个函数,把发送完成后想做的事情写在这里面。而HAL_UART_Transmit发送完成后不引发中断,跟printf使用类似。
HAL_UART_Receive_IT通过设置接收缓冲区和需要接收的数据个数。当数据接收达到设定个数后引发一次中断调用回调函数HAL_UART_RxCpltCallback。由于只引发一次中断,如果需要连续接收,则需要在HAL_UART_RxCpltCallback再调用HAL_UART_Receive_IT。这种定长的接收可能并不是想要的,往往传输的数据都是不定长的,我想这需要将HAL_UART_Receive_IT长度设置为1,然后自己根据接收的数据判断。此外由于回调函数没有指明是哪个串口引发的中断,因此有必要在回调函数中做判断,如if(huart==&huart1){}。
4.DMA传输