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

Python串口数据拆分提取参数触发TypeError报错求助

解决串口数据参数提取的问题

嘿,我来帮你搞定这个串口数据提取的问题!你遇到的TypeError是因为把列表传给了re.search(),而这个函数需要的是字符串或者字节对象,咱们一步步来修正:

错误原因分析

你把解码后的字符串用split(" ")拆成了列表encoding_split,然后直接把这个列表传给re.search(),这就触发了类型错误——正则搜索只能针对单个字符串,不能直接搜列表。而且你的正则表达式\w+也不够用,因为参数里有小数点(比如209.44)和负号(比如-168.00),\w+只能匹配字母、数字和下划线,匹配不了这些符号。

修正方案

其实不用拆分列表,直接对整个解码后的字符串做正则匹配更简单,同时调整正则表达式来适配所有参数格式:

import serial
import re

ser = serial.Serial('/dev/ttyACM0')
print(ser.is_open)  # 注意这里是is_open,不是isOpen

# 读取并解码串口数据
serial_data = ser.readline()
encoding = serial_data.decode(encoding="ascii", errors="ignore").strip()  # strip()去掉首尾空格和换行
print(encoding)

# 提取各个参数,处理匹配结果(防止匹配不到报错)
# H: 带小数的数值
H_match = re.search(r'(?<=H:)-?\d+\.\d+', encoding)
H = float(H_match.group()) if H_match else None

# R: 带小数的数值
R_match = re.search(r'(?<=R:)-?\d+\.\d+', encoding)
R = float(R_match.group()) if R_match else None

# P: 带负号的小数
P_match = re.search(r'(?<=P:)-?\d+\.\d+', encoding)
P = float(P_match.group()) if P_match else None

# A: 整数
A_match = re.search(r'(?<=A:)\d+', encoding)
A = int(A_match.group()) if A_match else None

# M: 数字跟在M后面(无冒号)
M_match = re.search(r'(?<=M)\d+', encoding)
M = int(M_match.group()) if M_match else None

# G: 数字跟在G后面(无冒号)
G_match = re.search(r'(?<=G)\d+', encoding)
G = int(G_match.group()) if G_match else None

# S: 整数
S_match = re.search(r'(?<=S:)\d+', encoding)
S = int(S_match.group()) if S_match else None

# T: 小数
T_match = re.search(r'(?<=T:)-?\d+\.\d+', encoding)
T = float(T_match.group()) if T_match else None

# 打印测试
print(f"H: {H}, R: {R}, P: {P}, A: {A}, M: {M}, G: {G}, S: {S}, T: {T}")

关键说明

  • 用strip()去掉解码后字符串首尾的空格、换行符,让正则匹配更稳定
  • 正则表达式-?\d+\.\d+:-?匹配可选的负号,\d+匹配整数部分,\.匹配小数点,\d+匹配小数部分
  • 每个匹配后加了if xxx else None的判断,防止串口数据异常时匹配不到导致报错
  • 注意serial库中判断串口是否打开的属性是is_open(小写加下划线),不是isOpen

这样处理后,就能把每个参数值正确提取到对应的变量里啦!

内容的提问来源于stack exchange,提问作者sgsg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:30:31