串口通訊
問題描述
TX2上深度學(xué)習(xí)算法布置好了牍汹,但是卻無(wú)法與下位機(jī)進(jìn)行串口通訊琅翻。使用J17口,始終不能打開串口柑贞;使用J21上的串口方椎,由于其作為Console接口用于調(diào)試,會(huì)向下位機(jī)傳輸很多調(diào)試信息钧嘶,并且讀取串口信息存在問題棠众。
解決辦法
-
官方論壇討論。經(jīng)過論壇的解釋有决,原來是官方系統(tǒng)默認(rèn)沒有打開J17的串口通訊(J17同時(shí)還兼任板載相機(jī)接口的通訊)闸拿,雖然給出了補(bǔ)丁文件,可是并不知道怎么使用(主要是文件路徑找不到啊书幕,歡迎大神指導(dǎo))新荤。打開
patch
文件后發(fā)現(xiàn)與linuxdev
大神給出的回答更改內(nèi)容一致,于是抱著試一試的態(tài)度台汇,參照他給出的具體內(nèi)容進(jìn)行操作苛骨,最后還真地出現(xiàn)了J17對(duì)應(yīng)的串口號(hào)ttyTHS2
。下面給出具體的步驟(大部分搬運(yùn)大神的作品):
- 通過
sudo apt-get install device-tree-compiler
命令安裝DTC
; - 然后是:
sudo -s
cd /tmp
dtc -I dtb -O dts -o extracted.dts /boot/tegra186-quill-p3310-1000-c03-00-base.dtb
# Search for "serial@c280000" where it is a block of code and not just a single line...
# Change status = "disabled" to status = "okay";
# Build a modified version:
dtc -I dts -o dtb /boot/modified_tegra186-quill-p3310-1000-c03-00-base.dtb extracted.dts
cd /boot/extlinux
# edit extlinux.conf...add this line between MENU LABEL line and LINUX line:
FDT /boot/modified_tegra186-quill-p3310-1000-c03-00-base.dtb
注意:1.部分命令與大神有所不同苟呐,大概就是dtc
的參數(shù)設(shè)置痒芝,如果報(bào)錯(cuò)的話,可以采用man dtc
查看命令詳情牵素。
2./tmp
在重啟之后會(huì)自動(dòng)刪除文件严衬,可以考慮放到其他盤里面去。
這種做法的大致思路是笆呆,將設(shè)備樹文件(相當(dāng)于二進(jìn)制文件请琳?)反編譯為源代碼,然后更改其某種屬性赠幕,然后再編譯為其二進(jìn)制文件俄精,最后在開機(jī)的時(shí)候加載。這樣在重啟之后通過ls /dev
就可以看到ttyTHS2
了劣坊。
可是在轉(zhuǎn)換到J17之后嘀倒,各方面表現(xiàn)正常,但是無(wú)論是DJI
給的串口通訊C語(yǔ)言接口局冰,以及在網(wǎng)上找的C語(yǔ)言接口(同樣的代碼在筆記本上運(yùn)行可以和下位機(jī)完美通訊),都無(wú)法接收數(shù)據(jù)灌危。為了尋找錯(cuò)誤的來源康二,使用python
的pyserial
庫(kù)進(jìn)行串口的讀寫操作,發(fā)現(xiàn)能夠完美通訊勇蝙。而且沫勿,更為神奇的是,在使用python
打開串口之后再使用同樣的C程序時(shí),竟然可以實(shí)現(xiàn)完美通訊产雹。不得不感嘆诫惭,這簡(jiǎn)直是玄學(xué)啊B凇(其實(shí)是自己太菜夕土,對(duì)于底層了解太少。大神請(qǐng)指導(dǎo))瘟判。所以怨绣,最后的解決辦法是,開機(jī)之后首先運(yùn)行如下的python
腳本:
import serial
ser = serial.Serial('/dev/ttyTHS2')
ser.close()
然后再執(zhí)行深度學(xué)習(xí)相關(guān)命令拷获。
開機(jī)運(yùn)行
- Ubuntu下如何將普通用戶提升到root權(quán)限_百度經(jīng)驗(yàn)
-
Ubuntu15.04系統(tǒng)開機(jī)自動(dòng)登錄,不需密碼_百度經(jīng)驗(yàn)
設(shè)置完以上兩項(xiàng)之后篮撑,編輯~/.profile
文件在文件最后加入xterm -e python pytest.py
就可以打開終端,并顯示程序中的輸出了匆瓜。
攝像頭動(dòng)態(tài)打開
為了減少程序執(zhí)行對(duì)攝像頭打開的要求赢笨,可以通過一個(gè)循環(huán)不斷地嘗試打開攝像頭,然后檢測(cè)攝像頭是否打開成功驮吱,如果成功則跳出循環(huán)质欲。,本來很好的邏輯糠馆,但是在Linux
(至少是Jetson板載的L4T
和筆記本的Ubuntu 14.04
)下嘶伟,使用的視頻流處理庫(kù)V4L
(Video for linux)在程序內(nèi)部不能動(dòng)態(tài)地更新設(shè)備,必須要結(jié)束程序后才能更新又碌【琶粒基于此點(diǎn),運(yùn)用如下思路動(dòng)態(tài)打開攝像頭:使用一個(gè) runpython.py
腳本使用os.system('python camtest.py')
命令來不斷地調(diào)用camtest.py
毕匀,并根據(jù)其返回結(jié)果決定是否跳出循環(huán)铸鹰;而camtest.py
只需要嘗試打開攝像頭,并根據(jù)攝像頭是否打開成功使用exit(number)
來返回不同的程序結(jié)束狀態(tài)皂岔。注意蹋笼,使用exit()
而不是return
。
代碼如下:
runpython.py
import os
import time
count = 0
while True:
print count
if os.system("python camtest.py") == 0:
print "Open Successfully!"
break
else:
print "Cam open failed!\n\n"
count += 1
time.sleep(1)
camtest.py
import cv2
import time
count = 0
cam = cv2.VideoCapture(1)
if not cam.isOpened():
exit(1)
# while(True):
# # Capture frame-by-frame
# ret, frame = cam.read()
# gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# # Display the resulting frame
# cv2.imshow('frame',gray)
# if cv2.waitKey(1) & 0xFF == ord('q'):
# break
exit(0)
總結(jié)
將檢測(cè)攝像頭中的runpython.py
的代碼放到開機(jī)執(zhí)行的pytest.py
中躁垛,這樣在開機(jī)之后將先執(zhí)行串口初始化和攝像頭動(dòng)態(tài)打開的任務(wù)剖毯,即在執(zhí)行深度算法之前確保所有的基礎(chǔ)條件已經(jīng)具備。這樣將條件準(zhǔn)備和算法執(zhí)行分開教馆,具有模塊化的一些優(yōu)點(diǎn)逊谋。另外,還可以考慮在無(wú)顯示器的狀態(tài)下通過GPIO
(Python有對(duì)應(yīng)的庫(kù))操作LED或者使用USB揚(yáng)聲器通過語(yǔ)音的方式來報(bào)告程序內(nèi)部執(zhí)行狀態(tài)土铺,這樣可以增強(qiáng)與人的交互胶滋,可以起到緩解緊張的作用板鬓。