1. 程式人生 > >2018最新最詳細 樹莓派3B+ QT5 串列埠收發配置與使用者程式開機自啟方法圖文教程

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

測試成功!

#如果你也測試成功,感謝你的點贊或留言;如果你遇到了問題,歡迎留言與我交流探討#