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
相关产品推荐
相关产品推荐

