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小程序开发,读取15693卡。 QT小程序UI开发界面: QT程序代码mainWindow.cpp代码如下: MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this); }MainWind…...

OSCP靶场训练冒险之kioprix4:shell逃逸以及利用数据库提权
声明! 学习资源来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽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、什么是自动化接口测试? 二、接口返回的数据格式 1、三种格式 2、Json 三、接口协议 1、webservice协议 2、dubbo协议 3、…...

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

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

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

xinput1_3.dll放在哪里?当xinput1_3.dll丢失时的应对策略:详细解决方法汇总
在计算机系统的运行过程中,我们偶尔会遇到一些令人困扰的问题,其中xinput1_3.dll文件丢失就是较为常见的一种情况。这个看似不起眼的动态链接库文件,实则在许多软件和游戏的正常运行中发挥着至关重要的作用。一旦它丢失,可能会导致…...

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

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

大表:适用于结构化数据的分布式存储系统
大家觉得有意义和帮助记得及时关注和点赞!!! 译者序摘要1 引言2 数据模型 2.1 行(Row)2.2 Column Families(列族) 2.2.1 设计2.2.2 column key 的格式:family:qualifier2.2.3 访问控制和磁盘/内存记账(acco…...
深入解析MVCC中Undo Log版本底层存储读取逻辑
一、引言 多版本并发控制(MVCC,Multi-Version Concurrency Control)是一种广泛应用于关系数据库管理系统中的并发控制技术。它通过保存数据的历史版本,使得在事务并发执行时,每个事务都能看到数据的一致性视图。在MVC…...

游戏引擎学习第64天
代码改的我看的比较懵 原视频可以去这个网站去看 https://guide.handmadehero.org/ 回顾我们在模拟区域方面的进展 在目前的情况下,如果有很多任务需要完成,可以进行分解。在昨天收到的改变中,决定将任务分解成模拟区域。模拟区域是可以随时…...
Effective C++ 条款33:避免遮掩继承而来的名称
文章目录 条款33:避免遮掩继承而来的名称为什么避免遮掩?如何避免遮掩?1. 使用 using 声明式2. 使用转交函数 (Forwarding Functions) 总结 条款33:避免遮掩继承而来的名称 在 C 中,派生类(derived class&…...
UEFI Spec 学习笔记---4 - EFI System Table(1)
4 - EFI System Table 本章节主要介绍的是 UEFI Image 的 Entry point(在 UEFI 固件执行的时候,都是直接调用入口函数并且执行从而调用其他的 driver)。 UEFI Image 主要是有三类:UEFI boot service driver、UEFI runtime drive…...

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

独一无二,万字详谈——Linux之文件管理
Linux文件部分的学习,有这一篇的博客足矣! 目录 一、文件的命名规则 1、可以使用哪些字符? 2、文件名的长度 3、Linux文件名的大小写 4、Linux文件扩展名 二、文件管理命令 1、目录的创建/删除 (1)、目录的创建 ① mkdir…...
React:前端开发领域的璀璨之星
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、Java 与 Python 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在未来…...

C/C++ 数据结构与算法【哈夫曼树】 哈夫曼树详细解析【日常学习,考研必备】带图+详细代码
哈夫曼树(最优二叉树) 1)基础概念 **路径:**从树中一个结点到另一个结点之间的分支构成这两个结点间的路径。 **结点的路径长度:**两结点间路径上的分支数。 **树的路径长度:**从树根到每一个结点的路径…...

基于NodeMCU的物联网窗帘控制系统设计
最终效果 基于NodeMCU的物联网窗帘控制系统设计 项目介绍 该项目是“物联网实验室监测控制系统设计(仿智能家居)”项目中的“家电控制设计”中的“窗帘控制”子项目,最前者还包括“物联网设计”、“环境监测设计”、“门禁系统设计计”和“小…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...