首页 > 解决方案 > 在获取数据之前清除串行缓冲区

问题描述

我在 python 中创建了一个简短的脚本,它从 Arduino 读取传入的串行数据并将其写入 CSV 文件。我在 Arduino 程序中创建了标题(数据标签),它们作为第一个字符串值传递并分配为列标题。但是,由于某种原因,数据头前面有一小部分数据,我认为这些数据是 USB 串行缓冲区中的旧数据。无论如何我可以告诉python等到旧数据被清除并且Arduino重置串行连接?

代码如下所示,任何帮助将不胜感激。

问题快照

import serial
from datetime import datetime
import time
import pandas as pd
import random

a = input("Enter a:")
b = input("Enter b:")
c = input("Enter c:")
d = input("Enter d:")

fileName= a + "-" + b + "-" + c + "-" + d + ".csv" #name of the CSV file generated
arduino_port = "COM7"
baud = 115200
print_labels = False

file = open(fileName, "w", newline="")
print("Created file")

ser = serial.Serial(arduino_port, baud)
print("Connected to Arduino port:" + arduino_port)

line = 0 #start at 0 because our header is 0 (not real data)

while True:
    
    getData = (ser.readline().decode())
    data=getData[0:][:-1]
    now = datetime.now()
    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")

    time.sleep(1)

    if data
    
    if line == 0:
        print(data)
        file = open(fileName, "a", newline="")
        file.write(data + "\n") #write data with a newline
        line = line+1
    else:
        print(data + "," + dt_string)
        file = open(fileName, "a", newline="")
        file.write(data + "," + dt_string + "\n") #write data with a newline
        line = line+1

print("Data collection complete!")
file.close()

标签: pythonpyserial

解决方案


  1. 如果新进程将这些数据变红,那么旧进程可能不会。这是以前程序中的一个问题,它应该确保在关闭连接之前它接收到所有数据(通过等待 EOFError 或 '\0')。
  2. 在一个新的过程中,我会跳过这些行,直到发现一些独特的标记(例如,开始从 '\n' 流式传输您的 csv (并将流式传输内容中的所有 '\n' 引用为 '\n')。

推荐阅读