目录
背景
一、屏幕相关
1、厂家给的指令集资料可能有错误,请以软件VisualTFT中的指令助手为准。
2、屏幕程序下载方式
3、SD卡文件格式问题
4、画面id的问题 巨坑!!!
5、子画面变暗的问题
6、 VisualTFT自带的键盘问题
7、DACAI只能选择切换到哪个具体的画面,而不能退出当前画面。
8、设置RTC的问题
9、软件VisualTFT的一些bug
二、编程相关
1、strcat函数导致乱码的问题
2、字符串常量初始化指针导致出现段错误的问题
3、sscanf函数导致段错误的问题
4、socket connect报错 Operation now in progress问题
5、socket的阻塞问题
6、read串口丢字符的问题
背景
mcu串口连DA CAI触摸屏,mcu既要支持屏幕自身的触摸可能,还要支持通过实体按键控制屏幕,两者效果相同。
一、屏幕相关
1、厂家给的指令集资料可能有错误,请以软件VisualTFT中的指令助手为准。
如设置滑动选择控件值得命令,select_data是1个字节,而不是两个。
2、屏幕程序下载方式
软件VisualTFT虽然在“量产向导”中有串口下载选项,但是客户(我们)无法使用,只能使用SD卡下载这一种方式进行。
3、SD卡文件格式问题
屏幕程序下载使用的SD卡,注意使用fat32文件格式的SD卡,而不能是其他格式。
4、画面id的问题 巨坑!!!
使用VisualTFT创建工程画面时,画面id是自动分配的,从0开始一次递增,先创建的先分配id,后创建的后分配,并且id是连续的,无法手动修改。(时间:2022.12.25圣诞节)
倘若你创建了多个画面,想删除其中某一个,此时,在这个画面之后创建的画面id会自动被修改掉!!!!
我在代码中写死了各个画面的id,结果这么一搞,全部都要改!!!白白浪费了半个小时,坑爹!!!
5、子画面变暗的问题
点击父画面某个按钮,调出子画面,子画面遮挡了父画面部分空间,但父画面的其他空间还能看到。子画面类似于手机的弹窗效果。
切记此时,子画面的背景透明属性一定要选择“透明”!否则在子画面上做操作(如icon帧的切换等等)可能导致父画面越来越暗,最终导致父画面全部呈现黑色!做一次操作,父画面便变暗一分。
6、 VisualTFT自带的键盘问题
键盘内的做了什么操作,屏幕不会通过串口发送给MCU,只有在退出键盘时,才告诉mcu什么值被键盘敲了,mcu无法感知操控键盘的整个过程。这就不满足我们的需求了,结果花了两天的时间,用按钮自制了一个数字键盘,支持不确定长度和数值的数字输入。
7、DACAI只能选择切换到哪个具体的画面,而不能退出当前画面。
如果在多个画面都可以调用数字键盘这样子画面的场景下,从数字键盘切换到哪个画面是不固定的,此时退出子画面的功能就很重要了。
8、设置RTC的问题
修改RTC控件的值,无法在模拟场景下验证,需要下载到实体屏幕中验证。
还有,DACAI设置时间的命令,年月日时分秒和星期都需要设置。其中,仅仅将星期设置错了,不影响其他参数的显示。
9、软件VisualTFT的一些bug
VisualTFT软件打开几天之后就卡死了,无法操作,需要杀进程。
有时可能报内存不足(其实电脑的内存是够的),软件操作不了,无法使用。
二、编程相关
1、strcat函数导致乱码的问题
char * strcat ( char * destination, const char * source )
使用strcat函数做字符串拼接时,第二个入参一定要是字符串,即以\0结尾,如果仅仅是一个字符,则拼接出来的字符串内有乱码
2、字符串常量初始化指针导致出现段错误的问题
用静态字符串初始化字符指针时,注意长度,如
char *g_ip[4] = {"192","168","2","30"};
我原本想定义4个占用空间均为4的字符串,分别用192 168 2 30来初始化。而如果使用上述写法,g_ip[2]的长度是1,占用空间为2,而不是4,g_ip[3]的长度是2,占用空间为3,,也不是4。
在后续的代码中,如果想访问g_ip[2][2]或者g_ip[3][3]必然导致访问越界,报段错误。
3、sscanf函数导致段错误的问题
sscanf(instruction, "%s %s %s", opcode, arg1, arg2);这里的opcode arg1 arg2需要是堆栈空间,不能是函数入参指针,否则,程序运行到此处报段错误。原因未知,我猜测是bug。
4、socket connect报错 Operation now in progress问题
socket设置为非阻塞模式,connect返回-1,错误信息是 Operation now in progress
解决方案:先设置为阻塞(默认模式),connect之后再调用
flags = fcntl(g_wire_socketFD, F_GETFL, 0);
ret = fcntl(g_wire_socketFD, F_SETFL, flags | O_NONBLOCK);
将其设置为非阻塞
5、socket的阻塞问题
socket设置为阻塞后,recv时整个进程都阻塞了,进程内的其他线程也不能继续工作。这种阻塞不像sleep式的延时,后者可以让出CPU时间片给其他线程用。
6、read串口丢字符的问题
read 串口时,最好是一个一个字符的读取,固定buff长度读取,可能报文内容不全