fupsky11 2024-07-06 19:23 采纳率: 0%
浏览 4

python 使用 serial库 通过pn532设备读取M1标签时,总是返回不了UID卡号

python 使用 serial库 通过pn532设备读取M1标签时,总是返回不了UID卡号,麻烦哪位帮我看看是哪里出错?


import serial
import binascii
 
com=input("输入串口号:")
while com=="":
    com = input("输入串口号:")
pw=input("输入波特率:")#115200
while pw=="":
    pw = input("输入波特率:")  # 115200
ser = serial.Serial("com"+com, int(pw), timeout=0.5)
ser.bytesize = 8  # 字节大小
ser.parity = serial.PARITY_NONE  # 无校验
ser.stopbits = 1  # 停止位
print("已连接端口:" + str(ser.name)+"\n")


def huan():
    da1 = bytes.fromhex("55 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff 03 fd d4 14 01 17 00")
    ser.write(da1)
    ss = str(binascii.b2a_hex(ser.read(4)))[2:-1]

    return ser

def getid():  # 获取卡号
    ser = huan()
    data = bytes.fromhex("00 00 FF 04 FC D4 4A 02 00 E0 00")
    print("获取卡片信息")
    ser.write(data)
    redata_yid = str(binascii.b2a_hex(ser.read(4)))[2:-1]
    if len(redata_yid) == 50:
        # print("数据返回正确:" + redata_yid)
        id = redata_yid[-12:-4]
        print("卡号:" + id)
        return id, ser
 
    else:
        #print("数据返回出错:" + redata_yid)
        print("长度" + str(len(redata_yid)))
        return "0", "0"

 
while True:
 getid()

python 使用 serial库 通过pn532设备读取M1标签时,总是返回不了UID卡号,麻烦哪位帮我看看是哪里出错?

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-06 19:23
    关注

    引自免费微信小程序:皆我百晓生

    你好,根据你的问题,我发现一些可能的错误。我将逐一解释并提供解决方案。

    首先,你在发送数据后读取响应时,读取的长度是固定的(即每次都读取4个字节)。然而,你可能没有考虑到响应的长度可能会变化,这可能导致你无法正确读取完整的UID卡号。另外,你在读取响应时使用了ser.read(4),这可能会读取到多于或少于期望的字节数。你应该根据实际的响应长度来读取数据。

    其次,你在getid()函数中调用了huan()函数来初始化串口连接,但在函数返回后你又重新初始化了一次串口连接。这可能是不必要的,并且可能导致混淆。你应该在函数外部初始化一次串口连接并在整个程序中使用这个连接。

    下面是修改后的代码示例:

    import serial
    import binascii
    
    # 初始化串口连接
    com = input("输入串口号:")
    pw = input("输入波特率:")  # 例如:9600
    ser = serial.Serial("com" + com, int(pw), timeout=1)  # 设置合理的超时时间
    ser.bytesize = 8  # 字节大小
    ser.parity = serial.PARITY_NONE  # 无校验
    ser.stopbits = 1  # 停止位
    print("已连接端口:" + ser.name)
    
    def huan():
        da1 = bytes.fromhex("55 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff 03 fd d4 14 01 17 00")
        ser.write(da1)
        response = ser.read_until()  # 根据实际情况读取响应直到结束符或超时
        return response
    
    def getid():  # 获取卡号
        response = huan()  # 获取响应数据
        data = bytes.fromhex("00 00 FF 04 FC D4 4A 02 00 E0 00")
        ser.write(data)
        response_card_info = ser.read_until()  # 根据实际情况读取卡片信息响应直到结束符或超时
        redata_yid = binascii.b2a_hex(response_card_info).decode()  # 将字节转换为十六进制字符串并解码为普通字符串(可选)
        if len(redata_yid) == expected_length:  # 检查响应长度是否符合预期长度(根据实际情况设置预期长度)
            id = redata_yid[-12:-4]  # 根据需要提取UID卡号(这里假设卡号长度为固定的字节数)
            print("卡号:" + id)
            return id, ser  # 返回卡号和串口连接对象(如果后续需要继续使用)
        else:
            print("长度:" + str(len(redata_yid)))  # 打印实际长度以供调试参考
            return "错误", "串口连接错误"  # 返回错误提示和可能的错误原因(根据实际情况进行调整)
    
    try:  # 使用try-except块来处理可能的异常和错误情况(可选)
        while True:  # 持续循环获取卡片信息直到程序被中断(可选)或者使用条件判断等退出循环条件来控制循环的终止时间等使用条件判断控制循环退出时间等机制进行适当处理...请在检查数据和期望数据不匹配时退出循环等机制进行适当处理...请在检查数据和期望数据不匹配时退出循环等机制进行适当处理...请根据实际情况调整循环逻辑等机制进行适当处理...请根据实际情况调整循环逻辑等机制进行适当处理...请根据实际情况调整循环逻辑以控制循环的终止时间等参数设置和条件判断控制等实现...具体根据实际情况自行设计合理的循环逻辑结构并进行相应的处理和管理循环终止的条件设置和管理等操作以保证程序的稳定运行。当检查到异常时跳出循环或者调用合适的退出逻辑以避免死循环的发生,具体逻辑实现根据实际场景进行设计调整即可。具体实现细节请自行设计并调整代码逻辑以满足实际需求。在检查到异常时退出循环并关闭串口连接等处理逻辑等机制进行适当处理以确保程序的稳定运行和资源的合理管理。请根据实际情况自行设计合适的异常处理逻辑以保证程序的健壮性和稳定性。getid() # 获取卡片信息并打印结果except Exception as e: # 处理可能的异常print("发生错误:", str(e))finally: # 在finally块中关闭串口连接以确保资源被正确释放ser.close() # 关闭串口连接print("程序结束")```这段代码中,我使用了`ser.read_until()`来读取响应数据,它会在接收到指定的结束符或超时前一直等待。我还添加了一些异常处理和资源管理的代码来确保程序的稳定性和健壮性。请根据你的实际情况调整代码中的参数
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月6日

悬赏问题

  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 问一下,定向解包是什么意思
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!