Jetson NX实现USB转485通讯16进制数据输出与接收

Jetson NX实现USB转485通讯16进制数据输出与接收

    • 前言
    • 准备
    • 关键点——Pyserial
    • 程序实现

前言

后续要做模型的部署,购置了Jetson NX板子。因为还有一部分硬件控制,想着硬件控制部分干脆也用NX来实现。其中硬件部分要实现对电磁振动器的起停,电压,频率进行控制,本身振动器有一个带485的控制器,可对控制器输入特定16进制指令进行相应控制。

准备

环境:ubuntu18.04,python3.7
485通讯协议:ModebusRTU,参考链接
使用硬件:Nvidia Jetson NX,USB转485,下游传感器/控制器等
使用串口:serial Port Header串口,端口号为ttyS0,端口插拔效果如下:
在这里插入图片描述

关键点——Pyserial

串口信息的传输主要靠Pyserial库实现,NX板子自带Pyserial,无需安装
主要命令就是串口的配置,serial.write写入数据,serial.read读取数据
最令我费解是数据格式的问题,serial的数据是以字节流的形式进行传递,即bytes
网上有很多种16进制数据输入的相关解读,都未能成功,后尝试以下方法后成功实现:
传输数据:01 03 00 00 00 03 05 CB
首先将其转化为10进制,并存储在列表中,并转化为bytes,即bytes([1,3,0,0,0,3,5,203])

程序实现

import serial
import time

ser = serial.Serial("/dev/ttyUSB0", 9600) # 选择串口,并设置波特率
if ser.is_open:
    print("port open success")

    start_data = bytes([1,6,0,0,0,1,72,10])           # 一些控制指令
    stop_data = bytes([1,6,0,0,0,0,137,202])
    read_data = bytes([1,3,0,0,0,3,5,203])
    v_50 = bytes([1,6,0,1,0,50,89,223])
    v_60 = bytes([1,6,0,1,0,60,216,27])
    f_40 = bytes([1,6,0,2,1,144,41,246])

    ser.write(start_data)
    time.sleep(2)        
    ser.write(v_50)
    time.sleep(0.1)     # 两条写入命令之间也必须有延时
    ser.write(f_40)
    time.sleep(2)
    ser.write(stop_data)
    time.sleep(0.1)
    ser.write(read_data)
    time.sleep(0.1)     # 延时,否则len_return_data将返回0,此处易忽视!!!
    ser.write(v_60)     # 每次停机后调整参数,下次启动时无需再调整所需频率和电压
    time.sleep(0.1)
    len_return_data = ser.inWaiting()  # 获取缓冲数据(接收数据)长度
    if len_return_data:
        return_data = ser.read(len_return_data)  # 读取缓冲数据      

        str_return_data = return_data.hex()            # bytes转换为hex(16进制)

        print(str_return_data)    # eg: 01 03 06 00 00 00 3c 01 90 e0 85
else:
    print("port open failed")

参考
[1]: https://www.zhihu.com/question/51733053

你可能感兴趣的:(嵌入式硬件,python)