为什么“While True”循环会突然停止?

Why a "While True" loop could stop out of nowhere?

提问人:Juan Abdelnabe 提问时间:2/4/2023 最后编辑:vvvvvJuan Abdelnabe 更新时间:4/3/2023 访问量:72

问:

我正在用Arduino实时感应机器的振动。为此,我使用了一个加速度计、一个 Arduino Uno 板和一个我编写的 Python 脚本。该代码旨在从串行端口 (g) 读取传感器的数据,计算 secuence (RMS) 的均方根并将数据保存在 csv 文件中。我遇到的问题是我的 sript 突然停止显示和保存数据,您是否看到代码中有任何错误?我无法确定不同事件之间的任何关系,因为每个事件发生在不同的时间。在这里:

import csv
from math import sqrt
import serial
from itertools import count 
import os

ruta = 'C:/Users/jabde/OneDrive/Documentos/Juan/PhD/Ensayos/Acelerómetro/archivo.csv'

nombre_archivo = input("Ingrese el nombre del archivo: ")

ruta_completa = os.path.join(os.path.dirname(ruta), nombre_archivo + '.csv')

os.chdir(os.path.dirname(ruta))

arduinoData=serial.Serial('com3',115200)

fieldnames = ["t", "g", "RMS"]

i = 0
t = 0
g = 0.15
RMS = 0.1425
suma_cuadrados = 0

with open(ruta_completa, 'w', newline= '') as csv_file:
    csv_writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
    csv_writer.writeheader()


while True:
    with open(ruta_completa, 'a', newline= '') as csv_file:
        csv_writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
        try:
            g = arduinoData.readline()
            g = float(g) / 800
            t = t + 0.2
            t = round(t,1)
            i = i + 1
            cuadrados = g * g
            suma_cuadrados = suma_cuadrados + cuadrados
            RMS = suma_cuadrados / i
            RMS = sqrt(RMS)

            info = {
                "g": g,
                "t": t,
                "RMS": RMS
            }
        
            with open(ruta_completa, 'a', newline= '') as csv_file:
                csv_writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
                csv_writer.writerow(info)
        
            print(t, g, RMS)
            time.sleep(0.2)
        except:
            pass

我认为这可能是我的笔记本电脑中的空间问题,所以我更改了保存 CSV 文件的 rute,但什么也没发生。

Python 时间序列 串口 数据操作

评论

0赞 Hariharan 2/4/2023
可以尝试删除“try catch”,因为您处于无限 while 循环中并忽略所有错误,因此错误有可能发生在 while 循环内部,因此请删除 try catch 并运行脚本
0赞 Juan Abdelnabe 2/4/2023
嘿哈里哈兰,感谢您的回复!我添加了“try catch”,认为可能有一个异常导致中断,但它一直在发生。你认为这可能与我正在使用的硬件有关吗?
1赞 JonSG 2/4/2023
为什么你要打开文件三次?
1赞 Ignatius Reilly 2/4/2023
错误永远不应该以静默方式传递。如果有异常,请尝试至少获取有关它的一些信息。
1赞 Juan Abdelnabe 2/4/2023
嘿,@JonSG,我在“编写csv文件”方面遇到了问题,所以我从页面中获取了该部分,您对如何改进它有什么建议吗?

答:

0赞 JonSG 2/4/2023 #1

我会从这样的事情开始,看看它把我带到了哪里。请注意,您的一些代码被注释掉和/或模拟以供我测试。

这个想法是通过外部循环处理异常,同时在内部循环中执行预期的工作。

import csv
import math
#import serial
#import os
import time
import random

#ruta = 'C:/Users/jabde/OneDrive/Documentos/Juan/PhD/Ensayos/Acelerómetro/archivo.csv'
#nombre_archivo = input("Ingrese el nombre del archivo: ")
#ruta_completa = os.path.join(os.path.dirname(ruta), nombre_archivo + '.csv')
ruta_completa = "out.csv"

#os.chdir(os.path.dirname(ruta))

#arduinoData = serial.Serial('com3',115200)
class arduinoData:
    readline = lambda : 100_000 * random.random()

start_time = int(time.time())
suma_cuadrados = 0
i = 1

with open(ruta_completa, 'w', newline= '') as csv_file:
    csv_writer = csv.writer(csv_file)
    csv_writer.writerow(["t", "g", "RMS"])

while True:
    try:
        with open(ruta_completa, 'a', newline= '') as csv_file:
            csv_writer = csv.writer(csv_file)

            while True:
                if random.randint(0, 10) == 10:
                    raise Exception("Test Exception")

                t = round(time.time() - start_time, 1)
                g = float(arduinoData.readline()) / 800
                suma_cuadrados += (g * g)
                RMS = math.sqrt(suma_cuadrados / i)

                row = [g, t, RMS]
                csv_writer.writerow([g, t, RMS])
                print(row)

                i += 1
                time.sleep(0.2)
 
    except Exception as e:
        print(f"Error: {e}")
        print("\tTrying again in 5 seconds...")
        time.sleep(5)