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;
}
}
这里的函数主要是用以处理字符串的,应付一些的简单的应用已经够用了,当然,也能在此基础上扩展。