第一步:新建一个qt C++项目


在此需要注意,名称和路径不能有中文。
第二步:添加控件完成UI布局
IC读写器读写IC卡数据块
第三步:开始写代码
使设备发出滴滴响声

#define BLOCK0_EN 0x01 #define BLOCK1_EN 0x02 #define BLOCK2_EN 0x04 #define NEEDSERIAL 0x08 #define EXTERNKEY 0x10 #define NEEDHALT 0x20 //#define NEEDSERIAL 0x08 #define EXTERNKEY 0x10 //让读写器发出声音 typedef unsigned char (*pcdbeep)(unsigned long xms); //返回本读写器独一无二的设备编号 typedef unsigned char (*pcdgetdevicenumber)(unsigned long devicenumber); //轻松读卡 typedef unsigned char (*piccreadex)(unsigned char ctrlword,unsigned char *serial,unsigned char area,unsigned char keyA1B0,unsigned char *picckey,unsigned char *piccdata0_2); //轻松写卡 typedef unsigned char (*piccwriteex)(unsigned char ctrlword,unsigned char *serial,unsigned char area, unsigned char keyA1B0,unsigned char *picckey,unsigned char *piccdata0_2); //改单区密码 typedef unsigned char (*piccchangesinglekeyex)(unsigned char ctrlword,unsigned char *serial,unsigned char area,unsigned char keyA1B0,unsigned char *piccoldkey,unsigned char *piccdata); //读出一块的数据,也就是16个字节 typedef unsigned char (*piccread)(unsigned char block,unsigned char *piccdata); //检测输入数据是否为16进制数 static bool checkinput(QString inputstr){ QString inputyes="0123456789abcdefABCDEF"; for(int i=0;i< inputstr.length();i++){ if(inputyes.contains(inputstr.mid(i,1),Qt::CaseSensitive)){ }else{return false;} } return true; } MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui- >setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_4_clicked()//让设备发出声响 { unsigned char result; QLibrary mylib("OUR_MIFARE.dll"); if (!mylib.load()) //判断是否正确加载 { QMessageBox::information(NULL, "提示", "动态库没装载!原因是动态库OUR_MIFARE.dll没放在生成exe文件相同目录下!"); return; } pcdbeep mypcdbeep = (pcdbeep)mylib.resolve("pcdbeep"); if (mypcdbeep == NULL) //是否成功连接上 idr_beep()函数 { mylib.unload(); QMessageBox::information(NULL, "提示", "请检查函数名是否正确!"); return; } result = mypcdbeep(30); //这里函数指针调用dll中的idr_beep() 函数 mylib.unload(); if(result > 0) { if(result == 23) { QMessageBox::information(NULL, "提示", "机器没连上或者驱动没下载"); } else { QMessageBox::information(NULL, "提示", "错误代码:" + QString::number(result)); }; } //qDebug()<
读卡功能
void MainWindow::on_pushButton_3_clicked()//轻松读卡
{
unsigned char ctrlword;//控制字
unsigned char serial[4];//可写数组
unsigned char area;//读出的区号
unsigned char keyA1B0;//AB密码认证
unsigned char picckey[6];//存放卡密码的数组
unsigned char piccdata0_2[48];//下标0~15存放作为读出的块0的数据,下标16~31存放作为读出的块1的数据,下标32~47存放作为读出的块2的数据
unsigned char status;//返回
unsigned char status1;
unsigned char result;
QString piccdata[16]; //卡数据缓冲
//unsigned char myareano = ui->lineEdit_5 ; '指定为第8区
//以下控制字含义:读块0、块1、块2,仅读指定序列号的卡,需要每次指定密码
if (ui->radioButton->isChecked())
{
ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY;
}
else
{//内部密码
ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN;
}
area = ui->comboBox->currentText().toUShort();
keyA1B0 = 1;//用A密码
//qDebug()< lineEdit- >text().mid(0,2);
//qDebug()< lineEdit- >text().mid(2,2);
// qDebug()< lineEdit- >text().mid(2,2);
// qDebug()< lineEdit- >text().mid(2,2);
QString Key_str = ui->lineEdit->text().trimmed();
if(Key_str.length() < 12)
{
QMessageBox::information(NULL, "提示", "密码长度不够12位!");
ui- >lineEdit->setFocus();
return;
}
char c;
for (int var = 0; var < 12; ++var)
{
c = Key_str.at(var).toLatin1();
if(!((('0' <= c) && (c <= '9')) || (('A' <= c) && (c <= 'F')) || (('a' <= c) && (c <= 'f'))))
{
QMessageBox::information(NULL, "提示", "密码输入字符不正确!");
//ui- >lineEdit->setSelection(var,1);
ui->lineEdit->setSelection(var,1);
ui->lineEdit->setFocus();
return;
}
}
bool ok;
// picckey[0]=(unsigned char)(Key_str.mid(0,2).toUShort(nullptr,16));
// picckey[1] = Key_str.mid(2,2).toShort();
// picckey[2] = Key_str.mid(4,2).toShort();
// picckey[3] = Key_str.mid(6,2).toShort();
// picckey[4] = Key_str.mid(8,2).toShort();
// picckey[5] = Key_str.mid(10,2).toShort();
for(int i = 0; i < 6; i++)
{
picckey[i]=QString(Key_str.mid(i*2,2)).toInt(&ok,16);
}
QLibrary mylib("OUR_MIFARE.dll");
if (!mylib.load()) //判断是否正确加载
{
QMessageBox::information(NULL, "提示", "动态库没装载!原因是动态库OUR_MIFARE.dll没放在生成exe文件相同目录下!");
return;
}
piccreadex mypiccreadex = (piccreadex)mylib.resolve("piccreadex");
status = mypiccreadex(ctrlword,serial,area,keyA1B0,picckey,piccdata0_2);
if(status == 0)
{
//qDebug()< lineEdit_5- >setText(QString::asprintf("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X",picckey[0],picckey[1],picckey[2],picckey[3],picckey[4],picckey[5],picckey[6],serial[1],serial[2],serial[3]));
ui->lineEdit_2->setText(QString::asprintf("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X ",piccdata0_2[0],piccdata0_2[1],piccdata0_2[2],piccdata0_2[3],piccdata0_2[4],piccdata0_2[5],piccdata0_2[6],piccdata0_2[7],piccdata0_2[8],piccdata0_2[9],piccdata0_2[10],piccdata0_2[11],piccdata0_2[12],piccdata0_2[13],piccdata0_2[14],piccdata0_2[15]));
ui->lineEdit_3->setText(QString::asprintf("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X ",piccdata0_2[16],piccdata0_2[17],piccdata0_2[18],piccdata0_2[19],piccdata0_2[20],piccdata0_2[21],piccdata0_2[22],piccdata0_2[23],piccdata0_2[24],piccdata0_2[25],piccdata0_2[26],piccdata0_2[27],piccdata0_2[28],piccdata0_2[29],piccdata0_2[30],piccdata0_2[31]));
ui->lineEdit_4->setText(QString::asprintf("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X ",piccdata0_2[32],piccdata0_2[33],piccdata0_2[34],piccdata0_2[35],piccdata0_2[36],piccdata0_2[37],piccdata0_2[38],piccdata0_2[39],piccdata0_2[40],piccdata0_2[41],piccdata0_2[42],piccdata0_2[43],piccdata0_2[44],piccdata0_2[45],piccdata0_2[46],piccdata0_2[47]));
piccread mypiccread = (piccread)mylib.resolve("piccread");
//typedef unsigned char (*piccread)(unsigned char block,unsigned char *piccdata);
status1 = piccread(area * 4 + 3,piccdata);
pcdbeep mypcdbeep = (pcdbeep)mylib.resolve("pcdbeep");
if (mypcdbeep == NULL) //是否成功连接上 idr_beep()函数
{
mylib.unload();
QMessageBox::information(NULL, "提示", "请检查函数名是否正确!");
return;
}
result = mypcdbeep(30); //这里函数指针调用dll中的idr_beep() 函数
mylib.unload();
}
else if(status == 8)
{
ui->lineEdit_2->clear();
ui->lineEdit_3->clear();
ui->lineEdit_4->clear();
QMessageBox::information(NULL, "提示", "寻卡错误,根本就没有卡在感应区");
}
else if(status == 12)
{
ui->lineEdit_2->clear();
ui->lineEdit_3->clear();
ui->lineEdit_4->clear();
QMessageBox::information(NULL, "提示", "密码认证失败");
}
//qDebug()<
审核编辑 黄宇
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
IC
+关注
关注
36文章
6258浏览量
184149 -
读写器
+关注
关注
3文章
744浏览量
40491 -
C++
+关注
关注
22文章
2122浏览量
76696
发布评论请先 登录
相关推荐
热点推荐
什么是超高频rfid读写设备,RFID读写器远距离读取能达到15米吗?
在物联网技术飞速发展的当下,RFID读写器作为数据采集的核心设备,已广泛渗透到生产生活的多个领域。其中,超高频rfid读写器凭借独特的性能优势,成为物流、零售、制造等行业的“得力助手”。很多人会好
RK3506开发板QT Creator开发手册,交叉编译工具链与QT应用示例,入门必备
本文基于触觉智能RK3506核心板/开发板介绍QTCreator交叉编译配置与QT应用示例。如需购买开发板进行评估验证简介QTCreatorQtCreator是由TheQtCompany开发
读写器读得到却传不出?耐达讯让Modbus和Profinet网关“偷偷对话”
兼容背。
谁没遇过这种糟心事儿?RFID读写器大多用Modbus协议,而现代建筑的物料管理系统、智能仓储平台几乎都跑在Profinet网络上。想让两者“对话”,要么硬接线改程序,要么用转换器却卡在数据丢
发表于 07-29 14:46
东集RFID读写器有什么用
在当今信息高度发达的时代,RFID(射频识别)技术正在逐渐改变我们周围的世界。随着物联网(IoT)的兴起,RFID读写器作为这一技术的核心组件,正在发挥着越来越重要的作用。东集小编将深入探讨RFID
发表于 06-20 10:36
高频工业RFID读写器
高频工业RFID读写器 型号:SG-HF40-485、SG-HF40-TCP 产品功能 高频工业读写器(RFID)产品用在自动化生产线,自动化分拣系统,零部件组装产线等情境下,在自动化节点的工位上部
RFID读写器哪种性价比高?RFID读写器哪家做的比较好
在探讨RFID读写器性价比及品牌优劣时,我们不得不将目光聚焦于行业内的佼佼者,远望谷与远景达无疑是两颗璀璨的明星。这两家企业不仅在国内RFID及物联网领域享有盛誉,更以其卓越的技术实力、丰富的产品线
制鞋线体去毛刺工艺段现场RFID读写器进行数据传输应用
在制鞋厂的去毛刺工艺段,RFID标签被固定在鞋子上,读写器则安装在生产线上。当鞋子经过读写器时,读写器会迅速读取标签中的信息,并将数据传输给管理系统。
基于QT开发国产主板终端桌面程序 高效、稳定、跨平台的解决方案
了开发者们面临的一个重要挑战。本文将介绍如何基于QT框架,开发适用于国产主板的终端桌面程序,并探讨其优势和应用场景。 QT是一个跨平台的
USB免驱全协议IC卡读写器 QT程序开发
读取15693卡,IC读卡器如下入所示: 15693卡片,通常指的是符合ISO/IEC 15693标准的非接触式智能卡或RFID卡。以下是对15693卡片的详细介绍: 一、基本概述 15693
手持式RFID读写器可以当pda手持终端用吗
随着科技的不断进步,手持式RFID读写器作为一种新兴的便携式读写器,逐渐在各行各业中发挥着重要作用。而在很多场景下,手持式RFID读写器是否能替代传统的PDA(数据采集终端)手持终端也成为了一个备受

C++ QT开发,IC读写器程序
评论