如何拆分来自串行设备的“键值”输出

时间:2019-06-25 15:15:34

标签: python pyserial

我有一个连接到device的USB连接,该串口发出串行信息。 当在下面(在Jupyter Notebook中)运行Python脚本时,会从中获取成对数据。

当某个值高于特定阈值时,我能以某种方式触发某些事情吗?例如。总是检查V的值,当它超过12000时我要执行一些操作?

import serial

ser = serial.Serial(port='COM3', baudrate=19200, bytesize=serial.EIGHTBITS, 
    parity=serial.PARITY_NONE, timeout=1)
ser.flushInput()

message=""
while True:
    message =ser.readline().decode('utf-8')
    print(message)

我的输出如下:

PID 0xA054

FW  139

SER#    HQ1746QEX1D

V   11750

I   -320

VPV 10

PPV 0

CS  0

MPPT    0

ERR 0

LOAD    ON

IL  300

H19 0

H20 0

编辑:澄清

Edit2:到达那里

 import serial

V_THRESHOLD = 11739

ser = serial.Serial(port='COM3', baudrate=19200, bytesize=serial.EIGHTBITS, 
    parity=serial.PARITY_NONE, timeout=1)
ser.flushInput()

message=""

while True:
    message = ser.readline().decode('utf-8', 'ignore')
    if len(message) > 1:
        message_parts = message.split('\t')
        key = message_parts[0]
        value = message_parts[1]
        if key != "PID":
            if type(value) != str:
                if key == 'V' and value > float(V_THRESHOLD):
                    print("HI")

请问有人可以说明我的列表为何超出范围吗?

2 个答案:

答案 0 :(得分:0)

正如我在评论中所写,有一个分隔符,用于分隔键和值,在您的情况下为\t,表示Tab。 我们可以使用此字符来分割配对并将它们保存在变量中。

import serial

V_THRESHOLD = 12000

ser = serial.Serial(port='COM3', baudrate=19200, bytesize=serial.EIGHTBITS, 
    parity=serial.PARITY_NONE, timeout=1)
ser.flushInput()

message=""

while True:
    message = ser.readline().decode('utf-8')
    if len(message) > 1:
        message_parts = message.split('\t')
        key = message_parts[0]
        value = message_parts[1]
        if key == 'V' and value > float(V_THRESHOLD):
            # do something here

答案 1 :(得分:0)

非常感谢@reportgunner! 使用他的代码,我能够创建它,效果很好!

import serial

V_THRESHOLD = 1

ser = serial.Serial(port='COM3', baudrate=19200, bytesize=serial.EIGHTBITS, 
    parity=serial.PARITY_NONE, timeout=1)
ser.flushInput()

message=""

while True:
    message = ser.readline().decode('utf-8', 'ignore')
    message_parts = message.split('\t')
    if len(message_parts) > 1:
        key = message_parts[0]
        value = message_parts[1]
        #print(key,value) used this for debugging
        if key == 'V':
            if int(value) >(V_THRESHOLD):
                print("HI")