You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动