模拟串口式电流传感器_rs485数据上报
1. 导入模块
pip install pyserial
import serial import time import serial.tools.list_ports
2. 获取可用串口
# 获取可用串口 def get_serial(): try: port_list = list(serial.tools.list_ports.comports()) # print(port_list) if len(port_list) == 0: print('无可用串口') else: # for i in range(0, len(port_list)): # print(port_list[i]) print("获取成功:", len(port_list)) return port_list except Exception as e: print("串口获取失败:", e)
3. 打开串口
1 # 打开串口 2 def open_Serial(portx): 3 global ser 4 try: 5 # 打开串口,并得到串口对象 6 ser = serial.Serial(portx, 9600, timeout=0) 7 # 判断是否打开成功 8 if (False == ser.is_open): 9 ser = -1 10 except Exception as e: 11 print("---串口打开异常---:", e) 12 print(type(ser)) 13 return ser
4. 读取数据
# 读数据 (16进制数) def DReadPort(ser): global readbuf try: for i in range(20): # 判断是否有数据需要读 if ser.in_waiting: readbuf = ser.read(ser.in_waiting) break # print(readbuf) else: time.sleep(0.005) # print("sleep:%d" % i) # 返回读取到的数组 return readbuf except Exception as e: print("--读取数据异常--", e)
5. 写数据
# 写数据(十六进制) def DWritePort(ser, data): try: data1 = bytearray(data) result = ser.write(data1) # 写数据 print("写数据:", data1) return result except Exception as e: print("---写数据失败---", e)
6. 试运行
if __name__ == "__main__": a = get_serial() # 获取可用串口 print(a[2][0]) # 第3个串口号(第一个是com1) port = a[2][0] # 打印串口号 print(open_Serial(port)) # 打印打开串口信息 print("串口是否打开成功:", open_Serial(port).is_open) # 打印串口是否打开 ser = open_Serial(port) # 串口对象 while True: # test_A_O2(ser, 600, 1) # 测试数据 dd = DReadPort(ser) # 读数据 if len(dd) == 8: print(dd[0]) print(dd) if dd[0] == 11: data = [0x0B, 0x03, 0x02, 0x00, 0x22, 0xA0, 0x5C] DWritePort(ser, data) print("write", data) elif dd[0] == 12: data = [0x0C, 0x03, 0x02, 0x00, 0x22, 0x15, 0x9C] DWritePort(ser, data) print("write", data) elif dd[0] == 13: data = [0x0D, 0x03, 0x02, 0x00, 0x22, 0x28, 0x5C] DWritePort(ser, data) print("write", data) elif dd[0] == 14: data = [0x0E, 0x03, 0x02, 0x00, 0x22, 0x6C, 0x5C] DWritePort(ser, data) print("write", data) else: pass