編譯UART_test例程並下載
1. APM例程測試–UART_test
最近在學飛控ardupilot,按照官網的教程開始學習。Learning the ArduPilot Codebase爲教程官網。想要跑一下Library Example Sketches,就是想看看程序執行的效果。哪知折騰了幾個星期,都沒有從pixhawk的串口看到輸出信息。於是向博士師兄請教,說可能是代碼版本的問題,硬件抽象層肯有區別。於是查看了代碼結構。
從Github下克隆下來的master分支是最新的版本。ardupilot源碼。
查看硬件抽象層,在Libraries庫下,查看與HAL相關的,如圖:
AP_HAL-master
發現,HAL只支持CHibiOS,Empty,Linux,SITL.這個版本的代碼將Nuttx支持移除了。我們可以對比一下,查看以往的版本,比如Copter 3.6.
AP_HAL-Copter3.6
我們發現,它的HAL文件要多很多,比如PX4就是很重要的。
最新版本的APM取消了Nuttx支持,改爲了ChibiOS.故單板例程測試失敗。 需將版本回退至3.6版。
於是,進入ardupilot目錄,切換至Copter3.6版本。
命令如下:
git status //查看git狀態
git fetch origin Copter-3.6 //從遠程庫中抓取Copter-3.6
git checkout -b Copter-3.6 origin/Copter-3.6 //在本地庫中創建Copter-3.6分支
git submodule update --init --recursive //更新子模塊
進入modules目錄,更新子模塊內容。
cd modules
git submodule update --init --recursive
在原master分支下,modules的內容如下:
modules-master
在Copter3.6分支下。modules的內容如下:
modules
至此,我們將代碼切換至Copter3.6分支。可以開始我們的單板例程測試了。
所使用的飛控板如下所示:
pixhack V3x
1.1. UART_test(board: px4-v3 )
1.1.1. 編譯程序
- 設置編譯板:
cd ardupilot
./waf distclean //清除編譯信息,包括初始化配置的板
./waf configure --board px4-v3 //設置板爲px4-v3
./waf --targets examples/UART_test
編譯過程
編譯結果
UART_test.cpp部分程序
我們查看UART_test.cpp程序,可以看到,它將從串口和debug console輸出數據。將UART_test.px4
下載到飛控板上,連接串口,通過串口監視器查看輸出。
下面是硬件電路圖
硬件電路圖
下面是硬件連接圖,連接了Debug串口,即串口4,通過USB線連接了UARTA。
實物連接
1.1.2. 串口監視器結果
串口輸出
如圖所示,我們觀察到了兩個串口輸出的情況。
1.2. UART_test(board:fmuv3)
1.2.1. 設置編譯板:
cd ardupilot
./waf distclean //清除編譯信息,包括初始化配置的板
./waf configure --board fmuv3 //設置板爲fmuv3
./waf --targets examples/UART_test
編譯過程
編譯結果
1.2.2. 串口輸出
串口輸出
我們發現,另外一個串口監視器根本沒有輸出,這是怎麼回事呢?
還是得去看代碼,查看源碼UART_test.cpp,我們看這裏,這裏有個if判斷,只有當HAL_OS_POSIX_IO
爲真時,纔會有debug console輸出。
loop函數
我們跳轉到它的定義發現它的值在fmuv3板下被定義爲0,在px4-v3板下定義爲1。所以它沒有輸出。那我們可以將該判斷條件註釋掉,那就應該會有輸出了,還可以對代碼進行一點點改動。
OS_POSIX_IO
改動後的部分如下:
修改後的cpp.
然後重新編譯:
編譯
下載程序到飛控板,查看串口輸出:
輸出
我們發現,另一個監視器還是沒有輸出。但是應該要打印的數據都從USB連接的那個串口輸出來了,無論是UARTA還是debug console。這個應該是初始化板的時候,所選擇的板類型不同,相關定義也不同。所以,當我們選擇fmuv3時,可以不用接另一根線。接線圖如下:
USB連接
至此,我們實現了UART輸出信息,完成了UART_test示例程序的學習。