加速度计数据写入文件并绘制Matplotlib图(3个子图 [x, y, z])

1 投票
2 回答
1870 浏览
提问于 2025-04-17 22:51

我对编程不是很熟悉,所以请多包涵。我正在做一个编程项目作为爱好(我主修物理)。总之,我想从一个Arduino Uno获取串行数据,然后用matplotlib画图,数据来源是一个ADXL345三轴加速度计。目前我不需要实时动态数据。以下是我用来将串行数据写入文件的代码,这部分运行得不错。

import serial

filepath = 'C:/Users/Josh/Documents/Programming/'
outfilename =filepath + 'data.txt'
outfile = open(outfilename,"w")

numpoints = 1000
ser = serial.Serial('COM4',9600)
for i in range(numpoints):
    inString=ser.readline()
    print inString
    outfile.write(inString)

ser.close()
outfile.close()

这段代码生成了一个相对简单的文本文件,我想把它转换成一个包含三个子图(分别对应x、y、z轴)的matplotlib图表。不过,我在运行时遇到了一个问题,Python给我报了一个文件输入输出错误,提示errno 2,意思是找不到文件(文件不存在),但我确认文件是存在的,路径在我有限的知识范围内也是正确的。非常感谢任何帮助。这是我这个不太成功的尝试的相关部分:

import numpy as npy
import matplotlib.pyplot as plt
global y0,y1,y2
increment_size = 8000
datasample_size = 16000

filepath = ("C:\Users\Josh\Documents\Programming\data.txt")
infile = filepath + 'data.txt'
infile = open("data.txt","r")
singleline = infile.readline()
asciidata = singleline.split()
asciidata[0]=asciidata[0][3:]  #strip three bytes of extraneous info
y0=[int(asciidata[0])]
y1=[int(asciidata[1])]
y2=[int(asciidata[2])]

2 个回答

1

如果你想知道如何实时绘制来自ADXL345的读数,这里有我的代码。为了让绘图更快,我使用了pyqtgraph这个库。

    from pyqtgraph.Qt import QtGui, QtCore
    import numpy as np
    import pyqtgraph as pg
    import serial

    app = QtGui.QApplication([])
    xdata = [0]
    ydata = [0]
    zdata = [0]

    # set up a plot window
    graph = pg.plot()
    graph.setWindowTitle("ADXL345 realtime data")
    graph.setInteractive(True)

    xcurve = graph.plot(pen=(255,0,0), name="X axis")
    ycurve = graph.plot(pen=(0,255,0), name="Y axis")
    zcurve = graph.plot(pen=(0,0,255), name="Z axis")

    # open serial port
    ser = serial.Serial("COM4", 115200, timeout=1)

    def update():
        global xcurve, ycurve, zcurve, xdata, ydata, zdata

        # serial read
        dataRead = ser.readline().split()

        # append to data list
        xdata.append(float(dataRead[0]))
        ydata.append(float(dataRead[1]))
        zdata.append(float(dataRead[2]))

        # plot 
        xcurve.setData(xdata)
        ycurve.setData(ydata)
        zcurve.setData(zdata)

        app.processEvents()  

    # Qt timer
    timer = QtCore.QTimer()
    timer.timeout.connect(update)
    timer.start(0)


    if __name__ == '__main__':
        import sys
        if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
            QtGui.QApplication.instance().exec_() 
2

你的文件路径是完整的文件地址,不只是文件夹的名字。然后你在这个路径后面加上了 'data.txt',你需要把你的代码改成:

filepath = 'C:\\Users\\Josh\\Documents\\Programming\\'
infile = filepath + 'data.txt'
infile = open(infile,"r")

在Python中,反斜杠('\')是用来转义字符的,所以如果你想要一个实际的反斜杠,你必须用两个反斜杠('\\')。

另外,你可以(而且通常应该)使用 os.path.join 来连接文件夹和文件。这样你的代码就变成:

from os.path import join

filepath = 'C:\\Users\\Josh\\Documents\\Programming'
infile = join(filepath, 'data.txt')
infile = open(infile,"r")

撰写回答