相关项目小结

项目整体思路:

设备驱动,挂载,生成对应的设备文件/dev/xxx,通过对/dev/xxx的操作,比如open,close等实现对设备的操作。

一 蓝牙模块hc06 UART

采用hc06,连接到ATK MODULE模块,由于NXP 关于UART3的驱动已经编写好了,所以要做的就是:

1. 向设备树中添加uart3节点——当系统启动以后串口驱动和设备匹配成功,相应的串口就会被驱动生成/dev/ttymxcX,这里生成的是/dev/ttymxc2 (配置引脚功能为UART,启动uart3设备->status=okay,表示设备被启用并且系统应该加载对应的驱动程序)

2. 应用程序即可通过访问ttymxc2实现对uart3的控制

几点重点:

① 串口设置为阻塞态

   现象:通过蓝牙发送了两个控制命令,第一条是控制灯光开关,第二条是控制蜂鸣器。如果程序在处理第一条命令时没有及时读取第二条命令的数据,那么在非阻塞模式下,可能会导致蜂鸣器的控制延迟,或者程序在读取时只接收到第二条命令的一部分,导致控制失败或误操作。

解决方式:引入阻塞

②单独设置线程

问题:对串口的通信读取采用的是read()阻塞式读取,等待数据到达时,CPU会挂起【当前线程】,因此对于页面刷新,ap3216定时读取都会产生影响,导致整个页面卡顿,无法响应用户操作。因此需要对串口单独设置线程

③为什么ap3216等同样需要阻塞式read()操作的无需单独设置。

数据读取是周期性的,可以通过定时器 QTimer 定时读取。异步的,设置一个时间间隔,并在每次间隔结束时发出信号(timeout()),触发相应的槽函数。属于非阻塞操作。每次定时器触发后,读取操作都会立即完成,不会阻塞主线程。不需要一个独立的线程来处理。并且对于像 ap3216 这样的传感器,read() 操作通常非常快,因为传感器的数据已经准备好了,或者它的响应速度非常快。在这种情况下,虽然 read() 是阻塞调用,但由于它在短时间内完成,主线程几乎不会被长时间阻塞。

④对于uart线程和主线程,是否会产生资源冲突,又该如何解决?

在Qt中,默认情况下,所有与用户界面相关的操作都是在主线程(GUI线程)中进行的。

一般而言,Qt的信号槽机制在不同线程间的通信时,能够保证线程安全。因为:1. 自动排队; 2. 事件循环 3. 连接方式:Qt会根据发射信号和槽函数是否在同一线程之内,自动选择合适的连接方式。如果在同一线程之中,连接会直接调用;如果在不同线程中,Qt会使用事件队列进行异步处理。(将所有的事件排毒处理,如果有多个事件发生,比如定时器触发、用户操作等,这些事件会按照队列顺序一个一个处理,这样即使多个事件涉及的操作在同一个线程中,也不会导致冲突)

需要补充的知识:阻塞&非阻塞; 异步&非异步

二 LCD显示 gt911 IIC+中断+input子系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值