【发布时间】:2021-07-30 19:36:50
【问题描述】:
我有这个连续的串行数据流:
----------------------------------------
SENSOR COORDINATE = 0
MEASURED RESISTANCE = 3.70 kOhm
----------------------------------------
----------------------------------------
SENSOR COORDINATE = 1
MEASURED RESISTANCE = 3.70 kOhm
----------------------------------------
----------------------------------------
SENSOR COORDINATE = 2
MEASURED RESISTANCE = 3.69 kOhm
----------------------------------------
对于每次迭代,我希望能够获取值。传感器坐标值,电阻值。
我找到了使用 .split() 和使用正则表达式 (
Find string between two substrings),但问题是在我的情况下,我想要过滤的不是一个字符串,而是一个连续的流。
例如,.split() 会找到我的字符串,但它会将流分成两半。这在连续流中不止一次有效。
注意:在传感器坐标值之后,我有一个回车符。
编辑 1/3: 这是抓取串口数据的sn-p代码:
def readSerial():
global after_id
while ser.in_waiting:
try:
ser_bytes = ser.readline() #read data from the serial line
ser_bytes = ser_bytes.decode("utf-8")
text.insert("end", ser_bytes)
except UnicodeDecodeError:
print("UnicodeDecodeError")
else:
print("No data received")
after_id=root.after(50,readSerial)
如果有人想知道,这是 arduino 端的 C 代码,用于发送数据:
Serial.println("----------------------------------------");
Serial.print("SENSOR COORDINATE = ");
Serial.println(sensor_coord);
Serial.print("MEASURED RESISTANCE = ");
double resistanse = ((period * GAIN_VALUE * 1000) / (4 * CAPACITOR_VALUE)) - R_BIAS_VALUE;
Serial.print(resistanse);
Serial.println(" kOhm");
编辑 2/3: 这是以前的方法:
def readSerial():
global after_id
while ser.in_waiting:
try:
ser_bytes = ser.readline() #read data from the serial line
ser_bytes = ser_bytes.decode("utf-8")
text.insert("end", ser_bytes)
result = re.search.(, ser_bytes)
print(result)
except UnicodeDecodeError:
print("UnicodeDecodeError")
else:
print("No data received")
after_id=root.after(50,readSerial)
在另一次尝试中,我将这一行 result = re.search.(, ser_bytes) 更改为 result =ser_bytes.split("TE = ")。
这是我收到的数据的图片(这是一个 tkinter 文本框架)。
编辑 3/3: 这是我实现 dracarys 算法的代码:
def readSerial():
global after_id
while ser.in_waiting:
try:
ser_bytes = ser.readline()
print(ser_bytes)
ser_bytes = ser_bytes.decode("utf-8")
print(ser_bytes)
text.insert("end", ser_bytes)
if "SENSOR COORDINATE" in ser_bytes:
found_coordinate = True
coordinate = int(ser_bytes.split("=")[1].strip())
print("Coordinate",coordinate)
if "MEASURED RESISTANCE" in ser_bytes and found_coordinate:
found_coordinate = False
resistance = float(ser_bytes.split("=")[1].split("kOhm")[0].strip())
print("Resistance",resistance)
except UnicodeDecodeError:
print("UnicodeDecodeError")
else:
print("No data received")
after_id=root.after(50,readSerial)
这是我得到的错误,在代码成功运行大约十秒钟后(我也包含了正常操作输出以供参考):
No data received
b'SENSOR COORDINATE = 2\r\n'
SENSOR COORDINATE = 2
Coordinate 2
b'MEASURED RESISTANCE = 3.67 kOhm\r\n'
MEASURED RESISTANCE = 3.67 kOhm
Resistance 3.67
b'----------------------------------------\r\n'
----------------------------------------
b'----------------------------------------\r\n'
----------------------------------------
b'SENSOR COORDINATE = 3\r\n'
SENSOR COORDINATE = 3
Coordinate 3
No data received
b'MEASURED RESISTANCE = 3.78 kOhm\r\n'
MEASURED RESISTANCE = 3.78 kOhm
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\User1\AppData\Local\Programs\Python\Python38-32\lib\tkinter\__i
nit__.py", line 1883, in __call__
return self.func(*args)
File "C:\Users\User1\AppData\Local\Programs\Python\Python38-32\lib\tkinter\__i
nit__.py", line 804, in callit
func(*args)
File "tkinterWithPortsExperiment.py", line 73, in readSerial
if "MEASURED RESISTANCE" in ser_bytes and found_coordinate:
UnboundLocalError: local variable 'found_coordinate' referenced before assignment
【问题讨论】:
-
你能分享你尝试过的东西吗?有了这些有限的信息,我建议实现某种环形缓冲区(例如,使用双端队列)并对缓冲区内容执行处理。
-
您的流是如何进入您的程序的?读取日志文件?
stdin?插座? -
“伙计们,解决这个问题对我来说非常重要。” 那么你应该! Stack Overflow 不是代码编写服务。你没有表现出自己解决问题的努力——你所做的只是将每一行插入一个文本框中。 “为我实现此功能”与此站点无关。你必须诚实地尝试,然后就你的算法或技术提出一个具体问题。请使用tour,阅读what's on-topic here、How to Ask和question checklist,并提供minimal reproducible example。
-
一个提示让您开始:您根本不需要“拆分”。由于您一次得到的只是一行,因此解析每一行并解释结果。如果您找到了传感器坐标,请留意提供测量距离的直线。两者兼得后,记录它们并留意新的传感器坐标。
-
如果你也是 arduino 方面的维护者,最好为每个传感器事件编写一行 JSON,然后可以轻松地逐行处理。
标签: python python-3.x regex string split