如何从连续的数据流中提取所需的信息??

时间:2018-12-27 07:44:18

标签: python

我正在一个项目中,其中连续数据流通过Arduino进入串行端口,我必须在其中提取所需的信息。 在必填数据的开头添加了“ AA”,在结尾添加了“ 55”。

Arduino串行监视器输出-

AA055
AA155
AA255
AA355
AA455

Arduino代码-

int i=0;
void setup()
{  
 Serial.begin(9600);    // Open serial connection at a baud rate of 9600
}

void loop()
{ 
 Serial.print("AA");
 Serial.print(i);
 Serial.println("55");

 i++;
 delay(100);
 }

PYTHON代码

import serial
import time
import csv

baudrate = 9600
port = 'COM2'  # set the correct port before run it

serial = serial.Serial(port=port, baudrate=baudrate)
serial.flushInput()
with open("test_data.csv","a") as f:
    writer = csv.writer(f,delimiter=",")
    writer.writerow(["TIME STAMP", "DATA"])

while True:
    try:
        ser_bytes = serial.readline()
        decoded_bytes = float(ser_bytes[0:len(ser_bytes)-2].decode("utf-8"))
        print(decoded_bytes)
        aq = time.strftime('%a %H:%M:%S')
        print(aq)
        with open("test_data.csv","a") as f:
        writer = csv.writer(f,delimiter=",")
        writer.writerow([time.strftime('%a %H:%M:%S'),decoded_bytes])
    except:
        print("Keyboard Interrupt")
        break

我希望python代码通过检测开头的“ AA”和结尾的“ 55”来提取我的信息。

1 个答案:

答案 0 :(得分:0)

假设您需要从串行输出中提取信息(以“ AA”开头,以“ 55”结尾),可以对python代码进行如下修改:

...
print(decoded_bytes)

#First check whether the length of the serial output is at least 4. 
if len(decoded_bytes) >= 4:
    if decoded_bytes[0:2] == "AA" and decoded_bytes[len(decoded_bytes)-2:len(decoded_bytes)] == "55":
        print(decoded_bytes) # The information from serial output, between "AA" and "55"

aq = time.strftime('%a %H:%M:%S')
...

假设串行输出如下:

AA155
AA255
AB155
AA235

这段代码将仅打印以“ AA”开头和以“ 55”结尾的输出。那是前两种情况。

我们正在检查长度是否大于4,因为该信息将包含在“ AA”和“ 55”之内。

这里要注意的重要事项是字符串切片运算符。您可以阅读here。基本上,它会在某些索引内返回字符串的一部分。