由于实验室项目需要处理数据并用串口进行发送,最后还要开机自启,专门鼓捣了一番。由于网上的方案随着树莓派本身版本变化而不适应,因此调试过程中也实在耗费了不少功夫。最有价值的调试方案还是官方的英文教程:Raspberry Pi 3 UART Boot Overlay Part Two,本文也是主要参照英文教程的方法进行调试,顺便附加了网上的一些其他经验。
本文分为两部分:1.树莓派串口数据发送配置(包括QT测试),2.树莓派用户程序开机自启(QT release的用户程序)
环境:
树莓派3B+ Version 2018 June(理论上Raspbian Jessie releases 2016年3月18日后的版本均适用)
Qt Creator 4.2.0 Based on Qt 5.7.1 (GCC 6.2.1 20161124, 32 bit)
串口发送数据:
首先先解释一下为什么树莓派3B+使用串口收发数据这么麻烦。树莓派内部有两个串口,
1. 硬件串口:官方称为PL011 UART,对应软件上的serials1,默认使用ttyS0,默认分配给蓝牙
2. 迷你串口:官方称为mini-uart,对应软件上的serials0,默认使用ttyAMA0,没有时钟源,必须由内核提供时钟参考源,这样以来由于内核的频率本身是变化的,就会导致“迷你串口”的速率不稳定。
因此我们希望能够稳定地使用硬件串口进行数据收发,解决思路是:使能串口,更换映射关系令serials1对应ttyAMA0,关闭硬件串口控制的蓝牙功能,将硬件串口重新恢复给GPIO的串口使用。
具体调试与实现步骤:
1. 串口线连接
注意引脚与图中接线,树莓派与串口连接线的RXD与TXD相互反接,树莓派GPIO中串口的管脚在p6、p8和p10(注意图中的白线和灰线)。
2. 开启串口功能
sudo raspi-config
3. 恢复串口使用并设置为通用串口
sudo nano /boot/config.txt
末尾添加
dtoverlay=pi3-miniuart-bt
4. 关闭串口控制台
sudo nano /boot/cmdline.txt
替换配置文件内容为
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
5. 关闭蓝牙功能与禁用串口控制台功能
关闭蓝牙
sudo systemctl disable hciuart
禁用串口控制台(由于已经有上述步骤4,此步非必须)
6. 下载串口测试工具minicom
sudo apt-get install minicom
进入root模式(密码自定)
su root
对minicom串口默认启动状态进行设置
minicom –s
7. 查看系统串口设备状态
ls -l /dev
查看hciuart.service(有很多老版本的教程需要对此处进行修改,但是新版本其实没必要,保持默认即可,参考下图)
sudo nano /lib/systemd/system/hciuart.service
8. 更新和重启
9. 打开minicom测试
sudo minicom -D /dev/ttyAMA0 -b115200
或者直接
sudo minicom
串口发送测试成功,接下来上QT测试。
#如果你也测试成功,感谢你的点赞或留言;如果你遇到了问题,欢迎留言与我交流探讨#
10. QT测试串口输出
创建新工程,Pro文件添加Pi自带的库,末尾添加
LIBS += -lwiringPi
串口发送测试代码(在mainwindow.cpp里添加即可)
测试成功!
#如果你也测试成功,感谢你的点赞或留言;如果你遇到了问题,欢迎留言与我交流探讨#
QT程序自启动:
网上很多改脚本的方法实际上不太适用,因为QT的启动过程是:自动登录->自动启动窗口->自动运行用户程序。
脚本程序可以在自动启动窗口这一步之前运行,但是用户程序是不行。
具体调试与实现步骤:
1. Qt先release出一个可执行文件,一般在原工程目录下。
2. 创建与打开自启文件夹
创建一个自启文件夹,如果已经存在直接打开
3. 生成一个*.desktop文件(比如:my.desktop)
sudo nano my.desktop
每次开机都会自动检查该文件夹下每一个*.desktop文件,启动需要的用户程序
4. 添加自启文件内容
Exec=后填入可执行程序的绝对路径,为了免除缺乏支持dll文件的困扰,我直接选在了QT工程的文件夹
5. 重启测试
sudo reboot
测试成功!
#如果你也测试成功,感谢你的点赞或留言;如果你遇到了问题,欢迎留言与我交流探讨#