Python读取Arduino串口传感器数据:将字符串转为numpy数组
解决Python读取Arduino传感器数据并转换为NumPy数组的问题
核心处理步骤
- 先将串口读取的字节数据解码为字符串,再按硬件输出的格式解析出各字段(sensorID、采样数、加速度三轴数据、陀螺仪三轴数据)
- 将解析后的数值集合转换为NumPy数组,便于后续分析与计算
修改后的完整代码
import serial import time import numpy as np import matplotlib.pyplot as plt # 初始化串口连接 ser45 = serial.Serial('COM4', baudrate=500000, writeTimeout=0) config = 'n45' k = 0 # 用于存储所有解析后的传感器数据 sensor_records = [] while k < 10: ser45.flush() ser45.flushInput() ser45.write(config.encode()) time.sleep(1) # 读取串口数据并解码为字符串,去除首尾空白字符 raw_data = ser45.read(ser45.inWaiting()).decode('utf-8').strip() print(f"原始串口数据: {raw_data}") # 假设Arduino输出为逗号分隔格式,例如:"4,101,0.23,-0.15,0.98,0.5,1.2,2.1" # 请根据实际硬件输出的分隔符、字段顺序调整以下解析逻辑 if raw_data: try: # 分割字符串为单个字段 fields = raw_data.split(',') # 转换各字段为对应数值类型 sensor_id = int(fields[0]) sample_count = int(fields[1]) accel_x = float(fields[2]) accel_y = float(fields[3]) accel_z = float(fields[4]) gyro_g1 = float(fields[5]) gyro_g2 = float(fields[6]) gyro_g3 = float(fields[7]) # 将单条数据存入列表 sensor_records.append([sensor_id, sample_count, accel_x, accel_y, accel_z, gyro_g1, gyro_g2, gyro_g3]) except (IndexError, ValueError) as e: print(f"数据解析失败: {e}") k += 1 # 将列表转换为NumPy数组 sensor_np_array = np.array(sensor_records) print("\n转换完成的NumPy数组:") print(sensor_np_array) print(f"数组维度: {sensor_np_array.shape}") # 关闭串口连接 ser45.close()
关键注意事项
- 编码匹配:确保
decode('utf-8')与Arduino端的字符编码一致,若硬件输出为其他编码需对应调整 - 格式适配:必须根据Arduino实际发送的数据格式(比如分隔符、字段数量、顺序)修改
split参数和字段提取逻辑,这是解析成功的核心 - 异常防护:加入
try-except块捕获解析时的索引越界、类型转换错误,避免程序因异常数据直接崩溃 - 类型优化:转换NumPy数组时可通过
dtype指定存储类型(如dtype=np.float32),减少内存占用
内容的提问来源于stack exchange,提问作者saeed arabzadeh
相关产品推荐
相关产品推荐

