You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino+Python场景下如何拆分两路IR传感器数据至不同文件?

解决两路IR传感器数据分别保存到不同文件的方案

要实现两路数据拆分保存,核心思路是让Arduino输出的数据带上明确的归属标识,再让Python根据标识将数据写入对应文件。下面分两步详细说明:

第一步:修改Arduino代码,输出可区分的数据

你需要给每路传感器的输出加上专属前缀,让Python能一眼识别数据归属。比如在你的代码中,找到串口打印counter和counter2的位置,修改成以下格式:

// 第一路传感器数据,格式:Sensor1:数值
Serial.print("Sensor1:");
Serial.println(counter);
// 第二路传感器数据,格式:Sensor2:数值
Serial.print("Sensor2:");
Serial.println(counter2);

如果觉得带文字的前缀太占带宽,也可以用更简洁的分隔符格式(后续Python解析更高效):

// 第一路:1,数值
Serial.print("1,");
Serial.println(counter);
// 第二路:2,数值
Serial.print("2,");
Serial.println(counter2);

第二步:编写Python代码,解析并分文件写入

首先确保你已经安装了pyserial库(用于读取串口数据),如果没装,执行pip install pyserial安装。然后用以下代码实现数据拆分保存:

import serial
import time
from datetime import datetime  # 可选:用于记录数据时间戳

# 配置串口参数,根据你的Arduino实际端口和波特率修改
ser = serial.Serial('COM3', 9600, timeout=1)
time.sleep(2)  # 给串口连接留初始化时间

# 打开两个文件,用追加模式(a)避免覆盖已有数据
file_sensor1 = open('sensor1_data.txt', 'a')
file_sensor2 = open('sensor2_data.txt', 'a')

try:
    while True:
        # 读取串口数据并转成字符串,去除首尾空白
        line = ser.readline().decode('utf-8').strip()
        if not line:
            continue  # 跳过空行

        # --- 对应Arduino的第一种输出格式(Sensor1:XXX)---
        if line.startswith('Sensor1:'):
            data = line.split(':')[1].strip()
            # 可选:加上时间戳
            # record = f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} {data}\n"
            record = data + '\n'
            file_sensor1.write(record)
            file_sensor1.flush()  # 立即写入文件,避免缓存
            print(f"已写入Sensor1数据: {data}")
        elif line.startswith('Sensor2:'):
            data = line.split(':')[1].strip()
            record = data + '\n'
            file_sensor2.write(record)
            file_sensor2.flush()
            print(f"已写入Sensor2数据: {data}")

        # --- 如果用的是第二种分隔符格式(1,XXX),替换成下面的代码 ---
        # if ',' in line:
        #     sensor_id, data = line.split(',', 1)
        #     sensor_id = sensor_id.strip()
        #     data = data.strip()
        #     if sensor_id == '1':
        #         file_sensor1.write(data + '\n')
        #         file_sensor1.flush()
        #     elif sensor_id == '2':
        #         file_sensor2.write(data + '\n')
        #         file_sensor2.flush()

except KeyboardInterrupt:
    print("\n程序已终止")
finally:
    # 务必关闭文件和串口,避免资源泄漏
    file_sensor1.close()
    file_sensor2.close()
    ser.close()

注意事项

  • 确保Arduino的波特率和Python代码中设置的一致(比如都是9600)
  • 串口端口号要对应你的设备:Windows是COMx,Linux是/dev/ttyUSBx,Mac是/dev/tty.usbmodemxxx
  • 使用flush()是为了让数据立即写入文件,而不是留在内存缓存中
  • 如果需要记录数据产生的时间,取消代码中时间戳相关的注释即可

内容的提问来源于stack exchange,提问作者Wing Hung Siu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:58:22