简介
最近开发一款基于STM32检测时钟芯片的测试台,需要将时钟芯片的实时时间显示出来。设计过程中,考虑到方便使用,需要使用一款屏幕用于显示时间。前期项目剩余一些淘晶驰串口屏(前任工程师选屏剩余未使用),就拿来用到了这次的测试台上。淘晶驰官方网站提供了UI设计软件,且哔哩哔哩上有教程视频,此处不做过多说明。
项目说明
测试台主要用于时钟芯片精度检测,项目中需要将多个时钟芯片时间显示到串口屏上,预留串口用于时钟同步。
帮助手册避坑
对于串口屏,初步学习了下官方手册上如何将图片转换成UI界面,如何对txt控件进行赋值,没用进行深入学习。
先附图USART HMI软件上帮助文件如何赋值txt控件:
根据手册1.1文本控件显示说明,在t0处显示时间信息串口发送格式为:
uint8_t ucHMIEnd[3] = {0xFF,0xFF,0xFF}; // 结束符
aStrT0 = "t0.txt"; // txt字符串指令
aStrTim = "2022/11/22 21:30:30"; // 时间信息字符串
printf("%s="%s"",aStrT0,aStrTim); // 串口输出时间信息
HAL_UART_Transmit(&huartHMI,ucHMIEnd,(uint8_t)3,200); // 发送结束符
此处这种编写格式,keil中会报错,无法识别到%s。
继续往下查看手册查找原因,在1.3中给出了发送变量到串口屏例程,然后套用发送例程第三个格式继续调试。
uint8_t ucHMIEnd[3] = {0xFF,0xFF,0xFF}; // 结束符
aStrT0 = "t0.txt"; // txt字符串指令
aStrTim = "2022/11/22 21:30:30"; // 时间信息字符串
printf("%s=%s",aStrT0,aStrTim); // 串口输出时间信息
HAL_UART_Transmit(&huartHMI,ucHMIEnd,(uint8_t)3,200); // 发送结束符
调试后串口助手可接收到规定格式字符串,但是txt控件依旧无法改变值。因为前面加双引号格式不被识别,然后就在此格式字符串输出上各种尝试......
官方单片机输出例程
根据帮助手册,自己实在无法解决时间信息输出问题,又回到官方网站,查找问题解决方法,最终在官方网站查到了单片机工程文件。此处仅截取txt控件赋值格式。
//-----------------------------发送变化的字符开始--------------------------------
//定义一个字符串数组
char tjcstr[100];
/********示例1:给文本控件赋值**********
用sprintf来格式化字符串,给t0的txt属性赋值,
给控件的文本属性赋值时,内容需要用成对的 \" \" 包裹住,
当格式化的参数为字符串时,请保证字符串以\0结尾
*****************************************/
sprintf(tjcstr, "t1.txt=\"现在是%d\"", a);
//把字符串发送出去
HMISends(tjcstr);
//发送结束符
HMISendb(0xff);
官方工程给出的示例代码中,要求将txt文本属性赋值时的内容使用成对的\" \"包裹住。然后根据示例代码修改工程代码:
uint8_t ucHMIEnd[3] = {0xFF,0xFF,0xFF}; // 结束符
aStrT0 = "t0.txt"; // txt字符串指令
aStrTim = "2022/11/22 21:30:30"; // 时间信息字符串
printf("%s=\"%s\"",aStrT0,aStrTim); // 串口输出时间信息
HAL_UART_Transmit(&huartHMI,ucHMIEnd,(uint8_t)3,200); // 发送结束符
再次编译工程,成了!卡住两天无进展,各种扒帮助手册、官方文件、博文,最终还是靠官方例程解决了,我觉得官方帮助手册可以给出各控件的示例代码,毕竟很多人还是靠看手册来开发的。
转义字符的使用
那么问题来了,为何需要加成对的\" \"包裹才能赋值。在前面贴出的帮助手册1.3下面有一行标注内容:若不明白“\”使用法,自行百度“C语言转义字符”。
百度到一份C语言常见转义字符,直接拉过来。由表格可以看到,字符串中使用双引号时,需要在前面加转义字符,才能表示为字符型双引号。
最终总结一点,C语言基础该补补了!