串口屏格式化命令发送函数实现详解

在嵌入式项目中,串口屏(如 TFT 串口触摸屏)因其便捷的交互界面搭建能力,被广泛应用于智能设备、工业控制等场景。串口屏通常通过特定格式的指令进行控制,而指令末尾往往需要固定的0xFF 0xFF 0xFF结束符。
支持格式化字符串输入(类似printf),可灵活拼接变量(如数字、字符串等)到串口屏指令中;
  1. 可变参数处理:va_list 系列宏
    函数的第二个参数是...,这是 C 语言中的可变参数,表示函数接收不确定数量的后续参数。要解析这些可变参数,必须依赖<stdarg.h>头文件中的va_list、va_start、va_arg、va_end系列宏,本函数中核心使用了前三个(va_arg在底层vsnprintf中被调用):
    va_list args:定义一个可变参数列表对象,用于存储后续可变参数的信息;
    va_start(args, fmt):初始化可变参数列表args,第二个参数fmt是函数中最后一个确定的参数(即可变参数的前一个参数),该宏会将args指向第一个可变参数的起始位置;
    va_end(args):结束可变参数的遍历,释放args占用的资源,避免内存泄漏,是使用va_start后的必备收尾操作。

  2. 格式化字符串拼接:vsnprintf 函数
    在标准printf函数中,sprintf用于将格式化字符串写入字符数组,而vsnprintf是sprintf的可变参数版本,专门用于配合va_list使用,也是本函数实现格式化的核心:
    int len = vsnprintf(buf, sizeof(buf), fmt, args);

buf:目标字符数组,用于存储格式化后的最终字符串(串口屏指令核心内容);
sizeof(buf):缓冲区大小(此处为 64 字节),vsnprintf会严格遵守该大小限制,避免缓冲区溢出(这是vsnprintf相比vsprintf的核心优势,更安全);
fmt:格式化字符串(如"page0.t4.txt="%dV""),包含占位符(%d、%s、%f等);
args:已初始化的可变参数列表,用于填充格式化字符串中的占位符;
返回值len:格式化后的字符串长度(不包含字符串末尾的\0结束符)。若返回值小于 0,表示格式化失败;若返回值大于等于缓冲区大小,表示格式化后的字符串被截断,但仍会写入缓冲区最大容量的有效数据。

void UART2_SendScreenCmd(const char* fmt, ...)
{
    char buf[64]; // 定义格式化缓冲区,可根据指令长度调整大小
    va_list args; // 定义可变参数列表
    va_start(args, fmt); // 初始化可变参数列表

    // 格式化字符串,返回格式化后的长度
    int len = vsnprintf(buf, sizeof(buf), fmt, args);

    va_end(args); // 结束可变参数列表的使用

    if(len < 0) return; // 格式化失败,直接返回

    // 发送格式化后的核心指令内容
    HAL_UART_Transmit(&huart2, (uint8_t*)buf, len, 1000);

    // 定义串口屏指令结束符
    uint8_t tail[3] = {0xFF, 0xFF, 0xFF};
    // 发送结束符
    HAL_UART_Transmit(&huart2, tail, 3, 1000);
}
posted @ 2025-12-29 11:38  雾削木  阅读(11)  评论(0)    收藏  举报