需求:电脑使用串口连接了一个温湿度计,使用Python向串口发送16进制指令,并提取返回数据。
问题:同样的Python程序在Windows下正常执行,但是想在Linux实现同样的功能,程序的串口号修改为Linux串口号过后程序执行,但是无法完全执行, len_return_data = ser.inWaiting() # 获取缓冲数据(接收数据)这里获取不到数据所以返回0,(在Windows下可以正常返回数据的)。程序执行并不报错。Windows和Linux编码都是UTF-8。唯一的区别是执行locale后windows是C.UTF-8。Linux是zh_CN.UTF-8.不知道是不是这个的问题。程序能执行一部分证明非权限问题
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import binascii
import time
import serial.tools.list_ports
if __name__ == '__main__':
# 读取串口列表
ports_list = list(serial.tools.list_ports.comports())
if len(ports_list) <= 0:
print("无串口设备")
else:
print("可用的串口设备如下: ")
print("%-10s %-30s %-10s" % ("num", "name", "number"))
for i in range(len(ports_list)):
comport = list(ports_list[i])
comport_number, comport_name = comport[0], comport[1]
print("%-10s %-30s %-10s" % (i, comport_name, comport_number))
# 打开串口
ser = serial.Serial(port="/dev/ttyS0", baudrate=9600, bytesize=8, stopbits=1,
timeout=0.5)
if ser.isOpen():
print("打开串口成功, 串口号: %s" % ser.name)
else:
print("打开串口失败")
# 串口发送数据
a = '01 03 01 03 05 02 c7 4B'
d = bytes.fromhex(a)
result = ser.write(d)
print(result)#8
time.sleep(1)
len_return_data = ser.inWaiting() # 获取缓冲数据(接收数据)
print(len_return_data)#0
if len_return_data > 0:
data = ser.read(len_return_data)
if data != b'':
print("receive", str(binascii.b2a_hex(data))[2:-1])
# 关闭串口
ser.close()
