0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

邹振豪 ? 来源:jf_51178285 ? 作者:jf_51178285 ? 2024-12-30 14:55 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

wKgZPGdyP_6AO_KvAAfrLdJihcY379.pngwKgZO2dyQDWABVsZAAgzAvh17MM970.png

在此需要注意,名称和路径不能有中文。

第二步:添加控件完成UI布局

wKgZO2dyQKGAQCG_AAF6fUjfXEM123.pngIC读写器读写IC卡数据块

第三步:开始写代码

使设备发出滴滴响声

wKgZPGdyQdGAa84uAADRl397VQk748.png

#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;isetupUi(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()text().mid(0,2);
   //qDebug()text().mid(2,2);

   // qDebug()text().mid(2,2);
   // qDebug()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()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
    IC
    +关注

    关注

    36

    文章

    6137

    浏览量

    179991
  • 读写器
    +关注

    关注

    3

    文章

    710

    浏览量

    39806
  • C++
    C++
    +关注

    关注

    22

    文章

    2119

    浏览量

    75510
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    IO-link协议高频工业RFID读写器售后讲解视频#三格电子

    读写器
    三格电子科技
    发布于 :2025年08月01日 16:01:51

    IO-link协议高频工业RFID读写器#三格电子

    读写器
    三格电子科技
    发布于 :2025年07月31日 11:15:31

    东集RFID读写器有什么用

    在当今信息高度发达的时代,RFID(射频识别)技术正在逐渐改变我们周围的世界。随着物联网(IoT)的兴起,RFID读写器作为这一技术的核心组件,正在发挥着越来越重要的作用。东集小编将深入探讨RFID
    发表于 06-20 10:36

    超高频RFID读写器漏读

    超高频RFID读写器出现漏读的情况怎么解决
    发表于 06-12 19:55

    高频工业RFID读写器

    高频工业RFID读写器 型号:SG-HF40-485、SG-HF40-TCP 产品功能 高频工业读写器(RFID)产品用在自动化生产线,自动化分拣系统,零部件组装产线等情境下,在自动化节点的工位上部
    的头像 发表于 05-06 15:33 ?314次阅读
    高频工业RFID<b class='flag-5'>读写器</b>

    【技术案例】Qt 环境部署 - Ubuntu 篇

    什么是QtQt是一个跨平台C++图形用户界面应用程序开发框架,可构建高性能的桌面、移动及Web应用程序
    的头像 发表于 04-16 17:17 ?623次阅读
    【技术案例】<b class='flag-5'>Qt</b> 环境部署 - Ubuntu 篇

    RFID读写器哪种性价比高?RFID读写器哪家做的比较好

    在探讨RFID读写器性价比及品牌优劣时,我们不得不将目光聚焦于行业内的佼佼者,远望谷与远景达无疑是两颗璀璨的明星。这两家企业不仅在国内RFID及物联网领域享有盛誉,更以其卓越的技术实力、丰富的产品线
    的头像 发表于 01-14 15:38 ?738次阅读
    RFID<b class='flag-5'>读写器</b>哪种性价比高?RFID<b class='flag-5'>读写器</b>哪家做的比较好

    基于QT开发国产主板终端桌面程序 高效、稳定、跨平台的解决方案

    开发者们面临的一个重要挑战。本文将介绍如何基于QT框架,开发适用于国产主板的终端桌面程序,并探讨其优势和应用场景。 QT是一个跨平台的
    的头像 发表于 01-08 15:34 ?949次阅读

    USB免驱全协议IC读写器 QT程序开发

    ? 读取15693卡,IC读卡如下入所示: 15693卡片,通常指的是符合ISO/IEC 15693标准的非接触式智能卡或RFID卡。以下是对15693卡片的详细介绍: 一、基本概述 15693
    的头像 发表于 12-30 17:42 ?566次阅读
    USB免驱全协议<b class='flag-5'>IC</b>卡<b class='flag-5'>读写器</b> <b class='flag-5'>QT</b><b class='flag-5'>程序</b><b class='flag-5'>开发</b>

    手持式RFID读写器可以当pda手持终端用吗

    随着科技的不断进步,手持式RFID读写器作为一种新兴的便携式读写器,逐渐在各行各业中发挥着重要作用。而在很多场景下,手持式RFID读写器是否能替代传统的PDA(数据采集终端)手持终端也成为了一个备受
    的头像 发表于 12-05 14:58 ?689次阅读
    手持式RFID<b class='flag-5'>读写器</b>可以当pda手持终端用吗

    超高频读写器究竟是什么,能做什么?一文读懂!

    在物联网技术日新月异的今天,超高频读写器作为射频识别(RFID)技术的重要组成部分,正逐渐渗透到我们生活的各个领域。那么,超高频读写器究竟是什么?它又能做些什么呢?本文将带您一探究竟。一、超高频
    的头像 发表于 10-23 14:41 ?841次阅读
    超高频<b class='flag-5'>读写器</b>究竟是什么,能做什么?一文读懂!

    工业制造行业的RFID读写器形状大小如何选型

    在工业制造行业,RFID读写器的形状和大小选型主要取决于具体的应用场景、工作环境、安装条件以及读写需求。以下是一些关键的选型因素和建议:
    的头像 发表于 10-16 10:24 ?599次阅读
    工业制造行业的RFID<b class='flag-5'>读写器</b>形状大小如何选型

    巴鲁夫rfid读头国产平替版——高频RFID读写器

    随着RFID技术的不断发展,国内RFID企业的数量也在不断地变多,国产RFID读写器的质量也越来越高。具有着价格实惠、质量可靠等特点,成为了可平替国外RFID产品的首要选择。健永科技的高频RFID读写器JY-H830,是一款可平替巴鲁夫rfid读头的国产RFID
    的头像 发表于 10-10 16:05 ?1040次阅读
    巴鲁夫rfid读头国产平替版——高频RFID<b class='flag-5'>读写器</b>

    使用TRF7970A的NFC/HF RFID读写器

    电子发烧友网站提供《使用TRF7970A的NFC/HF RFID读写器.pdf》资料免费下载
    发表于 09-18 14:42 ?0次下载
    使用TRF7970A的NFC/HF RFID<b class='flag-5'>读写器</b>

    嵌入式QT常见开发方式有哪些?

    嵌入式QT常见开发方式有哪些? 嵌入式工程师在学习和使用Qt进行开发时,常见的几种开发方式包括: 1.
    发表于 08-12 10:05