• Qt_C++读取RFID卡号支持Windows统信麒麟国产Linux系统


    本示例使用的发卡器: Web浏览器JS网页可编程二次开发RFID读卡器Android Linux乐乐课堂-淘宝网 (taobao.com)

    1. #include "mainwindow.h"
    2. #include "./ui_mainwindow.h"
    3. #include "QDebug"
    4. #include "QLibrary"
    5. #include "QMessageBox"
    6. //电话、微信:13822155058
    7. //QQ:954486673
    8. //本示例可在windows、linux系统内编译、运行
    9. //判断windows、linux系统,声明动态库函数----------------------------------------------------------------------------------------------------------------------------------------------
    10. //让读写器发出声音
    11. typedef unsigned char (*idr_beep)(unsigned long xms);
    12. #ifdef Q_OS_WIN
    13. idr_beep myidr_beep = (idr_beep)QLibrary("OUR_IDR.dll").resolve("idr_beep");
    14. #else
    15. idr_beep myidr_beep = (idr_beep)QLibrary("./libOURIDR.so").resolve("idr_beep");
    16. #endif
    17. //获取发卡器唯一编号
    18. typedef unsigned char (*pcdgetdevicenumber)(unsigned char *devicenumber);
    19. #ifdef Q_OS_WIN
    20. pcdgetdevicenumber mypcdgetdevicenumber = (pcdgetdevicenumber)QLibrary("OUR_IDR.dll").resolve("pcdgetdevicenumber");
    21. #else
    22. pcdgetdevicenumber mypcdgetdevicenumber = (pcdgetdevicenumber)QLibrary("./libOURIDR.so").resolve("pcdgetdevicenumber");
    23. #endif
    24. //读取RFID卡号
    25. typedef unsigned char (*idr_read)(unsigned char *serial);
    26. #ifdef Q_OS_WIN
    27. idr_read myidr_read = (idr_read)QLibrary("OUR_IDR.dll").resolve("idr_read");
    28. #else
    29. idr_read myidr_read = (idr_read)QLibrary("./libOURIDR.so").resolve("idr_read");
    30. #endif
    31. //读取RFID卡号一次,如果卡一直在感应区第二次读取不返回卡号
    32. typedef unsigned char (*idr_read_once)(unsigned char *serial);
    33. #ifdef Q_OS_WIN
    34. idr_read_once myidr_read_once = (idr_read_once)QLibrary("OUR_IDR.dll").resolve("idr_read_once");
    35. #else
    36. idr_read_once myidr_read_once = (idr_read_once)QLibrary("./libOURIDR.so").resolve("idr_read_once");
    37. #endif
    38. MainWindow::MainWindow(QWidget *parent)
    39. : QMainWindow(parent)
    40. , ui(new Ui::MainWindow)
    41. {
    42. ui->setupUi(this);
    43. }
    44. MainWindow::~MainWindow()
    45. {
    46. delete ui;
    47. }
    48. //检测动态库文件是否在运行目录内----------------------------------------------------------------------------------------------------------------------------------------------------------
    49. static bool checkdllos(){
    50. #ifdef Q_OS_WIN
    51. QLibrary mylib("OUR_IDR.dll");
    52. if (!mylib.load()){ //判断windows系统下,OUR_IDR.dll是否在运行目录内
    53. QMessageBox::information(NULL, "提示", "请将OUR_IDR.dll文件拷贝到生成exe文件相同目录下!");
    54. return false;
    55. }else{
    56. return true;
    57. }
    58. #else
    59. QLibrary mylib("./libOURIDR.so");
    60. if (!mylib.load()){ //判断linux系统下,libOURIDR.so是否正运行目录内
    61. QMessageBox::information(NULL, "提示", "请将libOURIDR.so文件拷贝到生成的运行文件相同目录下!");
    62. return false;
    63. }else{return true;}
    64. #endif
    65. }
    66. //显示返回的错误代码信息-----------------------------------------------------------------------------------------------------------------------------------------------------------------
    67. static void disperrinf(unsigned char result){
    68. switch (result) {
    69. case 8:
    70. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",未寻到卡,请重新拿开卡后再放到感应区!");
    71. break;
    72. case 23:
    73. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",机器没连上或者动态库版本与读卡器型号不一致!");
    74. break;
    75. case 24:
    76. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",通讯超时!");
    77. break;
    78. default:
    79. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",未知的错误信息!");
    80. break;
    81. }
    82. }
    83. void MainWindow::on_pushButton_clicked()//让设备发出声
    84. {
    85. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    86. unsigned char status;
    87. if (myidr_beep != NULL){ //是否成功连接上 pcdbeep()函数
    88. status = myidr_beep(30);
    89. if(status==0){
    90. }
    91. else
    92. {
    93. disperrinf(status);
    94. }
    95. } else{
    96. QMessageBox::critical(NULL, "提示", "函数‘idr_beep’未正确载入,请查询DLL文件版本是否正确!");
    97. }
    98. }
    99. void MainWindow::on_pushButton_2_clicked() //读出设备全球唯一的设备编号,作为加密狗使用
    100. {
    101. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    102. unsigned char devicenumber[4]; //设备编号缓冲
    103. unsigned char status; //函数返回状态
    104. if (mypcdgetdevicenumber != NULL){ //是否成功连接上 pcdgetdevicenumber()函数
    105. status = mypcdgetdevicenumber(devicenumber);
    106. if(status==0){
    107. if (myidr_beep != NULL){myidr_beep(30);}
    108. QMessageBox::information(NULL, "提示", QString::asprintf("设备编号:%03d-%03d-%03d-%03d", devicenumber[0],devicenumber[1],devicenumber[2],devicenumber[3]));
    109. }
    110. else
    111. {
    112. disperrinf(status);
    113. }
    114. }else{
    115. QMessageBox::critical(NULL, "提示", "函数‘pcdgetdevicenumber’未正确载入,请查询DLL文件版本是否正确!");
    116. }
    117. }
    118. void MainWindow::on_pushButton_3_clicked() //读卡
    119. {
    120. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    121. unsigned char serial[5]; //卡编号缓冲
    122. unsigned char status; //函数返回状态
    123. if (myidr_read != NULL){ //是否成功连接上 idr_read()函数
    124. status = myidr_read(serial);
    125. if(status==0){
    126. if (myidr_beep != NULL){myidr_beep(30);}
    127. QString cardstr="16进制卡号:"+QString::asprintf("%02X%02X%02X%02X%02X",serial[0],serial[1],serial[2],serial[3],serial[4]);
    128. unsigned int card10=serial[1]*256*256*256+serial[2]*256*256+serial[3]*256+serial[4];
    129. cardstr=cardstr+"\n10进制卡号:"+QString::asprintf("%010d",card10);
    130. ui->textEdit->setText(cardstr);
    131. }
    132. else
    133. {
    134. disperrinf(status);
    135. }
    136. }else{
    137. QMessageBox::critical(NULL, "提示", "函数‘idr_read’未正确载入,请查询DLL文件版本是否正确!");
    138. }
    139. }
    140. void MainWindow::on_pushButton_4_clicked() //仅读一次,重新取放卡才能读到第二次[返回
    141. {
    142. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    143. unsigned char serial[5]; //卡编号缓冲
    144. unsigned char status; //函数返回状态
    145. if (myidr_read_once != NULL){ //是否成功连接上 idr_read_once()函数
    146. status = myidr_read_once(serial);
    147. if(status==0){
    148. if (myidr_beep != NULL){myidr_beep(30);}
    149. QString cardstr="16进制卡号:"+QString::asprintf("%02X%02X%02X%02X%02X",serial[0],serial[1],serial[2],serial[3],serial[4]);
    150. unsigned int card10=serial[1]*256*256*256+serial[2]*256*256+serial[3]*256+serial[4];
    151. cardstr=cardstr+"\n10进制卡号:"+QString::asprintf("%010d",card10);
    152. ui->textEdit->setText(cardstr);
    153. }
    154. else
    155. {
    156. disperrinf(status);
    157. }
    158. }else{
    159. QMessageBox::critical(NULL, "提示", "函数‘idr_read_once’未正确载入,请查询DLL文件版本是否正确!");
    160. }
    161. }

     

  • 相关阅读:
    什么是开关电源测试系统?如何用它进行测试?
    绿色通道——单调队列加二分加dp——修建草坪——单调队列+dp——理想的正方西——二维单调队列
    软件设计原则
    [OC学习笔记]属性关键字
    R语言实操记录——获取包的三种渠道及安装包的三种方式
    电脑怎么图片转文字?建议收藏这几个方法
    “华为杯”研究生数学建模竞赛2015年-【华为杯】E题:数控加工刀具运动的优化控制模型研究(续)(附MATLAB代码实现)
    1989-2022年企业排污许可证信息库数据(24万观测值)
    vue中的ref属性
    每日五问(java)
  • 原文地址:https://blog.csdn.net/zhangjin7422/article/details/133858484