英偉達Jeston nano<3>使用Python實作三種方式串口通信
- 前言
- 通信配置程序
- 基本資訊
- 配置程序
- 方案一:Python-40pinEXpansion Header
- 方案二:Python-serial Port Header
- 方案三:Python-USB3.0 Type A
- 其他方案
- 總結
- 參考資料
前言
近來需要把使用Jeston nano做個設備,需要使用Jeston nano跑代碼,然后將代碼處理的資料傳給STM32,STM32做底層的控制,所以在Jeston nano和STM32之間要涉及到串口通信的內容,本博文即為了記錄在除錯通信的步驟和一些問題;
其實Jeston nano 本身自帶的有40pin IO口,完全可以外接拓展板使用Python進行編程,這里因為專案組內熟悉Jeston nano-STM32這種所謂上位機-下位機的開發和分工方式,所以還是選擇了這種,后續本人有時間會嘗試直接用Jeston nano 引腳進行控制,
關于通信方式本身,其實有串口通信、Can總線等等方式,但是由于硬體原因,Jeston nano和STM32通信只支持串口通信的方式;對于Jeston nano串口硬體來說,可以看下述Jeston nano最新版B01硬體圖,有直接串口引腳、40pin IO 引腳串口、USB串口三種硬體連接方式;從編程語言上也有Python和C++之分;

話又說回來,我那個專案代碼能否使用C++和Python混合編程/編譯?
通信配置程序
基本資訊
使用硬體:Jeston nanoB01(Jeston nano總共有A01/A02/B01三個版本)、USB轉ttl、杜邦線、USB hub;
串口硬體:獨立串口模塊serial Port Header(J40)、40pinEXpansion Header(J41)、USB3.0 三種硬體方式,
配置程序
以下是三種硬體配置
方案一:Python-40pinEXpansion Header
第一種方式就是40pinEXpansion Header,對應就是板載上40pin GPIO口,上面串口引腳是8和10,這個看一下板子和上面的引腳圖就知道了
首先配置一下serial庫:
//先安裝一下python3版本的py-serial庫
sudo apt-get install python3-serial
使用 USB轉ttl 連接Jeston nano和電腦:
上圖另一端USB連接電腦;
運行代碼,記得是python3且sudo:
sudo python3 uart_example.py
uart_example.py代碼內容具體如下:
#!/usr/bin/python3
import time
import serial
print("UART Demonstration Program")
print("NVIDIA Jetson Nano Developer Kit")
serial_port = serial.Serial(
port="/dev/ttyTHS1", #這里注意一下這個埠號
baudrate=115200,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
)
# Wait a second to let the port initialize
time.sleep(1)
try:
# Send a simple header
serial_port.write("UART Demonstration Program\r\n".encode())
serial_port.write("NVIDIA Jetson Nano Developer Kit\r\n".encode())
while True:
if serial_port.inWaiting() > 0:
data = serial_port.read()
print(data)
serial_port.write(data)
# if we get a carriage return, add a line feed too
# \r is a carriage return; \n is a line feed
# This is to help the tty program on the other end
# Windows is \r\n for carriage return, line feed
# Macintosh and Linux use \n
if data == "\r".encode():
# For Windows boxen on the other end
serial_port.write("\n".encode())
except KeyboardInterrupt:
print("Exiting Program")
except Exception as exception_error:
print("Error occurred. Exiting Program")
print("Error: " + str(exception_error))
finally:
serial_port.close()
pass
電腦端使用串口通信測驗軟體,選中com口,測驗結果如下:

測驗成功
方案二:Python-serial Port Header
這里我首先查看了一下設備埠號:

剛才那個40pin的GPIO用了ttyTHS1,這里我以為serial Port Header獨立模塊的串口就是ttyTHS2,
硬體連接如下:

測驗了一下,結果如下:

它通信自動反饋埠號為 ttyS0,測驗后確為這個,測驗成功,
這個ttyTHS2猜測為其他通信方式的埠,如I2C,SPI等等,
方案三:Python-USB3.0 Type A
這里按照之前的測驗方案,需要兩個 USB轉ttl 分別連接Jeston nano和電腦,這里我手里只有一個 USB轉ttl ,所以打算直接在Jeston nano上實作測驗;
硬體連接如下:

這里用了serial Port Header的串口,埠號為ttyS0;
首先查看一下USB轉ttl的埠號,下圖為插拔效果:

所以 USB轉ttl 埠號為:ttyUSB0
測驗方法即在Jeston nano上開兩個終端運行兩個程式,實作通信;
uart_example.py代碼如下:
#!/usr/bin/python3
import time
import serial
print("UART Demonstration Program")
print("NVIDIA Jetson Nano Developer Kit")
serial_port = serial.Serial(
port="/dev/ttyS0",
baudrate=115200,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
)
# Wait a second to let the port initialize
time.sleep(1)
try:
# Send a simple header
serial_port.write("UART Demonstration Program\r\n".encode())
serial_port.write("NVIDIA Jetson Nano Developer Kit\r\n".encode())
while True:
if serial_port.inWaiting() > 0:
data = serial_port.read()
print(data)
serial_port.write(data)
# if we get a carriage return, add a line feed too
# \r is a carriage return; \n is a line feed
# This is to help the tty program on the other end
# Windows is \r\n for carriage return, line feed
# Macintosh and Linux use \n
if data == "\r".encode():
# For Windows boxen on the other end
serial_port.write("\n".encode())
except KeyboardInterrupt:
print("Exiting Program")
except Exception as exception_error:
print("Error occurred. Exiting Program")
print("Error: " + str(exception_error))
finally:
serial_port.close()
pass
uart_example1.py代碼如下
#!/usr/bin/python3
import time
import serial
print("UART Demonstration Program")
print("NVIDIA Jetson Nano Developer Kit")
serial_port = serial.Serial(
port="/dev/ttyUSB0",
baudrate=115200,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
)
# Wait a second to let the port initialize
time.sleep(1)
try:
# Send a simple header
serial_port.write("UART Demonstration Program\r\n".encode())
serial_port.write("NVIDIA Jetson Nano Developer Kit\r\n".encode())
while True:
if serial_port.inWaiting() > 0:
data = serial_port.read()
print(data)
serial_port.write(data)
# if we get a carriage return, add a line feed too
# \r is a carriage return; \n is a line feed
# This is to help the tty program on the other end
# Windows is \r\n for carriage return, line feed
# Macintosh and Linux use \n
if data == "\r".encode():
# For Windows boxen on the other end
serial_port.write("\n".encode())
except KeyboardInterrupt:
print("Exiting Program")
except Exception as exception_error:
print("Error occurred. Exiting Program")
print("Error: " + str(exception_error))
finally:
serial_port.close()
pass
測驗結果如下:

通信測驗成功,
其他方案
這里利用python的serial庫測驗的Jeston nano上所有串口,后續會測驗使用C++如何實作相應的功能…
總結
Jeston nano對應串口的埠號如下:
獨立串口模塊serial Port Header—/dev/ttyS0
40pinEXpansion Header串口—/dev/ttyTHS1
使用USB轉ttl—ttyUSB0
一般USB轉串口設備/dev/ttyUSB*,如果是普通的串口設備會是/dev/ttyS*

其他tty設備應該是USB設備,使用時隨機分配,
參考資料
[1]、Jetson Nano - Serial Console from JetsonHacks : https://www.youtube.com/watch?v=Kwpxhw41W50 B01版本.
[2]、Jetson_Nano_Developer_Kit_User_Guide (這里A02版本的,暫時沒找到B01的).
[3]、CSDN博客: https://blog.csdn.net/Uncle_GUO/article/details/80867169.
最后,關于Jeston nano視頻教程,推薦一下這個油管光頭大叔JetsonHacks
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/261804.html
標籤:其他
