当前位置: 首页 > news >正文

USB免驱IC读写器QT小程序开发

USB免驱全协议IC卡读写器QT小程序开发,读取15693卡。

QT小程序UI开发界面:

 QT程序代码mainWindow.cpp代码如下:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pb_beep_clicked()
{if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在unsigned char status;status = mypcdbeep(30);if(status==0){}else{disperrinf(status);}
}void MainWindow::on_pb_getdevnum_clicked()
{if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在unsigned char devicenumber[4];unsigned char status;status = mypcdgetdevicenumber(devicenumber);if(status==0){mypcdbeep(30);QMessageBox::information(NULL, "提示", QString::asprintf("设备编号:%03d-%03d-%03d-%03d", devicenumber[0],devicenumber[1],devicenumber[2],devicenumber[3]));}else{disperrinf(status);}
}void MainWindow::on_pb_easyread_clicked()
{if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在unsigned char status;unsigned char ctrlword=0x00;    //读任何卡,不需指定卡号,读完后不静止该卡,可赋值NEEDSERIAL及NEEDHALT的组合模式,或为0unsigned char afi;unsigned char myuid[8];unsigned char startblock;unsigned char blocknum;unsigned char piccdatabuf[255];ui->lineEdit_uid->setText("");ui->plainTextEdit_data->setPlainText("");QString afistr=ui->lineEdit_afi->text().trimmed();if(afistr.length()==2 and checkinput(afistr)){bool ok;afi=afistr.toInt(&ok,16);}else{QMessageBox::critical(NULL, "提示","请输入2位16进制AFI!");ui->lineEdit_afi->setFocus();return;}startblock=ui->spinBox_star->value();blocknum=ui->spinBox_num->value();if(blocknum>12){QMessageBox::critical(NULL, "提示","一次最多只能读取12块数据!");return;}status = myiso15693readex(ctrlword,afi,startblock,blocknum,myuid,piccdatabuf);if(status==0){mypcdbeep(30);QString uidstr="";for(int i=0;i<8;i++){uidstr=uidstr+QString::asprintf("%02X", myuid[i]);}ui->lineEdit_uid->setText(uidstr);QString datastr="";for(int i=1;i<=piccdatabuf[0];i++){datastr=datastr+QString::asprintf("%02X ", piccdatabuf[i]);}ui->plainTextEdit_data->setPlainText(datastr);QMessageBox::information(NULL, "提示", "读卡成功,卡片UID:"+uidstr);}else{if(status==46){QString uidstr="";for(int i=0;i<8;i++){uidstr=uidstr+QString::asprintf("%02X", myuid[i]);}ui->lineEdit_uid->setText(uidstr);QMessageBox::information(NULL, "提示", "本次读取的块数超过卡片允许的一次读取最多块数,读取卡片UID:"+uidstr);}else{disperrinf(status);}}
}void MainWindow::on_pb_easywrite_clicked()
{if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在unsigned char status;unsigned char ctrlword=0x00;    //读任何卡,不需指定卡号,读完后不静止该卡,可赋值NEEDSERIAL及NEEDHALT的组合模式,或为0unsigned char afi=0x00;unsigned char myuid[8];unsigned char startblock;unsigned char blocknum;unsigned char piccdatabuf[255];unsigned char eachblocksize;ui->lineEdit_uid->setText("");QString afistr=ui->lineEdit_afi->text().trimmed();if(afistr.length()==2 and checkinput(afistr)){bool ok;afi=afistr.toInt(&ok,16);}else{QMessageBox::critical(NULL, "提示","请输入2位16进制AFI!");return;}startblock=ui->spinBox_star->value();blocknum=ui->spinBox_num->value();if(blocknum>12){QMessageBox::critical(NULL, "提示","一次最多只能写12块数据!");return;}switch(ui->comboBox_cardtype->currentIndex()){case 0:eachblocksize=4;break;case 1:eachblocksize=8;break;default:eachblocksize=32;break;}piccdatabuf[0]=blocknum*eachblocksize;//检测写卡数据QChar ch;QString writinf = ui->plainTextEdit_data->toPlainText().trimmed();QString writinf1 = "";int m = 1;int n = 0;char s;if(writinf.length()<1){QMessageBox::critical(NULL, "提示", "请输入正确的16进制写卡数据!");ui->plainTextEdit_data->setFocus();return;}ch = writinf.at(0);s = writinf.at(0).toLatin1();for(int i=0; i<writinf.length() ; i++){ch = writinf.at(i);s = writinf.at(i).toLatin1();if((('0' <= s) && (s <= '9')) || (('A' <= s) && (s <= 'F')) || (('a' <= s) && (s <= 'f'))){writinf1 += ch;n++;if(n==2){bool ok;piccdatabuf[m++] = writinf1.toInt(&ok,16);writinf1 = "";n = 0;if(m>=49){break;}}}else if(s == ' '){}else{QMessageBox::critical(NULL, "提示", "写卡数据错误,请输入正确的16进制数据!");ui->plainTextEdit_data->setFocus();return;}}if(m<=piccdatabuf[0]){QMessageBox::critical(NULL, "提示", "写卡数据不足,请输入"+QString::asprintf("错误代码:%d", piccdatabuf[0])+"个字节16进制数据!");ui->plainTextEdit_data->setFocus();return;}status = myiso15693writeex(ctrlword,afi,startblock,blocknum,myuid,piccdatabuf);if(status==0){mypcdbeep(30);QString uidstr="";for(int i=0;i<8;i++){uidstr=uidstr+QString::asprintf("%02X", myuid[i]);}ui->lineEdit_uid->setText(uidstr);QMessageBox::information(NULL, "提示", "写卡成功,卡片UID:"+uidstr);}else{if(status==45){QString uidstr="";for(int i=0;i<8;i++){uidstr=uidstr+QString::asprintf("%02X", myuid[i]);}ui->lineEdit_uid->setText(uidstr);QMessageBox::information(NULL, "提示", "每块字节数选错,卡片UID:"+uidstr);}else{disperrinf(status);}}
}void MainWindow::on_pb_search1_clicked()
{if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在unsigned char status;unsigned char flags;unsigned char afi;unsigned char maskuid[8];   //卡号掩码,一般可以不理这个参数unsigned char masklen;unsigned char uid[9];ui->lineEdit_uid->setText("");ui->lineEdit_flags->setText("36");flags=54;QString afistr=ui->lineEdit_afi->text().trimmed();if(afistr.length()==2 and checkinput(afistr)){bool ok;afi=afistr.toInt(&ok,16);}else{QMessageBox::critical(NULL, "提示","请输入2位16进制AFI!");return;}QString masklstr=ui->lineEdit_masklen->text().trimmed();if(masklstr.length()==2 and checkinput(masklstr)){bool ok;masklen=masklstr.toInt(&ok,16);}else{QMessageBox::critical(NULL, "提示","请输入2位16进制掩码长度!");return;}status = myiso15693inventory(flags, afi, masklen, maskuid, uid);if(status==0){mypcdbeep(30);ui->lineEdit_dsfid->setText(QString::asprintf("%02X", uid[0]));QString uidstr="";for(int i=1;i<9;i++){uidstr=uidstr+QString::asprintf("%02X", uid[i]);}ui->lineEdit_uid->setText(uidstr);}else{disperrinf(status);}
}void MainWindow::on_pb_searchall_clicked()
{if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在unsigned char status;unsigned char flags;unsigned char afi;unsigned char maskuid[8];   //卡号掩码,一般可以不理这个参数unsigned char masklen;unsigned char uid[9];unsigned char revlen[1];ui->lineEdit_uid->setText("");ui->comboBox_uid->clear();ui->lineEdit_flags->setText("16");flags=22;QString afistr=ui->lineEdit_afi->text().trimmed();if(afistr.length()==2 and checkinput(afistr)){bool ok;afi=afistr.toInt(&ok,16);}else{QMessageBox::critical(NULL, "提示","请输入2位16进制AFI!");ui->lineEdit_afi->setFocus();return;}QString masklstr=ui->lineEdit_masklen->text().trimmed();if(masklstr.length()==2 and checkinput(masklstr)){bool ok;masklen=masklstr.toInt(&ok,16);}else{QMessageBox::critical(NULL, "提示","请输入2位16进制掩码长度!");return;}status = myiso15693inventory16(flags, afi, masklen, maskuid,revlen, uid);if(status==0){mypcdbeep(30);ui->lineEdit_dsfid->setText(QString::asprintf("%02X", uid[0]));QString uidstr="";for(int i=1;i<9;i++){uidstr=uidstr+QString::asprintf("%02X", uid[i]);}ui->lineEdit_uid->setText(uidstr);//        QStringList strlist;int j=0;while (j<revlen[0]){QString cardinfstr="DSFID:"+QString::asprintf("%02X", uid[j])+",UID:";for (int i=1;i<9;i++){cardinfstr=cardinfstr+QString::asprintf("%02X", uid[j+i]);}
//            strlist.append(cardinfstr);ui->comboBox_uid->addItem(cardinfstr);j=j+9;}
//        model = new QStringListModel(strlist);      //QStringListModel将QStringList包装了起来
//        ui->listView->setModel(model);              //填充到listview
//        ui->listView->setEditTriggers(QAbstractItemView::NoEditTriggers);  //设置item内容不可编辑}else{disperrinf(status);}
}void MainWindow::on_pb_quiet_clicked()
{if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在unsigned char status;unsigned char flags;unsigned char uid[8];ui->lineEdit_flags->setText("22");flags=34;QString uidstr=ui->lineEdit_uid->text().trimmed();if(uidstr.length()==16 and checkinput(uidstr)){bool ok;for(int i=0;i<8;i++){uid[i]=QString(uidstr.mid(i*2,2)).toInt(&ok,16);}}else{QMessageBox::critical(NULL, "提示","请先寻找卡片或输入16位16进制UID!");ui->lineEdit_uid->setFocus();return;}status = myiso15693stayquiet(flags, uid);if(status==0){mypcdbeep(30);QMessageBox::information(NULL, "提示", "操作成功,卡片已静止!");}else{if(status==40){QMessageBox::critical(NULL, "提示","使卡进入静止(Quiet)状态失败!");}else{disperrinf(status);}}
}void MainWindow::on_pb_select_clicked()
{if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在unsigned char status;unsigned char flags;unsigned char uid[8];ui->lineEdit_flags->setText("22");flags=34;QString uidstr=ui->lineEdit_uid->text().trimmed();if(uidstr.length()==16 and checkinput(uidstr)){bool ok;for(int i=0;i<8;i++){uid[i]=QString(uidstr.mid(i*2,2)).toInt(&ok,16);}}else{QMessageBox::critical(NULL, "提示","请先寻找卡片或输入16位16进制UID!");ui->lineEdit_uid->setFocus();return;}status = myiso15693Select(flags, uid);if(status==0){mypcdbeep(30);QMessageBox::information(NULL, "提示", "操作成功,卡片已在选中状态!");}else{if(status==41){QMessageBox::critical(NULL, "提示","使卡进入选中状态失败!");}else{disperrinf(status);}}
}void MainWindow::on_pb_restare_clicked()
{if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在unsigned char status;unsigned char flags;unsigned char uid[8];ui->lineEdit_flags->setText("22");flags=34;QString uidstr=ui->lineEdit_uid->text().trimmed();if(uidstr.length()==16 and checkinput(uidstr)){bool ok;for(int i=0;i<8;i++){uid[i]=QString(uidstr.mid(i*2,2)).toInt(&ok,16);}}else{QMessageBox::critical(NULL, "提示","请先寻找卡片或输入16位16进制UID!");ui->lineEdit_uid->setFocus();return;}status = myiso15693resettoready(flags, uid);if(status==0){mypcdbeep(30);QMessageBox::information(NULL, "提示", "操作成功,卡片已从静止中重起到准备状态!");}else{if(status==42){QMessageBox::critical(NULL, "提示","让卡从静止中重起准备失败!");}else{disperrinf(status);}}
}void MainWindow::on_pb_afi_clicked()
{if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在unsigned char status;unsigned char flags;unsigned char afi;unsigned char uid[8];ui->lineEdit_flags->setText("22");flags=34;QString afistr=ui->lineEdit_afi->text().trimmed();if(afistr.length()==2 and checkinput(afistr)){bool ok;afi=afistr.toInt(&ok,16);}else{QMessageBox::critical(NULL, "提示","请输入2位16进制AFI!");ui->lineEdit_afi->setFocus();return;}QString uidstr=ui->lineEdit_uid->text().trimmed();if(uidstr.length()==16 and checkinput(uidstr)){bool ok;for(int i=0;i<8;i++){uid[i]=QString(uidstr.mid(i*2,2)).toInt(&ok,16);}}else{QMessageBox::critical(NULL, "提示","请先寻找卡片或输入16位16进制UID!");ui->lineEdit_uid->setFocus();return;}status = myiso15693writeafi(flags, afi,uid);if(status==0){mypcdbeep(30);QMessageBox::information(NULL, "提示", "写AIF操作成功!");}else{if(status==46){QMessageBox::critical(NULL, "提示","写AIF操作失败!");}else{disperrinf(status);}}
}void MainWindow::on_pb_dsfid_clicked()
{if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在unsigned char status;unsigned char flags;unsigned char dsfid;unsigned char uid[8];ui->lineEdit_flags->setText("22");flags=34;QString dsfidstr=ui->lineEdit_dsfid->text().trimmed();if(dsfidstr.length()==2 and checkinput(dsfidstr)){bool ok;dsfid=dsfidstr.toInt(&ok,16);}else{QMessageBox::critical(NULL, "提示","请输入2位16进制dsfid!");ui->lineEdit_dsfid->setFocus();return;}QString uidstr=ui->lineEdit_uid->text().trimmed();if(uidstr.length()==16 and checkinput(uidstr)){bool ok;for(int i=0;i<8;i++){uid[i]=QString(uidstr.mid(i*2,2)).toInt(&ok,16);}}else{QMessageBox::critical(NULL, "提示","请先寻找卡片或输入16位16进制UID!");ui->lineEdit_uid->setFocus();return;}status = myiso15693writedsfid(flags, dsfid,uid);if(status==0){mypcdbeep(30);QMessageBox::information(NULL, "提示", "写DSFID操作成功!");}else{if(status==41){QMessageBox::critical(NULL, "提示","写DSFID操作失败!");}else{disperrinf(status);}}
}void MainWindow::on_pb_systeminf_clicked()
{if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在unsigned char status;unsigned char flags;unsigned char uid[8];unsigned char revlen[1];unsigned char revbuf[255];ui->plainTextEdit_data->setPlainText("");ui->lineEdit_flags->setText("22");flags=34;QString uidstr=ui->lineEdit_uid->text().trimmed();if(uidstr.length()==16 and checkinput(uidstr)){bool ok;for(int i=0;i<8;i++){uid[i]=QString(uidstr.mid(i*2,2)).toInt(&ok,16);}}else{QMessageBox::critical(NULL, "提示","请先寻找卡片或输入16位16进制UID!");ui->lineEdit_uid->setFocus();return;}status = myiso15693readinfo(flags, uid,revlen,revbuf);if(status==0){mypcdbeep(30);int j=0;QString cardinfstr="";while (j<revlen[0]){cardinfstr=cardinfstr+QString::asprintf("%02X ", revbuf[j]);j++;}ui->plainTextEdit_data->setPlainText(cardinfstr);QMessageBox::information(NULL, "提示", "读取卡片系统信息成功!");}else{disperrinf(status);}
}void MainWindow::on_pb_secure_clicked()
{if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在unsigned char status;unsigned char flags;unsigned char startblock;unsigned char blocknum;unsigned char uid[8];unsigned char revlen[1];unsigned char revbuf[255];ui->plainTextEdit_data->setPlainText("");ui->lineEdit_flags->setText("22");flags=34;startblock=ui->spinBox_star->value();blocknum=ui->spinBox_num->value();QString uidstr=ui->lineEdit_uid->text().trimmed();if(uidstr.length()==16 and checkinput(uidstr)){bool ok;for(int i=0;i<8;i++){uid[i]=QString(uidstr.mid(i*2,2)).toInt(&ok,16);}}else{QMessageBox::critical(NULL, "提示","请先寻找卡片或输入16位16进制UID!");ui->lineEdit_uid->setFocus();return;}status = myiso15693readsecuritystate(flags, startblock,blocknum,uid,revlen,revbuf);if(status==0){mypcdbeep(30);int j=0;QString cardinfstr="";while (j<revlen[0]){cardinfstr=cardinfstr+QString::asprintf("%02X ", revbuf[j]);j++;}ui->plainTextEdit_data->setPlainText(cardinfstr);QMessageBox::information(NULL, "提示", "读取卡片系统信息成功!");}else{disperrinf(status);}
}void MainWindow::on_pb_lockafi_clicked()
{if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在int answ=QMessageBox::question (this, "警告", "你确定要锁定卡片的AFI吗 ?锁定后不可以再次修改!", QMessageBox::Ok, QMessageBox::Cancel);if (answ ==1024){unsigned char status;unsigned char flags;unsigned char uid[8];ui->lineEdit_flags->setText("22");flags=34;QString uidstr=ui->lineEdit_uid->text().trimmed();if(uidstr.length()==16 and checkinput(uidstr)){bool ok;for(int i=0;i<8;i++){uid[i]=QString(uidstr.mid(i*2,2)).toInt(&ok,16);}}else{QMessageBox::critical(NULL, "提示","请先寻找卡片或输入16位16进制UID!");ui->lineEdit_uid->setFocus();return;}status = myiso15693lockafi(flags, uid);if(status==0){mypcdbeep(30);QMessageBox::information(NULL, "提示", "锁AFI操作成功!");}else{disperrinf(status);}}
}void MainWindow::on_pb_lockdsfid_clicked()
{if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在int answ=QMessageBox::question (this, "警告", "你确定要锁定卡片的DSFID吗 ?锁定后不可以再次修改!", QMessageBox::Ok, QMessageBox::Cancel);if (answ ==1024){unsigned char status;unsigned char flags;unsigned char uid[8];ui->lineEdit_flags->setText("22");flags=34;QString uidstr=ui->lineEdit_uid->text().trimmed();if(uidstr.length()==16 and checkinput(uidstr)){bool ok;for(int i=0;i<8;i++){uid[i]=QString(uidstr.mid(i*2,2)).toInt(&ok,16);}}else{QMessageBox::critical(NULL, "提示","请先寻找卡片或输入16位16进制UID!");ui->lineEdit_uid->setFocus();return;}status = myiso15693lockdsfid(flags, uid);if(status==0){mypcdbeep(30);QMessageBox::information(NULL, "提示", "数据存储格式标识DSFID锁定成功!");}else{disperrinf(status);}}
}void MainWindow::on_pb_lockdata_clicked()
{if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在int answ=QMessageBox::question (this, "警告", "你确定要锁定卡片的数据块吗 ?锁定后不可以再次修改!", QMessageBox::Ok, QMessageBox::Cancel);if (answ ==1024){unsigned char status;unsigned char flags;unsigned char startblock;unsigned char uid[8];ui->lineEdit_flags->setText("22");flags=34;startblock=ui->spinBox_star->value();QString uidstr=ui->lineEdit_uid->text().trimmed();if(uidstr.length()==16 and checkinput(uidstr)){bool ok;for(int i=0;i<8;i++){uid[i]=QString(uidstr.mid(i*2,2)).toInt(&ok,16);}}else{QMessageBox::critical(NULL, "提示","请先寻找卡片或输入16位16进制UID!");ui->lineEdit_uid->setFocus();return;}status = myiso15693lockblock(flags,startblock, uid);if(status==0){mypcdbeep(30);QMessageBox::information(NULL, "提示", "数据块锁定成功!");}else{disperrinf(status);}}
}void MainWindow::on_pb_read_clicked()
{if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在unsigned char status;unsigned char flags;unsigned char startblock;unsigned char blocknum;unsigned char uid[8];unsigned char revlen[1];unsigned char revbuf[255];ui->plainTextEdit_data->setPlainText("");ui->lineEdit_flags->setText("22");flags=34;startblock=ui->spinBox_star->value();blocknum=startblock+ui->spinBox_num->value();QString uidstr=ui->lineEdit_uid->text().trimmed();if(uidstr.length()==16 and checkinput(uidstr)){bool ok;for(int i=0;i<8;i++){uid[i]=QString(uidstr.mid(i*2,2)).toInt(&ok,16);}}else{QMessageBox::critical(NULL, "提示","请先寻找卡片或输入16位16进制UID!");ui->lineEdit_uid->setFocus();return;}QString blockdata="";while (startblock<blocknum){status = myiso15693readblock(flags, startblock, 1, uid, revlen, revbuf);if(status==0){int j=0;while(j<revlen[0]){blockdata=blockdata+QString::asprintf("%02X ", revbuf[j]);j++;}startblock++;}else{blocknum=startblock-1;}}if(startblock==blocknum){mypcdbeep(30);ui->plainTextEdit_data->setPlainText(blockdata);QMessageBox::information(NULL, "提示", "读卡成功,卡片UID:"+uidstr);}else{QMessageBox::critical(NULL, "提示",QString::asprintf("在读取第 :%d", startblock)+",块时返回错误代码:"+QString::asprintf("%d", status));}}void MainWindow::on_pb_write_clicked()
{if(!checkdllos()){return;}      //判断运行目录内动态库文件是否存在unsigned char status;unsigned char flags;unsigned char eachblocksize;unsigned char startblock;unsigned char blocknum;unsigned char uid[8];unsigned char writebuf[2000];int writelen;ui->lineEdit_flags->setText("22");flags=34;startblock=ui->spinBox_star->value();blocknum=startblock+ui->spinBox_num->value();switch(ui->comboBox_cardtype->currentIndex()){case 0:eachblocksize=4;break;case 1:eachblocksize=8;break;default:eachblocksize=32;break;}writelen=blocknum*eachblocksize;QString uidstr=ui->lineEdit_uid->text().trimmed();if(uidstr.length()==16 and checkinput(uidstr)){bool ok;for(int i=0;i<8;i++){uid[i]=QString(uidstr.mid(i*2,2)).toInt(&ok,16);}}else{QMessageBox::critical(NULL, "提示","请先寻找卡片或输入16位16进制UID!");ui->lineEdit_uid->setFocus();return;}for(int i=0;i<2000;i++){writebuf[i]=0x00;}//检测写卡数据QChar ch;QString writinf = ui->plainTextEdit_data->toPlainText().trimmed();QString writinf1 = "";int m = 0;int n = 0;char s;if(writinf.length()<1){QMessageBox::critical(NULL, "提示", "请输入正确的16进制写卡数据!");ui->plainTextEdit_data->setFocus();return;}ch = writinf.at(0);s = writinf.at(0).toLatin1();for(int i=0; i<writinf.length() ; i++){ch = writinf.at(i);s = writinf.at(i).toLatin1();if((('0' <= s) && (s <= '9')) || (('A' <= s) && (s <= 'F')) || (('a' <= s) && (s <= 'f'))){writinf1 += ch;n++;if(n==2){bool ok;writebuf[m++] = writinf1.toInt(&ok,16);writinf1 = "";n = 0;}}else if(s == ' '){}else{QMessageBox::critical(NULL, "提示", "写卡数据错误,请输入正确的16进制数据!");ui->plainTextEdit_data->setFocus();return;}}int i=0;while (startblock<blocknum){unsigned char wbuf[eachblocksize];for(int j=0;j<eachblocksize;j++){wbuf[j]=writebuf[i+j];}status = myiso15693writeblock(flags, startblock, 1, uid, eachblocksize, wbuf);if(status==0){startblock=startblock+1;i=i+eachblocksize;}else{blocknum=startblock-1;}}if(startblock==blocknum){mypcdbeep(30);QMessageBox::information(NULL, "提示", "写卡成功,卡片UID:"+uidstr);}else{QMessageBox::critical(NULL, "提示",QString::asprintf("在写第 :%d", startblock)+",块时返回错误代码:"+QString::asprintf("%d", status));}
}void MainWindow::on_pb_writeUid_clicked()
{if(!checkdllos()){return;}       //判断运行目录内动态库文件是否存在unsigned char status;unsigned char ctrlword=0x00;    //读任何卡,不需指定卡号,读完后不静止该卡,可赋值NEEDSERIAL及NEEDHALT的组合模式,或为0unsigned char afi=0x00;unsigned char olduid[8];unsigned char newuid[8];QString afistr=ui->lineEdit_afi->text().trimmed();if(afistr.length()==2 and checkinput(afistr)){bool ok;afi=afistr.toInt(&ok,16);}else{QMessageBox::critical(NULL, "提示","请输入2位16进制AFI!");ui->lineEdit_afi->setFocus();return;}QString uidstr=ui->lineEdit_uid->text().trimmed();if(uidstr.length()==16 and checkinput(uidstr)){for(int i=0;i<9;i++){bool ok;newuid[i]=QString(uidstr.mid(i*2,2)).toInt(&ok,16);}}else{QMessageBox::critical(NULL, "提示","请输入16位16进制UID!");ui->lineEdit_uid->setFocus();return;}if(myiso15693writeuid!=NULL){status = myiso15693writeuid(ctrlword,afi,olduid,newuid);if(status==0){mypcdbeep(30);QMessageBox::information(NULL, "提示", "写卡成功,卡片UID:"+uidstr);}else{if(status==45){QMessageBox::critical(NULL, "提示", "写UID失败,此卡UID不可以改写!");}else{disperrinf(status);}}}else{QMessageBox::critical(NULL, "提示", "myiso15693writeuid函数未正确载入!");}
}

相关文章:

USB免驱IC读写器QT小程序开发

USB免驱全协议IC卡读写器QT小程序开发&#xff0c;读取15693卡。 QT小程序UI开发界面&#xff1a; QT程序代码mainWindow.cpp代码如下&#xff1a; MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this); }MainWind…...

OSCP靶场训练冒险之kioprix4:shell逃逸以及利用数据库提权

声明&#xff01; 学习资源来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…...

NIPS2014 | GAN: 生成对抗网络

Generative Adversarial Nets 摘要-Abstract引言-Introduction相关工作-Related Work对抗网络-Adversarial Nets理论结果-Theoretical Results实验-Experiments优势和不足-Advantages and disadvantages缺点优点 结论及未来工作-Conclusions and future work研究总结未来研究方…...

Postman接口测试01|接口测试基础概念、http协议、RESTful风格、接口文档

目录 一、接口测试基础概念 1、什么是接口 2、接口的类型 3、什么是接口测试 4、为什么要做接口测试 5、接口测试的实现方式 6、什么是自动化接口测试&#xff1f; 二、接口返回的数据格式 1、三种格式 2、Json 三、接口协议 1、webservice协议 2、dubbo协议 3、…...

Linux系统编程——详解页表

目录 一、前言 二、深入理解页表 三、页表的实际组成 四、总结&#xff1a; 一、前言 页表是我们之前在讲到程序地址空间的时候说到的&#xff0c;它是物理内存到进程程序地址空间的一个桥梁&#xff0c;通过它物理内存的数据和代码才能映射到进程的程序地址空间中&#xff…...

SpringBoot + HttpSession 自定义生成sessionId

SpringBoot HttpSession 自定义生成sessionId 业务场景实现方案 业务场景 最近在做用户登录过程中&#xff0c;由于默认ID是通过UUID创建的&#xff0c;缺乏足够的安全性&#xff0c;决定要自定义生成 sessionId。 实现方案 正常的获取session方法如下&#xff1a; HttpSe…...

循环对称复高斯分布(Circularly Symmetric Complex Gaussian Distribution)

一、引言 循环对称复高斯分布&#xff08;Circularly Symmetric Complex Gaussian Distribution&#xff0c;简称CSCG&#xff09;在无线通信、信号处理等领域具有广泛的应用。作为一种特殊的复高斯分布&#xff0c;CSCG具有独特的性质&#xff0c;如循环对称性、高斯性等&…...

xinput1_3.dll放在哪里?当xinput1_3.dll丢失时的应对策略:详细解决方法汇总

在计算机系统的运行过程中&#xff0c;我们偶尔会遇到一些令人困扰的问题&#xff0c;其中xinput1_3.dll文件丢失就是较为常见的一种情况。这个看似不起眼的动态链接库文件&#xff0c;实则在许多软件和游戏的正常运行中发挥着至关重要的作用。一旦它丢失&#xff0c;可能会导致…...

基于STM32的智能家居环境监控系统设计

目录 引言系统设计 硬件设计软件设计系统功能模块 环境监控模块控制模块显示模块系统实现 硬件实现软件实现系统调试与优化结论与展望 1. 引言 随着智能家居技术的发展&#xff0c;环境监控系统已经成为家居管理的重要组成部分。智能家居环境监控系统通过实时监测室内温度、湿…...

Vscode + gdbserver远程调试开发板指南:

本章目录 步骤环境准备网络配置vscode配置步骤 (全图示例)开发板配置开始调试注意: 每次断开之后&#xff0c;开发板都需要重新启动gdbserver才可调试。 参考链接: 步骤 环境准备 将交叉编译链路径加入$PATH变量&#xff1a;确保系统能够找到所需的工具。 export PATH$PATH:/p…...

大表:适用于结构化数据的分布式存储系统

大家觉得有意义和帮助记得及时关注和点赞!!! 译者序摘要1 引言2 数据模型 2.1 行&#xff08;Row&#xff09;2.2 Column Families&#xff08;列族&#xff09; 2.2.1 设计2.2.2 column key 的格式&#xff1a;family:qualifier2.2.3 访问控制和磁盘/内存记账&#xff08;acco…...

深入解析MVCC中Undo Log版本底层存储读取逻辑

一、引言 多版本并发控制&#xff08;MVCC&#xff0c;Multi-Version Concurrency Control&#xff09;是一种广泛应用于关系数据库管理系统中的并发控制技术。它通过保存数据的历史版本&#xff0c;使得在事务并发执行时&#xff0c;每个事务都能看到数据的一致性视图。在MVC…...

游戏引擎学习第64天

代码改的我看的比较懵 原视频可以去这个网站去看 https://guide.handmadehero.org/ 回顾我们在模拟区域方面的进展 在目前的情况下&#xff0c;如果有很多任务需要完成&#xff0c;可以进行分解。在昨天收到的改变中&#xff0c;决定将任务分解成模拟区域。模拟区域是可以随时…...

Effective C++ 条款33:避免遮掩继承而来的名称

文章目录 条款33&#xff1a;避免遮掩继承而来的名称为什么避免遮掩&#xff1f;如何避免遮掩&#xff1f;1. 使用 using 声明式2. 使用转交函数 (Forwarding Functions) 总结 条款33&#xff1a;避免遮掩继承而来的名称 在 C 中&#xff0c;派生类&#xff08;derived class&…...

UEFI Spec 学习笔记---4 - EFI System Table(1)

4 - EFI System Table 本章节主要介绍的是 UEFI Image 的 Entry point&#xff08;在 UEFI 固件执行的时候&#xff0c;都是直接调用入口函数并且执行从而调用其他的 driver&#xff09;。 UEFI Image 主要是有三类&#xff1a;UEFI boot service driver、UEFI runtime drive…...

【微信小程序】3|首页搜索框 | 我的咖啡店-综合实训

首页-搜索框-跳转 引言 在微信小程序中&#xff0c;首页的搜索框是用户交互的重要入口。本文将通过“我的咖啡店”小程序的首页搜索框实现&#xff0c;详细介绍如何在微信小程序中创建和处理搜索框的交互。 1. 搜索函数实现 onClickInput函数在用户点击搜索框时触发&#x…...

独一无二,万字详谈——Linux之文件管理

Linux文件部分的学习&#xff0c;有这一篇的博客足矣! 目录 一、文件的命名规则 1、可以使用哪些字符&#xff1f; 2、文件名的长度 3、Linux文件名的大小写 4、Linux文件扩展名 二、文件管理命令 1、目录的创建/删除 &#xff08;1&#xff09;、目录的创建 ① mkdir…...

React:前端开发领域的璀璨之星

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、Java 与 Python 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在未来…...

C/C++ 数据结构与算法【哈夫曼树】 哈夫曼树详细解析【日常学习,考研必备】带图+详细代码

哈夫曼树&#xff08;最优二叉树&#xff09; 1&#xff09;基础概念 **路径&#xff1a;**从树中一个结点到另一个结点之间的分支构成这两个结点间的路径。 **结点的路径长度&#xff1a;**两结点间路径上的分支数。 **树的路径长度&#xff1a;**从树根到每一个结点的路径…...

基于NodeMCU的物联网窗帘控制系统设计

最终效果 基于NodeMCU的物联网窗帘控制系统设计 项目介绍 该项目是“物联网实验室监测控制系统设计&#xff08;仿智能家居&#xff09;”项目中的“家电控制设计”中的“窗帘控制”子项目&#xff0c;最前者还包括“物联网设计”、“环境监测设计”、“门禁系统设计计”和“小…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...