1. 从“显示不出来”说起:一个新手常踩的坑
最近在做一个基于STM32的环境监测项目,需要把温湿度数据实时显示在一块淘晶驰串口屏上。UI设计很简单,拖一个文本控件,改个名字叫t0,然后从STM32发个字符串过去赋值就行。我心想,这还不简单?照着官方手册,我写了类似这样的代码:
char data[] = "25.6℃";
printf("t0.txt=%s\xff\xff\xff", data);
信心满满地下载程序,上电,屏幕亮了,UI界面也出来了,唯独那个t0控件,空空如也,啥也没显示。我第一反应是串口没通?赶紧用串口助手监听,发现数据明明发出去了,格式看起来也对:“t0.txt=25.6℃”,后面跟着三个0xFF结束符。这就奇怪了,指令格式没错,数据也发了,为什么屏幕就是不认呢?
我相信很多第一次用淘晶驰串口屏的朋友都遇到过这个“灵异事件”。屏幕能正常启动,说明硬件连接和基本通信没问题,但就是无法更新控件内容。这个问题困扰了我大半天,翻遍了官方手册和网上零星的帖子,最后才发现,问题就出在一个最基础的C语言知识点上——字符串的格式化与转义。手册里虽然提了一句,但没重点强调,对于新手来说,这绝对是个大坑。这篇文章,我就把自己踩坑和填坑的过程详细记录下来,尤其是文本控件(txt控件)赋值时那些官方手册没明说的“潜规则”,让你能快速上手,避开我走过的弯路。
2. 官方手册的“陷阱”:两种写法与一个关键细节
当你拿到淘晶驰串口屏,第一件事肯定是去官网下资料,看USART HMI软件里的帮助文档。在文本控件显示说明里,你可能会看到类似下面这样的示例代码片段:
// 手册示例1
uint8_t ucHMIEnd[3] = {0xFF, 0xFF, 0xFF};
aStrT0 = "t0.txt";
aStrTim = "2022/11/22 21:30:30";
printf("%s="%s"", aStrT0, aStrTim); // 注意这里的双引号
HAL_UART_Transmit(&huartHMI, ucHMIEnd, 3, 200);
如果你直接把这行printf抄到Keil里,编译器立马就会报错,提示字符串格式有问题。因为"%s="%s""这个写法在C语言里是非法的,双引号嵌套没有正确转义。新手看到这儿可能就懵了,手册是不是写错了?
于是你继续往下翻,在手册的另一个地方(比如发送变量例程),可能会看到第二种写法:
// 手册示例2
printf("%s=%s", aStrT0, aStrTim); // 去掉了内层的双引号
这个代码编译是没问题了,你满心欢喜地下载测试,结果发现,串口助手能收到t0.txt=2022/11/22 21:30:30这样的指令,但屏幕上的t0控件依然毫无反应。我就是在这里卡了很久,反复检查波特率、接线、结束符,甚至怀疑屏幕坏了。
问题的关键,就在于手册里那个容易被忽略的细节:赋值给txt属性的内容,必须是一个完整的、被引号包裹的字符串。对于屏幕的指令解析器来说,t0.txt=2022/11/22 21:30:30这条指令,它期望的格式是t0.txt="2022/11/22 21:30:30"。等号右边必须用双引号括起来,告诉屏幕:“这是一个字符串值”。没有引号,屏幕就无法正确解析等号后面的内容到底到哪里结束,尤其是当你的字符串里包含空格或其他特殊字符时。
所以,手册里的第一个示例,用意是告诉你最终生成的指令字符串应该是t0.txt="2022/11/22 21:30:30"这个形态。但它直接在printf里写"%s="%s""的写法是错误的C语法,误导性很强。正确的做法,是需要在C代码里生成带转义双引号的字符串。
3. 终极解决方案:sprintf与转义字符的正确姿势
那到底该怎么写才对呢?最可靠的方法,不是去猜手册的意思,而是直接参考淘晶驰官方提供的单片机示例工程。我在官网下载了STM32的示例代码,里面关于文本控件赋值的部分,写得非常清楚:
// 官方示例工程代码
char tjcstr[100];
int temperature = 25;
sprintf(tjcstr, "t0.txt=\"温度:%d℃\"", temperature);
// 然后通过串口发送 tjcstr 和 0xFF 0xFF 0xFF 结束符
看到没?核心就在于sprintf格式化字符串的那部分:"t0.txt=\"温度:%d℃\""。在要显示的内容(即


397

被折叠的 条评论
为什么被折叠?



