飞道的博客

人机交互-广州DACAI触摸屏开发中遇到的一些(屏幕和编程)问题

405人阅读  评论(0)

目录

背景

一、屏幕相关

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长度读取,可能报文内容不全


转载:https://blog.csdn.net/hannibaychty/article/details/128433137
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场