如何拆分串行设备的 "Key Value" 输出

How to split "Key Value" output from a serial device

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

当某个值高于某个阈值时,我可以以某种方式触发某些东西吗?例如。总是检查 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")

有人可以具体说明为什么我的列表超出范围吗?

正如我在评论中所写,有一个分隔键和值的分隔符,在你的情况下它是 \t 这意味着 Tab。 我们可以使用这个字符来拆分 pair 并将它们保存在一个变量中。

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

非常感谢@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")