如何拆分串行设备的 "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")
我有一个 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")