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

news/2025/2/11 21:49:46/

目录

背景

一、屏幕相关

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


http://www.ppmy.cn/news/6597.html

相关文章

【Python基础】列表 元组 集合 字典

常用方法 序号方法功能对象 列表基本操作 1增加lst.append(x)将x追加至列表尾部,长度加1:len(s)len(s)1列表lst.insert(index,x)在列表index位置插入x列表lst1.extend(lst2)将列表L中所有元素追加至列表尾部:len(lst1)len(lst1)len(lst2)用于…

天才少年稚晖君彭志辉的软硬件开发环境

说明 本文来自稚晖君B站软件篇视频。稚晖君是全栈软硬件通吃,知识面跨度大,动手能力强。稚晖君的方向,就是一个标准杰出工程师的方向。一类是搞学术研究,就是通过paper来实现自己人生价值;一类是搞工程创新&#xff0…

高效学习方法论 学习笔记

学习前,要提前半天做充足准备 A增加沉默成本,动起来 损失规避心理:我们失去一样东西往往比获得一样东西更加深刻。 通过前几天的学习,增加成本 连续打卡获得奖励 连续学习十天奖励自己十连抽 补打卡机制 看五条自己讨厌的视频 提…

前端开发:Vue封装通过API调用的组件的方法

前言 在前端开发中,关于Vue的使用相比大家并不陌生,而且Vue框架的优势也是其他框架所不能比的,尤其是Vue的封装思想更是堪称一绝,还有就是组件化的运用实践过程也是亮点。所以关于Vue框架的使用想必看官都不陌生,而且常…

PCB贴片机如何送料?

1.常见的贴片机供料器四种形式 http://www.sz-bjzn.com/1547.html 2.模块化设计SMT贴片机送料器的操作方法 3.淘宝 https://item.taobao.com/item.htm?spma230r.1.14.98.33e41823OZ1zzn&id579043582781&ns1&abbucket20#detail 不错:https://item.tao…

大学计算机基础考试题库(含答案)

大学计算机基础试题题库及 一、单选题练习 1.完整的计算机系统由( C )组成。 A.运算器、控制器、存储器、输入设备和输出设备 B.主机和外部设备 C.硬件系统和软件系统 D.主机箱、显示器、键盘…

RabbitMQ:基本消息模型

单生产单消费模型,即基本消息模型或简单消费模型,即完成基本的一对一消息转发。 RabbitMQ 单生产单消费模型主要有以下三个角色构成: 生产者(producer/ publisher):一个发送消息的用户应用程序。消费者&…

Allegro如何设置格点操作指导

Allegro如何设置格点操作指导 在PCB设计的时候,格点是一个很好用的工具,Allegro可以设置格点 具体操作如下 选择Setup-GirdsNon-Etch和All Etch中的X和Y都输入5,代表都是5的格点