使用 C++ 从磁卡 reader MT188 读取数据
Reading DATA from Magnetic card reader MT188 using C++
我正在尝试从磁卡读取数据reader它的型号是MT188。 Card reader 带有一个 DLL 和一个 DLL 中函数的文档。读卡过程如下
HANDLE APIENTRY CommOpenWithBaut(UINT nPort, UINT _data)
open serial Communications example : CommOpenWithBaut(1,9600);.
int APIENTRY CarderCheckSt(HANDLE hComHandle, unsigned char &PewSt, unsigned char &CardType, unsigned char &CardSt, unsigned char &PowerSt)
check Device status.
int APIENTRY MagRead(HANDLE hComHandle,BYTE *MagData,int &lenth)
read Magnetic card data
int APIENTRY CommClose(HANDLE hComHandle);
Close port after the card is read.
每个函数都有一个 return 值。这是 cout<<Magread<<endl;
的示例,它给出了 00007FF792E41258
的值。我究竟做错了什么?如何正确使用这些功能?
这是我的主要内容。
int main(int arg, char* argc[])
{
CommOpenWithBaut(1,9600);
cout<< "This is the cards data: " << MagRead << endl;
cout << "This is the cards status: " << CarderCheckSt << endl;
CommClose;
}
更新:
我尝试 运行 程序时收到此错误:
LNK2019 unresolved external symbol "__declspec(dllimport) void * __cdecl CommOpenWithBaut(unsigned int,unsigned int)" (__imp_?CommOpenWithBaut@@YAPEAXII@Z) referenced in function main
这是我的头文件:
#include <iostream>
#include <windows.h>
#ifdef Modulev188_EXPORTS
#define Modulev188_API __declspec(dllexport)
#else
#define Modulev188_API __declspec(dllimport)
#endif
Modulev188_API HANDLE CommOpenWithBaut(UINT nPort, UINT _data);
Modulev188_API int CommClose(HANDLE hComHandle);
Modulev188_API int CarderCheckSt(HANDLE hComHandle, unsigned char& PewSt, unsigned char& CardType, unsigned char& CardSt, unsigned char& PowerSt);
Modulev188_API int CarderVersion(HANDLE hComHandle, unsigned char* VersionNo, int& lenth);
//DLLEXPORT int WINAPI ContactCPU_ColdReset(HANDLE hComHandle, BYTE* _CPUTYPE, BYTE* _exData, int* _exdataLen);
//DLLEXPORT int WINAPI ContactCPU_Dormancy(HANDLE hComHandle);
Modulev188_API int ContactCPU_CAPDU(HANDLE hComHandle, int _dataLen, BYTE* _APDUData, BYTE* _exData, int* _exdataLen);
Modulev188_API int SIM_Reset(HANDLE hComHandle, BYTE _VOLTAGE, BYTE _SIMNo, BYTE& _SIMTYPE, BYTE* _exData, int& _exdataLen);
Modulev188_API int SIM_C_APDU(HANDLE hComHandle, BYTE SIMNo, int _dataLen, BYTE* _APDUData, BYTE* _exData, int& _exdataLen);
Modulev188_API int SIM_CardClose(HANDLE hComHandle);
Modulev188_API int MagRead(HANDLE hComHandle, BYTE* MagData, int& lenth);
Modulev188_API int MagCleaner(HANDLE hComHandle);
您实际上并没有调用 MagRead
、CarderCheckSt
或 CommClose
,因为您没有将它们作为带有括号和参数的函数来调用。您只是将它们作为函数指针打印出来,因此您看到的值代表函数入口点的地址。
相反,您需要为每个函数提供合适的参数。从 'open' 函数中,您将获得一个传递给所有后续函数的句柄。
#include <iostream>
extern "C" {
#include <mt188.h> // The header for your C library
}
using namespace std;
int main(int argc, char* argv[])
{
// Open the device
HANDLE port = CommOpenWithBaut(1, 9600);
if (port == 0)
{
cerr << "Cannot open device";
return -1;
}
// Read status
unsigned char PewSt = 0;
unsigned char CardType = 0;
unsigned char CardSt = 0;
unsigned char PowerSt = 0;
int rc = CarderCheckSt(port, PewSt, CardType, CardSt, PowerSt);
// Read buffer of data
int bufferSize = 128;
BYTE buffer[bufferSize];
int bytesRead = MagRead(port, buffer, bufferSize);
//
CommClose(port);
return 0;
}
我正在尝试从磁卡读取数据reader它的型号是MT188。 Card reader 带有一个 DLL 和一个 DLL 中函数的文档。读卡过程如下
HANDLE APIENTRY CommOpenWithBaut(UINT nPort, UINT _data)
open serial Communications example : CommOpenWithBaut(1,9600);.
int APIENTRY CarderCheckSt(HANDLE hComHandle, unsigned char &PewSt, unsigned char &CardType, unsigned char &CardSt, unsigned char &PowerSt)
check Device status.
int APIENTRY MagRead(HANDLE hComHandle,BYTE *MagData,int &lenth)
read Magnetic card data
int APIENTRY CommClose(HANDLE hComHandle);
Close port after the card is read.
每个函数都有一个 return 值。这是 cout<<Magread<<endl;
的示例,它给出了 00007FF792E41258
的值。我究竟做错了什么?如何正确使用这些功能?
这是我的主要内容。
int main(int arg, char* argc[])
{
CommOpenWithBaut(1,9600);
cout<< "This is the cards data: " << MagRead << endl;
cout << "This is the cards status: " << CarderCheckSt << endl;
CommClose;
}
更新:
我尝试 运行 程序时收到此错误:
LNK2019 unresolved external symbol "__declspec(dllimport) void * __cdecl CommOpenWithBaut(unsigned int,unsigned int)" (__imp_?CommOpenWithBaut@@YAPEAXII@Z) referenced in function main
这是我的头文件:
#include <iostream>
#include <windows.h>
#ifdef Modulev188_EXPORTS
#define Modulev188_API __declspec(dllexport)
#else
#define Modulev188_API __declspec(dllimport)
#endif
Modulev188_API HANDLE CommOpenWithBaut(UINT nPort, UINT _data);
Modulev188_API int CommClose(HANDLE hComHandle);
Modulev188_API int CarderCheckSt(HANDLE hComHandle, unsigned char& PewSt, unsigned char& CardType, unsigned char& CardSt, unsigned char& PowerSt);
Modulev188_API int CarderVersion(HANDLE hComHandle, unsigned char* VersionNo, int& lenth);
//DLLEXPORT int WINAPI ContactCPU_ColdReset(HANDLE hComHandle, BYTE* _CPUTYPE, BYTE* _exData, int* _exdataLen);
//DLLEXPORT int WINAPI ContactCPU_Dormancy(HANDLE hComHandle);
Modulev188_API int ContactCPU_CAPDU(HANDLE hComHandle, int _dataLen, BYTE* _APDUData, BYTE* _exData, int* _exdataLen);
Modulev188_API int SIM_Reset(HANDLE hComHandle, BYTE _VOLTAGE, BYTE _SIMNo, BYTE& _SIMTYPE, BYTE* _exData, int& _exdataLen);
Modulev188_API int SIM_C_APDU(HANDLE hComHandle, BYTE SIMNo, int _dataLen, BYTE* _APDUData, BYTE* _exData, int& _exdataLen);
Modulev188_API int SIM_CardClose(HANDLE hComHandle);
Modulev188_API int MagRead(HANDLE hComHandle, BYTE* MagData, int& lenth);
Modulev188_API int MagCleaner(HANDLE hComHandle);
您实际上并没有调用 MagRead
、CarderCheckSt
或 CommClose
,因为您没有将它们作为带有括号和参数的函数来调用。您只是将它们作为函数指针打印出来,因此您看到的值代表函数入口点的地址。
相反,您需要为每个函数提供合适的参数。从 'open' 函数中,您将获得一个传递给所有后续函数的句柄。
#include <iostream>
extern "C" {
#include <mt188.h> // The header for your C library
}
using namespace std;
int main(int argc, char* argv[])
{
// Open the device
HANDLE port = CommOpenWithBaut(1, 9600);
if (port == 0)
{
cerr << "Cannot open device";
return -1;
}
// Read status
unsigned char PewSt = 0;
unsigned char CardType = 0;
unsigned char CardSt = 0;
unsigned char PowerSt = 0;
int rc = CarderCheckSt(port, PewSt, CardType, CardSt, PowerSt);
// Read buffer of data
int bufferSize = 128;
BYTE buffer[bufferSize];
int bytesRead = MagRead(port, buffer, bufferSize);
//
CommClose(port);
return 0;
}