Python串口解码数据存入列表时出现\x00异常字符问题
问题分析与解决
你遇到的\x00是空字节(null byte),属于串口通信中硬件可能附带的不可见控制字符。单独访问列表元素时终端会自动忽略这类不可见字符,但打印整个列表时会输出字符串的原始表示,所以能看到\x00。
解决步骤
1. 清洗通道字符串
在将通道名存入列表前,先去掉空字节和多余的不可见字符,常用方式有三种:
- 直接移除所有空字节:
clean_channel = data_parts[0].replace('\x00', '') - 移除首尾的空字节和换行/空格:
clean_channel = data_parts[0].strip('\x00 \r\n') - 彻底移除所有ASCII控制字符(含空字节、退格等):
import re clean_channel = re.sub(r'[\x00-\x1F\x7F]', '', data_parts[0])
2. 修改add_channel代码
把清洗逻辑加入原代码,确保存入列表的是干净的通道名:
def add_channel(self, response): data_parts = response.split('=') # 先清洗通道名 clean_channel = data_parts[0].replace('\x00', '').strip() if self.channels_detected_list.count(clean_channel) > 0: print("Channel already present.") else: self.channels_detected_list.append(clean_channel) print(self.channels_detected_list)
3. 可选:读取串口时预处理
也可以在读取串口数据时就做初步清洗,避免后续处理带脏数据:
response_line = self.main.serial_port.readline().decode('utf-8').replace('\x00', '').strip()
处理后,列表里的通道名不再包含\x00这类奇怪字符,打印列表和单独访问元素的结果会完全一致。
内容的提问来源于stack exchange,提问作者arost2022
相关产品推荐
相关产品推荐

