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

