UART收发处理函数


UART(Universal Asynchronous Receiver/Transmitter)是一种串行通信协议,在嵌入式系统和微控制器间数据传输中发挥着核心作用。UART协议通过异步方式传输数据,不依赖于共享时钟信号,简化了通信线路的需求。每次传输包括起始位、数据位、可选的奇偶校验位以及停止位,这种结构支持从简单的传感器到复杂的处理器之间的可靠数据交换。

UART的重要性还体现在其广泛的兼容性和低成本实现上。它可以通过简单的两线(TX和RX)接口实现全双工通信,极大地降低了系统的硬件复杂性。此外,UART通信协议可以适应不同的波特率设置,使其能够灵活地调整以匹配特定应用的速度要求。在许多工业和消费电子产品中,UART仍然是实现可靠串行通信的首选技术,尤其在资源受限的环境中显示出其高效和经济的优势。

在进行传感器测试时,常用到嵌入芯片的UART,这里mark一下常用的HAL库函数封装,免得后续一直翻之前的程序

函数需要用到的全局变量如下:

char send[20] = {0}; //传输用字符数组,储存字符串

uint8_t rx_buffer = 0; //接收字符缓冲区

char rx_receiver[20] = {0}; //接收用字符数组

uint8_t rx_num = 0; //接收字符数量

uint8_t  uart_start_flag = 0; //接收标志位

__IO  uint32_t uart_gettick = 0; //系统时钟比较变量

/* 测试变量
uint16_t pwm_duty = 0;

uint8_t startbegin = 0xff;

uint8_t startbegin2 = 0x00;
*/

在硬件配置时要打开UART中断:

HAL_UART_Receive_IT(&huart1 , &rx_buffer,  1);

中断回调函数如下:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if(rx_num == 0){
  uart_gettick = uwTick; 
  uart_start_flag = 1;  
  }
  if(uart_start_flag == 1){
  rx_receiver[rx_num] = rx_buffer;
  rx_num++;  
  }
  HAL_UART_Receive_IT(&huart1 , &rx_buffer,  1);
}

主循环中的处理函数如下:

void UART_RX_PROC(void)
{
    if((( uwTick- uart_gettick ) >=10) && (( uwTick- uart_gettick ) <=600) && (uart_start_flag == 1)){
    if(rx_receiver[0] == '&' ){
    if( rx_num == 2) {
    //示例:传输pwm占空比
    pwm_duty =  rx_receiver[1]-'0';
    }
    else if( rx_num == 3){
    pwm_duty = (rx_receiver[1]-'0')*10 + rx_receiver[2]-'0';
    }
    else if( rx_num == 4){
    pwm_duty = (rx_receiver[1]-'0')*100 + (rx_receiver[2]-'0')*10 + rx_receiver[3]-'0';
    }      
    else if ( rx_num >= 5){
    pwm_duty = 1000;
    }
  }
    HAL_UART_Transmit(&huart1, &startbegin, 1,0xffff);
    HAL_UART_Transmit(&huart1, &startbegin2, 1,0xffff);
    HAL_UART_Transmit(&huart1, &startbegin, 1,0xffff);
    rx_num = 0;
    uart_start_flag = 0;
}

}

这里的函数主要是用以处理字符串的,应付一些的简单的应用已经够用了,当然,也能在此基础上扩展。