HAL库串口通信总结

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传输

猜你喜欢

转载自blog.csdn.net/weixin_42480952/article/details/82981409
今日推荐