Python读取RFID芯片:如何一次性获取完整数据行
解决RFID串口读取单字符&完整标签匹配问题
我来帮你搞定这个串口读RFID的问题~首先咱们先拆解下你遇到的几个核心问题:
为什么每次只返回单个字符?
你现在用的ser.read()不带参数时,默认只会读取1个字节,所以循环里每次输出一个字符。而ser.readline()没效果,大概率是因为你的RFID阅读器返回的数据流里没有换行符(\n或\r)——很多RFID设备是按固定长度数据包返回,而不是按“行”返回的。
那个末尾的方块符号是什么?
那个方块是不可打印的ASCII控制字符,比如空字符(0x00)、结束符或者阅读器自定义的标识位。你可以打印原始字节值来确认:比如在代码里加print([hex(byte) for byte in data]),就能看到它对应的十六进制码(比如0x00就是空字符)。
怎么一次性读取完整标签?
根据你说的“方块在第15位”,咱们可以用两种可靠的方式读取完整数据:
方法1:读取固定长度的数据包
既然每次返回的标签+结束符共15位,直接指定读取字节数即可:
import serial ser = serial.Serial( port='COM4', baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 # 设1秒超时,避免无限等待 ) print("connected to: " + ser.portstr) predefined_tags = ["4000041286CEFF", "TAG001", "TAG002"] # 你的预定义标签列表 try: while True: # 读取15字节的完整数据包 raw_data = ser.read(15) if raw_data: # 过滤掉不可打印字符(比如那个方块),提取有效标签ID tag_id = ''.join([chr(byte) for byte in raw_data if chr(byte).isprintable()]) if tag_id: print(f"扫描到完整标签: {tag_id}") # 预定义列表匹配逻辑 if tag_id in predefined_tags: print(f"✅ 标签 {tag_id} 在预定义列表中!") else: print(f"❌ 标签 {tag_id} 不在预定义列表中。") finally: # 程序退出时确保串口关闭 ser.close()
方法2:按结束符读取
如果你确认那个方块对应的字节(比如0x00),可以用read_until()读到结束符为止:
# 替换上面的读取逻辑 raw_data = ser.read_until(b'\x00') # 假设结束符是0x00
额外注意点
- 把
timeout从0改成1:之前的0是非阻塞模式,可能导致没读到数据就跳过,设为1秒超时更稳妥。 - 一定要用
try...finally包裹:确保程序退出时串口能正常关闭,避免下次连接失败。
内容的提问来源于stack exchange,提问作者Hjalte




