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…...
Wend看源码-Java-集合学习(List)
摘要 本篇文章深入探讨了基于JDK 21版本的Java.util包中提供的多样化集合类型。在Java中集合共分类为三种数据结构:List、Set和Queue。本文将详细阐述这些数据类型的各自实现,并按照线程安全性进行分类,分别介绍非线程安全与线程安全的实现方…...
只谈C++11新特性 - 删除函数
删除函数 背景 在 C11 之前,C 的类默认会生成拷贝构造函数和赋值运算符。这在某些情况下会引发问题,尤其是在我们希望明确禁止某些操作时。假设我们有一个类,它不希望被拷贝,但未明确声明拷贝构造函数和赋值运算符,这…...
uniapp 文本转语音
uniapp 文本转语音 基于 Minimax API 的 UniApp 文本转语音工具,支持文本分段、队列播放、暂停恢复等功能。目前只内置了 Minimax文本转语音Minimax 的语音生成技术以其自然、情感丰富和实时性强而著称 API_KEY、GroupId 获取方法 https://platform.minimaxi.com…...
1.RPC基本原理
文章目录 RPC1.定义2.概念3.优缺点4.RPC结构5.RPC消息协议5.1 消息边界5.2 内容5.3 压缩 6.RPC的实现6.1 divide_protocol.py6.2 server.py6.3 client.py RPC 1.定义 远程过程调用(remote procedure call) 2.概念 广义:所有通过网络进行通讯,的调用统称为RPC调用 狭义:不采…...
如何从 0 到 1 ,打造全新一代分布式数据架构
导读:本文从 DIKW(数据、信息、知识、智慧) 模型视角出发,探讨数字世界中数据的重要性问题。接着站在业务视角,讨论了在不断满足业务诉求(特别是 AI 需求)的过程中,数据系统是如何一…...
PyPika:Python SQL 查询构建器
什么是 PyPika? Pypika 是一个 Python 库,用于构建 SQL 查询。它提供了一种简洁、直观的方式来生成 SQL 语句,而无需手动编写复杂的 SQL 代码。Pypika 的设计哲学是尽可能地接近 SQL 的自然语法,同时利用 Python 的强大功能来简化…...
剑指Offer|LCR 014. 字符串的排列
LCR 014. 字符串的排列 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的某个变位词。 换句话说,第一个字符串的排列之一是第二个字符串的 子串 。 示例 1: 输入: s1 "ab" s2 "eidbaooo" 输出: True 解…...
通过百度api处理交通数据
通过百度api处理交通数据 1、读取excel获取道路数据 //道路名称Data EqualsAndHashCode public class RoadName {ExcelProperty("Name")private String name; }/*** 获取excel中的道路名称*/private static List<String> getRoadName() {// 定义文件路径&…...
使用亚马逊针对 PyTorch 和 MinIO 的 S3 连接器实现可迭代式数据集
2023 年 11 月,Amazon 宣布推出适用于 PyTorch 的 S3 连接器。适用于 PyTorch 的 Amazon S3 连接器提供了专为 S3 对象存储构建的 PyTorch 数据集基元(数据集和数据加载器)的实现。它支持用于随机数据访问模式的地图样式数据集和用于流式处理…...
c++编译过程初识
编译过程 预处理:主要是执行一些预处理指令,主要是#开头的代码,如#include 的头文件、#define 定义的宏常量、#ifdef #ifndef #endif等条件编译的代码,具体包括查找头文件、进行宏替换、根据条件编译等操作。 g -E example.cpp -…...
Java旅程(五)Spring 框架与微服务架构 了解 JVM 内部原理和调优
在现代企业级应用中,Spring 框架和微服务架构已经成为主流技术,而 Java 虚拟机(JVM)的理解和调优对于保证应用的高性能和稳定性也至关重要。本篇博客将深入讲解 Spring 框架与微服务架构,并进一步探讨 JVM 内部原理和调…...
SWAT-MODFLOW地表水-地下水耦合模型建模;QSWATMOD实现SWAT-MODFLOW联合
SWAT-MODFLOW地表水-地下水耦合建模的应用重要性: 1.全面性:耦合模型能够同时考虑地表水和地下水的相互作用,提供了一个更全面的水文循环模拟框架。2.准确性:通过耦合地表水和地下水模型,可以提高水文模拟的准确性&…...
Azure Function 解决跨域问题
这边前端call本地部署的azure function出现了跨域问题,搜索一下解决方案 直接修改local.setting.json,在其中添加CORS配置为通配符”*”,就行了 local.settings.json {"IsEncrypted": false,"Values": {"PYTHON_E…...
金融租赁系统的创新发展与市场竞争力提升探讨
内容概要 随着经济的快速发展,金融租赁系统逐渐成为金融市场中不可或缺的一环。它不仅提供了灵活的资金解决方案,还促进了企业的资本结构优化与资源配置效率。因此,了解该系统的市场背景与发展现状至关重要。 在现今环境下,新兴…...
Rust: offset祼指针操作
offset是偏移元素个数,不是字节数! fn main(){let student_a Student{id:20240001,name:"张三娃".into(),class_id:3,age:14,grade:1};let student_b Student{id:20240002,name:"李四牛".into(),class_id:3,age:15,grade:1};let …...
【C#】WPF设置Separator为垂直方向
1. 方法1 <Separator BorderBrush"Gray"><Separator.LayoutTransform><RotateTransform Angle"90" /></Separator.LayoutTransform> </Separator>2. 方法2 <Separator Style"{StaticResource {x:Static ToolBar.S…...
常见的限流算法
常见的限流算法 限流的定义固定窗口算法滑动窗口算法漏桶算法(推荐)令牌桶算法(推荐)限流粒度本地限流(单机限流)分布式限流(多机限流)分布式限流的实现 限流的定义 限流,也称流量控制。是指系统…...
图文教程:使用PowerDesigner导出数据库表结构为Word/Html文档
1、第一种情况-无数据库表,但有数据模型 1.1 使用PowerDesigner已完成数据建模 您已经使用PowerDesigner完成数据库建模,如下图: 1.2 Report配置和导出 1、点击:Report->Reports,如下图: 2、点击&…...
7-7 旅行售货员
目录 题目描述 输入格式: 输出格式: 输入样例: 输出样例: 解题思路: 详细代码: 题目描述 某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费)。他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路…...
QT写的动态正弦曲线图显示并打印
创建一个显示正弦曲线的 QChartView,并通过定时器不断更新图表数据,模拟动态数据。此外,还包含了一个在特定时间自动将图表导出为 PDF 文件的功能。 代码分析和注释 #include <QApplication> #include <QMainWindow> #include &…...
AI开发:决策树模型概述与实现:从训练到评估和可视化 - Python
通过前面的一些练习,我们已经学习了支持向量机、 回归、 鸢尾花模型 、卷积、 知识图谱、 生成式对抗网络、 K近邻、 等AI算法的基本概念,熟悉了一些常用的AI库,并且使用PYTHON大法进行了一些实战练习。接下来,我们向更深一层的概…...
MySQL 性能瓶颈,为什么 MySQL 表的数据量不能太大?
MySQL的性能瓶颈(为什么MySQL有几万的qps,怎么来的?性能分析 为什么 MySQL 表不能太大网上大部分人的说法:问题的关键: B树层数对查询性能的影响到底有多大? 是什么导致的 MySQL 查询缓慢?如何解决: MySQL的性能瓶颈(为什么MySQL有几万的qps,怎么来的? 一个全表扫描的查询…...
Vue中接入萤石等直播视频(更新中ing)
一、萤石: 1. 萤石云开发文档: https://open.ys7.com/help/31 2、安装: npm install ezuikit-js --save 3、在文件中引用:import EZUIKit from ezuikit-js 4、具体代码: 获取accessToken:https://open.…...
25 go语言(golang) - 内存分配机制原理
Go 语言的内存分配机制是一个复杂且高效的系统,旨在为程序提供快速和安全的内存管理。理解 Go 的内存分配有助于编写更高效的代码,并优化程序性能。 一、内存区域 栈(Stack) 栈用于函数调用时的临时变量分配。栈上的内存在函数返…...
【Linux命令】ps -a 和 ps -ef 的区别
ps -a 和 ps -ef 是 ps(process status)命令的不同选项,它们用于显示不同的进程信息。以下是这两个选项的主要区别: ps -a -a 选项表示显示所有拥有终端的进程,但不包括守护进程(daemon processes&#x…...
几个支持用户名密码的代理链工具: glider, gost, proxychains+microsocks
几个支持用户名密码的代理链工具: glider, gost, proxychainsmicrosocks gost -L:7777 -Fsocks5://192.168.2.20:7575 -Fsocks5://user:passwd1.1.1.1:10086 -Dgost:(https://github.com/ginuerzh/gost) 参考 https://www.quakemachinex.com/blog/279.html...
编译安装教程
编译教程 下面是一个完整的从源码编译安装软件的教程,涵盖了从环境准备到配置、编译、安装的所有可能会用到的步骤和细节,适用于各种类型的软件包。 一、环境准备 在开始编译源码之前,确保系统满足以下条件: 1. 安装必要工具 …...
计算机网络-物理层
1.1传输媒体: 导引型传输媒体:双绞线,同轴电缆,光纤 非导引型传输媒体:微波通信(2~40GHz) 1.2传输方式: 串行传输:一个接一个的依次传输 并行传输:一次发送n…...
缓存管理自动化:JuiceFS 企业版 Cache Group Operator 新特性发布
近期,JuiceFS 企业版推出了 Cache Group Operator,用于自动化创建和管理缓存组集群。Operator 是一种简化 Kubernetes 应用管理的工具,它能够自动化应用程序的生命周期管理任务,使部署、扩展和运维更加高效。 在推出 Operator 之前…...
Linux应用软件编程-多任务处理(线程)
线程:轻量级的进程,线程的栈区独立(8M),与同一进程中的其他线程共用进程的堆区,数据区,文本区。 进程是操作系统资源分配的最小单位;线程是cpu任务调度的最小单位。 1. 线程的创建…...
MySql索引(基础篇)
后面也会持续更新,学到新东西会在其中补充。 建议按顺序食用,欢迎批评或者交流! 缺什么东西欢迎评论!我都会及时修改的! 感谢各位大佬写的文章让我学到很多东西!只是在各位大佬的基础加了我自己的思路&a…...
手机发烫怎么解决?
在当今这个智能手机不离手的时代,手机发烫成了不少人头疼的问题。手机发烫不仅影响使用手感,长期过热还可能损害手机硬件、缩短电池寿命,甚至引发安全隐患。不过别担心,下面这些方法能帮你有效给手机 “降温”。 一、使用习惯方面…...
Java实现观察者模式
一、前言 观察者模式,又称为发布订阅模式,是一种行为设置模式,允许对象之间建立一对多的依赖关系,这样当一个对象状态改变时,它的所有依赖者(观察者)都会收到通知并自动更新。 二、具体实现 …...
OpenResty开发环境搭建
简介 OpenResty 是一个基于 Nginx的高性能 Web 平台,用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。官方地址:http://openresty.org/cn/ 具备下列特点: 具备Nginx的完整功能基于Lua语言进行扩展&#…...
鸿蒙系统文件管理基础服务的设计背景和设计目标
有一定经验的开发者通常对文件管理相关的api应用或者底层逻辑都比较熟悉,但是关于文件管理服务的设计背景和设计目标可能了解得不那么清楚,本文旨在分享文件管理服务的设计背景及目标,方便广大开发者更好地理解鸿蒙系统文件管理服务。 1 鸿蒙…...
Elasticsearch-脚本查询
脚本查询 概念 Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能,ES支持多种脚本语言,如painless,其语法类似于Java,也有注释、关键字、类型、变量、函数等,其就要相对于其他脚本高出几倍的性…...
【蓝桥杯——物联网设计与开发】拓展模块4 - 脉冲模块
目录 一、脉冲模块 (1)资源介绍 🔅原理图 🔅采集原理 (2)STM32CubeMX 软件配置 (3)代码编写 (4)实验现象 二、脉冲模块接口函数封装 三、踩坑日记 &a…...
devops和ICCID简介
Devops DevOps(Development 和 Operations 的组合)是一种软件开发和 IT 运维的哲学,旨在促进开发、技术运营和质量保障(QA)部门之间的沟通、协作与整合。它强调自动化流程,持续集成(CI…...
uniapp使用live-pusher实现模拟人脸识别效果
需求: 1、前端实现模拟用户人脸识别,识别成功后抓取视频流或认证的一张静态图给服务端。 2、服务端调用第三方活体认证接口,验证前端传递的人脸是否存在,把认证结果反馈给前端。 3、前端根据服务端返回的状态,显示在…...
OSI 网络 7 层模型
问: 请你介绍一下OSI七层网络模型物理层解决什么问题?功能原理问题 数据链路层解决什么问题功能原理 网络层解决的问题功能原理 传输层解决什么问题功能原理会话层解决什么问题功能原理: 表示层解决什么问题 应用层解决什么问题如何展示? 问: 请你介绍一下OSI七层网络模型 物…...
RK356x bsp 7 - PCF8563 RTC调试记录
文章目录 1、环境介绍2、目标3、PCF85634、dts配置5、内核配置6、测试验证 1、环境介绍 硬件:飞凌ok3568-c开发板 软件:原厂rk356x sdk 2、目标 开发板断电后仍正常计时。 3、PCF8563 PCF8563 是由 NXP Semiconductors 公司生产的低功耗 CMOS 实时…...
Vue.js组件开发-如何实现vueFLow流程
在Vue.js组件中实现vueFlow流程实例 确保已经安装了vueFlow库。如果还没有安装,可以使用npm或yarn进行安装: npm install braks/vue-flow # 或者 yarn add braks/vue-flow步骤: 引入vueFlow组件: 在Vue组件文件中ÿ…...
upload-labs关卡记录15
图片马,这里就可以看到任务和注意事项: 使用一个正常图片,然后拼接一个一句话木马即可实现。这里就用命令窗口进行实现: copy 111.png/b shell.php/a shell.png 注意这里的命令窗口要在存在图片和一句话木马的目录下打开&#…...
面试题总结
一、mysql中的乐观锁、悲观锁、共享锁、排它锁、行锁、表锁 1、乐观锁 通过sql实现的,更新sql语句时加上where version #{version}乐观锁不是数据库自带的锁,需要我们自己去实现。乐观锁是指操作数据库时(更新操作),想法很乐观,认…...
Linux | 零基础Ubuntu解压RaR等压缩包文件
目录 介绍 案例分析 安装工具 解压实践 介绍 RAR是一种专利文件格式,用于数据压缩与归档打包,开发者为尤金罗谢尔(俄语:Евгений Лазаревич Рошал,拉丁转写:Yevgeny Lazarevich R…...
自动化测试-Pytest测试
目录 pytest简介 基本测试实例 编写测试文件 执行测试 pytest运行时参数 mark标记 Fixture pytest插件 Allure测试报告 测试步骤 pytest简介 Pytest是一个非常流行的Python测试框架,它支持简单的单元测试和复杂的功能测试,具有易于上手、功…...
磁盘调度算法
先来先服务(FCFS)算法 原理: 按照进程请求访问磁盘的先后顺序进行调度。就像是排队买东西,先到的先服务。 示例(Python): def fcfs(requests):"""requests是一个包含磁盘请求序…...
多视图 (Multi-view) 与多模态 (Multi-modal)
多视图 (Multi-view) 与多模态 (Multi-modal) 是两种不同的数据处理方式,它们在机器学习和数据分析中有着重要的应用。尽管这两者有一些相似之处,但它们关注的角度和处理方法有所不同。 多视图 (Multi-view) 定义:多视图指的是同一数据对象…...
CFA知识点梳理系列:CFA Level II, Reading 7 Economics of Regulation
这是CFA知识点梳理系列的第七篇文章,上一篇文章可以参考以下链接: CFA知识点梳理系列:CFA Level II, Reading 6 Economic Growth...