英伟达Jeston nano<3>使用Python实现三种方式串口通信

前言

近来需要把使用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++之分;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wm5AyDiQ-1613741735452)(C:\Users\lenovo\Desktop\jeston nano\jeston串口通信\IMG\20210218204035.png)]

话又说回来,我那个项目代码能否使用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上实现测试;
硬件连接如下:
在这里插入图片描述
这里使用的Jeston nano4GB01版本的四个USB口都是3.0的(蓝色)

这里用了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

### Jeston Nano 角度传感器配置教程 Jeston Nano 并未内置角度传感器,因此如果需要实现角度数据的读取功能,则需外接相应的硬件设备(如陀螺仪、加速度计或其他 IMU 设备),并通过软件驱动完成数据采集与处理。 #### 外接IMU设备 通常情况下,可以选用 I2C 接口的惯性测量单元 (Inertial Measurement Unit, IMU),例如 MPU6050 或 BNO055。这些设备能够提供角速度、线性加速度以及方向等多维度的数据[^1]。 #### 配置I2C接口 为了使 Jeston Nano 能够正常通信于外部的角度传感器,首先需要启用其 I2C 功能。具体操作如下: 1. **编辑`/boot/jetson-nano-devkit.conf`文件** 找到该文件并确认 `dtparam=i2c_arm=on` 已被激活。如果没有此选项或者处于注释状态,请手动添加或取消注释。 2. **加载必要的内核模块** 使用命令行工具执行以下指令来确保系统已经加载了 i2c_dev 和 spi_bcm2835 模块: ```bash sudo modprobe i2c-dev ``` 3. **验证I2C总线** 可通过运行i2cdetect程序扫描当前可用的I2C地址范围内的所有器件是否存在响应信号: ```bash sudo apt-get install i2c-tools sudo i2cdetect -y 1 ``` 如果一切顺利,在终端屏幕上应该能看到代表目标芯片的有效十六进制数值显示出来[^5]。 #### 数据解析与应用编程 当物理连接完成后,下一步就是编写应用程序去访问来自传感器的信息流。Python 是一种非常适合快速原型设计的语言之一,并且拥有丰富的第三方库支持各种类型的嵌入式项目开发工作流程。 以下是基于 Python 的简单示例代码片段用于演示如何从 MPU6050 获取原始倾斜角度值的过程: ```python import smbus # SMBus module of I2C from time import sleep # Importing the time library to provide delays in program class Mpu6050: def __init__(self): self.bus = smbus.SMBus(1) self.address = 0x68 # This is address we setup in Arduino IDE def read_raw_data(self, addr): high = self.bus.read_byte_data(self.address , addr ) low = self.bus.read_byte_data(self.address , addr+1 ) value = ((high << 8) | low) if(value > 32768): value = value - 65536 return value mpu = Mpu6050() while True : acc_x = mpu.read_raw_data(0x3B)/16384.0 acc_y = mpu.read_raw_data(0x3D)/16384.0 angleX = math.degrees(math.atan(acc_y / abs(acc_x))) print(f&#39;Angle X:{angleX}&#39;) sleep(.5) ``` 注意上述脚本仅作为概念证明用途展示基本原理;实际部署前可能还需要考虑更多因素比如滤波算法优化等问题[^2].
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GRF-Sunomikp31

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值