Python调用DLL、SO动态库读取RFID卡号
```python
-- coding: utf-8 --
Form implementation generated from reading ui file ‘IDReader.ui’
#
Created by: PyQt5 UI code generator 5.15.4
#
WARNING: Any manual changes made to this file will be lost when pyuic5 is
run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget
import struct # struct的pack函数把任意数据类型变成字符串
import ctypes # 调用DLL动态库要有这个引用
class Ui_Frame(object):
def setupUi(self, Frame):
Frame.setObjectName(“Frame”)
Frame.resize(531, 421)
font = QtGui.QFont()
font.setPointSize(10)
Frame.setFont(font)
self.pushButton_beep = QtWidgets.QPushButton(Frame)
self.pushButton_beep.setGeometry(QtCore.QRect(10, 10, 511, 30))
self.pushButton_beep.setObjectName(“pushButton_beep”)
self.pushButton_getdevicenum = QtWidgets.QPushButton(Frame)
self.pushButton_getdevicenum.setGeometry(QtCore.QRect(10, 42, 511, 30))
self.pushButton_getdevicenum.setObjectName(“pushButton_getdevicenum”)
self.pushButton_piccreadex = QtWidgets.QPushButton(Frame)
self.pushButton_piccreadex.setGeometry(QtCore.QRect(10, 75, 511, 30))
self.pushButton_piccreadex.setObjectName(“pushButton_piccreadex”)
self.pushButton_piccreadone = QtWidgets.QPushButton(Frame)
self.pushButton_piccreadone.setGeometry(QtCore.QRect(10, 108, 511, 30))
self.pushButton_piccreadone.setObjectName(“pushButton_piccreadone”)
self.listWidget = QtWidgets.QListWidget(Frame)
self.listWidget.setGeometry(QtCore.QRect(10, 184, 511, 231))
self.listWidget.setObjectName(“listWidget”)
self.pushButton_clearlist = QtWidgets.QPushButton(Frame)
self.pushButton_clearlist.setGeometry(QtCore.QRect(350, 148, 170, 30))
self.pushButton_clearlist.setObjectName(“pushButton_clearlist”)
self.label = QtWidgets.QLabel(Frame)
self.label.setGeometry(QtCore.QRect(12, 153, 70, 30))
self.label.setObjectName(“label”)
self.retranslateUi(Frame)
self.pushButton_clearlist.clicked.connect(self.pushButton_clearlist_click)
self.pushButton_beep.clicked.connect(self.pushButton_beep_click)
self.pushButton_getdevicenum.clicked.connect(self.pushButton_getdevicenum_click)
self.pushButton_piccreadex.clicked.connect(self.pushButton_piccreadex_click)
self.pushButton_piccreadone.clicked.connect(self.pushButton_piccreadone_click)
QtCore.QMetaObject.connectSlotsByName(Frame)
def retranslateUi(self, Frame):
_translate = QtCore.QCoreApplication.translate
Frame.setWindowTitle(_translate("Frame", "IDReader"))
self.pushButton_beep.setText(_translate("Frame", "驱动读卡器发声"))
self.pushButton_getdevicenum.setText(_translate("Frame", "获取读卡器出厂序号"))
self.pushButton_piccreadex.setText(_translate("Frame", "读取ID、HID卡号"))
self.pushButton_piccreadone.setText(_translate("Frame", "仅读取一次卡号,再次读取需将卡拿开再重新刷卡"))
self.pushButton_clearlist.setText(_translate("Frame", "清空下栏提示信息"))
self.label.setText(_translate("Frame", "提示信息栏"))
def ListBottom(self):
self.listWidget.scrollToBottom()
seleid = self.listWidget.count() - 1
self.listWidget.item(seleid).setSelected(True)
def pushButton_clearlist_click(self):
self.listWidget.clear()
def ListErrInf(self, Errcode):
if (Errcode == 8):
self.listWidget.addItem('错误代码:8,未寻到卡,请重新拿开卡后再放到感应区!')
elif (Errcode == 21):
self.listWidget.addItem('错误代码:21,没有动态库!')
elif (Errcode == 22):
self.listWidget.addItem('错误代码:22,动态库或驱动程序异常!')
elif (Errcode == 23):
self.listWidget.addItem('错误代码:23,有可能是以下原因:')
self.listWidget.addItem('1、表示未检测到免驱动读卡器!')
self.listWidget.addItem('2、有驱动读卡器表示驱动程序错误或未检测到有驱读卡器!')
self.listWidget.addItem('3、Linux系统请以sudo超级用户模式运行')
elif (Errcode == 24):
self.listWidget.addItem('错误代码:24,操作超时,一般是动态库没有反映!')
elif (Errcode == 25):
self.listWidget.addItem('错误代码:25,发送字数不够!')
elif (Errcode == 26):
self.listWidget.addItem('错误代码:26,发送的CRC错!')
elif (Errcode == 27):
self.listWidget.addItem('错误代码:27,接收的字数不够!')
elif (Errcode == 28):
self.listWidget.addItem('错误代码:28,接收的CRC错!')
else:
self.listWidget.addItem('未知错误,错误代码:' + str(Errcode))
self.ListBottom()
def pushButton_beep_click(self):
status = Objdll.idr_beep(50) % 256
if status == 0:
self.listWidget.addItem("读卡器已执行响声指令!")
self.ListBottom()
else:
self.ListErrInf(status)
def pushButton_getdevicenum_click(self):
devno = bytes(4) # 声明4个字节缓冲
status = Objdll.pcdgetdevicenumber(devno) % 256
if (status == 0):
Objdll.idr_beep(38)
SerialNum = ''
for num in range(0, len(devno)):
SerialNum = SerialNum + '%03d' % (devno[num])
if (num < len(devno) - 1):
SerialNum = SerialNum + '-'
self.listWidget.addItem('读取设备编号成功!编号:' + SerialNum)
self.ListBottom()
else:
self.ListErrInf(status)
def pushButton_piccreadex_click(self):
idserial = bytes(5)
status = Objdll.idr_read(idserial) % 256
if (status == 0):
Objdll.idr_beep(38)
Cardno = idserial[4]
Cardno = Cardno + (idserial[3] * 256)
Cardno = Cardno + (idserial[2] * 65536)
Cardno = Cardno + (idserial[1] * 16777216)
CardnoStr = '%010d' % Cardno
self.listWidget.addItem('读卡成功!16进制卡号:%02X%02X%02X%02X%02X' % (idserial[0], idserial[1], idserial[2], idserial[3], idserial[4]) +",转换成10进制卡号:"+CardnoStr)
else:
self.ListErrInf(status)
def pushButton_piccreadone_click(self):
idserial = bytes(5)
status = Objdll.idr_read_once(idserial) % 256
if (status == 0):
Objdll.idr_beep(38)
Cardno = idserial[4]
Cardno = Cardno + (idserial[3] * 256)
Cardno = Cardno + (idserial[2] * 65536)
Cardno = Cardno + (idserial[1] * 16777216)
CardnoStr = '%010d' % Cardno
self.listWidget.addItem('读卡成功!16进制卡号:%02X%02X%02X%02X%02X' % (idserial[0], idserial[1], idserial[2], idserial[3], idserial[4]) +",转换成10进制卡号:"+CardnoStr)
else:
self.ListErrInf(status)
if name == “main“:
import sys
app = QtWidgets.QApplication(sys.argv)
Frame = QtWidgets.QFrame()
ui = Ui_Frame()
ui.setupUi(Frame)
screen = QDesktopWidget().screenGeometry()
size = Frame.geometry()
# 获得窗口相关坐标
newLeft = (screen.width() - size.width()) // 2
newTop = (screen.height() - size.height()) // 2
# 移动窗口使其居中
Frame.move(newLeft, newTop)
Frame.show()
if sys.platform == 'win32':
# windows系统加载当前目录下的DLL库
dllfile = sys.path[0] + '\OUR_IDR.dll'
Objdll = ctypes.windll.LoadLibrary(dllfile)
elif sys.platform == 'linux':
# Linux加载当前目录下的so库
dllfile = sys.path[0] + '/libOURIDR.so'
Objdll = ctypes.cdll.LoadLibrary(dllfile)
else:
# macOS加载当前目录下的.dylib库
dllfile = sys.path[0] + '/libOURIDR.dylib'
Objdll = ctypes.cdll.LoadLibrary(dllfile)
sys.exit(app.exec_())
本作品采用《CC 协议》,转载必须注明作者和本文链接