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

目录

背景

一、屏幕相关

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个字节,而不是两个。

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

 

2、屏幕程序下载方式

软件VisualTFT虽然在“量产向导”中有串口下载选项,但是客户(我们)无法使用,只能使用SD卡下载这一种方式进行。

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

 

3、SD卡文件格式问题

屏幕程序下载使用的SD卡,注意使用fat32文件格式的SD卡,而不能是其他格式。

4、画面id的问题  巨坑!!!

使用VisualTFT创建工程画面时,画面id是自动分配的,从0开始一次递增,先创建的先分配id,后创建的后分配,并且id是连续的,无法手动修改。(时间:2022.12.25圣诞节)

倘若你创建了多个画面,想删除其中某一个,此时,在这个画面之后创建的画面id会自动被修改掉!!!!

我在代码中写死了各个画面的id,结果这么一搞,全部都要改!!!白白浪费了半个小时,坑爹!!!

5、子画面变暗的问题

点击父画面某个按钮,调出子画面,子画面遮挡了父画面部分空间,但父画面的其他空间还能看到。子画面类似于手机的弹窗效果。

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

 

切记此时,子画面的背景透明属性一定要选择“透明”!否则在子画面上做操作(如icon帧的切换等等)可能导致父画面越来越暗,最终导致父画面全部呈现黑色!做一次操作,父画面便变暗一分。

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

 

6、 VisualTFT自带的键盘问题

键盘内的做了什么操作,屏幕不会通过串口发送给MCU,只有在退出键盘时,才告诉mcu什么值被键盘敲了,mcu无法感知操控键盘的整个过程。这就不满足我们的需求了,结果花了两天的时间,用按钮自制了一个数字键盘,支持不确定长度和数值的数字输入。

7、DACAI只能选择切换到哪个具体的画面,而不能退出当前画面。

如果在多个画面都可以调用数字键盘这样子画面的场景下,从数字键盘切换到哪个画面是不固定的,此时退出子画面的功能就很重要了。

8、设置RTC的问题

修改RTC控件的值,无法在模拟场景下验证,需要下载到实体屏幕中验证。

还有,DACAI设置时间的命令,年月日时分秒和星期都需要设置。其中,仅仅将星期设置错了,不影响其他参数的显示。

9、软件VisualTFT的一些bug

VisualTFT软件打开几天之后就卡死了,无法操作,需要杀进程。

有时可能报内存不足(其实电脑的内存是够的),软件操作不了,无法使用。

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

 

二、编程相关

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

你可能感兴趣的:(人机交互开发,linux,计算机编程综合,DACAI,C编程问题)