华视电子CVR-100UC这款阅读器Windows驱动和读卡软件安装起来都非常顺利,但如果想用在Linux开发板上,让QT读取身份证信息并显示要怎么做呢?

从官网上的Linux驱动有下图三种版本,具体细节如下:
x64_noLog_USBDynamic_UTF-8 是x86架构64位的Linux USB热插拔驱动;
ARMHF_noLog_USBDynamic_UTF-8 是ARM架构32位使用HF(Hard Float,硬件浮点单元)的Linux USB热插拔驱动;
ARM32_noLog_USBDynamic_UTF-8 是ARM架构32位不用Hard Float的Linux USB热插拔驱动。

正点原子开发用ARMHF_noLog_USBDynamic_UTF-8这个就可以。
安装
其中bin文件夹下是编译后的程序,在身份证读卡器接入USB口后,调用bin文件夹下的文件,可以测试读卡器的读取效果。
doc文件是操作手册,查阅用。
lib文件夹下是依赖的库文件。
src文件夹下是测试用的源码,注意是测试源码,不是驱动源码,驱动源码应该是封装在库文件里了,不开源。

尝试运行官方的测试文件
src文件夹下这三个文件,LibTestMain是测试文件,里面包含了测试用的函数如:

int CVR_InitComm(const char *path, int protocolType); //初始化连接
int CVR_Authenticate() //卡认证
int CVR_AuthenticateForNoJudge() //卡认证一直成功版本
int CVR_Read_Content(int active) //读卡操作
int CVR_Read_FPContent(int active) //读卡操作,含指纹
int CVR_CloseComm() //关闭连接
int CVR_FindCard () //找卡
int CVR_SelectCard() //选卡
int CVR_GetSAMID(char *SAMID, int *length) //得到安全模块号
int CVR_GetStatus() //获取设备状态
int CVR_MF_HL_Request(unsigned char nMode, unsigned int *pSNR, unsigned short *pTagType); //M1卡卡认证
int CVR_MF_HL_Write(unsigned char nMode, unsigned int nSNR, unsigned char nBlock,unsigned char nKey[6], unsigned char *pWriteBuff, unsigned int nBuffLen); //M1卡写卡
int CVR_MF_HL_Read(unsigned char nMode, unsigned int nSNR, unsigned char nBlock,unsigned char nKey[6], unsigned char *pReadBuff, unsigned int *pBuffLen); //M1卡读卡
然后再看Makefile
libs = -L../lib -l100UD
libs += -L../lib -lusb-1.0
libs += -L../lib -ltermbhf
CC= arm-linux-gnueabihf-gcc
RM=rm -f
lib100UDTest:LibTestMain.c
$(CC) -o ../bin/lib100UDTest LibTestMain.c -ldl
test:lib100UDTest
LD_LIBRARY_PATH=../lib ../bin/lib100UDTest
clean:
$(RM) zp.bmp fp.dat LibTestMainPhoto.bmp wz.txt programLog.txt ../bin/lib100UDTest
makefile文件的意思是说编译需要使用lib文件夹下的lib100UD.so libusb-1.0.so libtermbhf.so
编译器使用的是arm-linux-gnueabihf-gcc
正点原子Linux开发板用的就是arm-linux-gnueabihf-gcc,所以可以直接make编译。
编译成功后可以直接用make test测试,正常会返回结果。
注意:lib库里的三个库文件lib100UD.so libusb-1.0.so libtermbhf.so 编译的时候使用的相对路径,如果固化到产品时建议还是放到系统根目录下的库文件夹里,通常来说是/lib /lib32之类的路径。

QT里调用读卡器函数
修改.pro文件,QT是用qmake编译,加入库的写法如下:
LIBS += -ldl
LIBS += -L$$PWD/lib -l100UD -lusb-1.0 -ltermbhf
然后参考官方的测试文件.c/.h改写成QT C++版的.cpp/.h:
#ifndef IDCARDREADER_H
#define IDCARDREADER_H
#include <QObject>
class IDCardReaderHandler : public QObject
{
Q_OBJECT
public:
IDCardReaderHandler(QObject *parent = nullptr);
~IDCardReaderHandler();
void initializeDevice();
void readDeviceStatus();
void closeDevice();
void readSAMID();
private:
using p_CVR_GetSAMID = int (*)(char *SAMID, int *length);
using p_CVR_GetStatus = int (*)();
using p_CVR_InitComm = int (*)(const char *


518

被折叠的 条评论
为什么被折叠?



