2018最新最詳細 樹莓派3B+ QT5 串列埠收發配置與使用者程式開機自啟方法圖文教程
2018.9.6
由於實驗室專案需要處理資料並用串列埠進行傳送,最後還要開機自啟,專門鼓搗了一番。由於網上的方案隨著樹莓派本身版本變化而不適應,因此除錯過程中也實在耗費了不少功夫。最有價值的除錯方案還是官方的英文教程: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,此步非必須)
sudo systemctl stop [email protected]
sudo systemctl disable [email protected]
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. 更新和重啟
sudo apt-get update
sudo apt-get upgrade
sudo reboot
9. 開啟minicom測試
sudo minicom -D /dev/ttyAMA0 -b115200
或者直接
sudo minicom
串列埠傳送測試成功,接下來上QT測試。
#如果你也測試成功,感謝你的點贊或留言;如果你遇到了問題,歡迎留言與我交流探討#
10. QT測試串列埠輸出
建立新工程,Pro檔案新增Pi自帶的庫,末尾新增
LIBS += -lwiringPi
串列埠傳送測試程式碼(在mainwindow.cpp裡新增即可)
int serialfd;
if((serialfd = serialOpen("/dev/ttyAMA0",115200)) < 0)
{
fprintf(stderr, "Unable to open serial device: %s\n", strerror(errno));
}
serialPuts(serialfd, "Hello ChopinXBP");
測試成功!
#如果你也測試成功,感謝你的點贊或留言;如果你遇到了問題,歡迎留言與我交流探討#
QT程式自啟動:
網上很多改指令碼的方法實際上不太適用,因為QT的啟動過程是:自動登入->自動啟動視窗->自動執行使用者程式。
指令碼程式可以在自動啟動視窗這一步之前執行,但是使用者程式是不行。
具體除錯與實現步驟:
1. Qt先release出一個可執行檔案,一般在原工程目錄下。
2. 建立與開啟自啟資料夾
cd ~/.config
or
cd /home/pi/.config
建立一個自啟資料夾,如果已經存在直接開啟
mkdir autostart
cd autostart
3. 生成一個*.desktop檔案(比如:my.desktop)
sudo nano my.desktop
每次開機都會自動檢查該資料夾下每一個*.desktop檔案,啟動需要的使用者程式
4. 新增自啟檔案內容
[Desktop Entry]
Type=Application
Exec=/home/lepton/copyLeptonModule-master_v1/software/raspberrypi_video/raspberrypi_video
Exec=後填入可執行程式的絕對路徑,為了免除缺乏支援dll檔案的困擾,我直接選在了QT工程的資料夾
5. 重啟測試
sudo reboot
測試成功!
#如果你也測試成功,感謝你的點贊或留言;如果你遇到了問題,歡迎留言與我交流探討#