python调用dll、so动态库读取rfid卡号 | python 技术论坛-江南app体育官方入口
```python
#
#
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 'd' % (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 = '0d' % cardno
self.listwidget.additem('读卡成功!16进制卡号:xxxxx' % (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 = '0d' % cardno
self.listwidget.additem('读卡成功!16进制卡号:xxxxx' % (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 协议》,转载必须注明作者和本文链接