后续要做模型的部署,购置了Jetson NX板子。因为还有一部分硬件控制,想着硬件控制部分干脆也用NX来实现。其中硬件部分要实现对电磁振动器的起停,电压,频率进行控制,本身振动器有一个带485的控制器,可对控制器输入特定16进制指令进行相应控制。
环境:ubuntu18.04,python3.7
485通讯协议:ModebusRTU,参考链接
使用硬件:Nvidia Jetson NX,USB转485,下游传感器/控制器等
使用串口:serial Port Header串口,端口号为ttyS0,端口插拔效果如下:
串口信息的传输主要靠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