📄 readcodepage.cpp
字号:
#include <ubase.h>
#include <string.h>
#include <stdio.h>
#include <sys/Ispeaker.h>
#include "Readbarcode.h"
#include <iniops.h>
#include "readCodePage.h"
#include <webcomm/webcomm.h>
#include "Mifare_i.h"
#include "T1_RFID.h"
#define _T1_RFID_ 1
#define _M1_RFID_ 2
#define _E1_RFID_ 3
#define _T1_COMM_ 5
#define _M1_COMM_ 1
#define _E1_COMM_ 3
CReadCodePage::CReadCodePage()
{
m_IsOpenSucc=TRUE;
//从ini文件中取得,识读卡片的种类
memset(m_strRes,0x00,sizeof(m_strRes));
ReadIni("mode","mode",m_strRes,"config.ini");
switch(atoi(m_strRes)) {
case _T1_RFID_:
{
UART_PARAM _sup;
UartOpen(_T1_COMM_);
UartGetParam(_T1_COMM_, &_sup);
_sup.baudrate = 38400;
_sup.data = 8;
_sup.parity = 0;
_sup.stop = 0;
UartSetParam(_T1_COMM_, &_sup);
UartClose(_T1_COMM_);
break;
}
case _M1_RFID_:
{
//UartClose(_M1_COMM_);
UartClear(_M1_COMM_);
if (!Mifare_Initialization(_M1_COMM_, 9600, 3000)) {
//ShowMsg("初始化串口失败,请重试!");
m_IsOpenSucc=FALSE;
}
break;
}
case _E1_RFID_:
{
UartClose(1);
UartClose(4);
//打开串口
UartOpen(_E1_COMM_);
//设置参数
UART_PARAM param;
param.baudrate = 57600;
param.data = 8;
param.parity = NOPARITY;
param.stop = ONESTOPBIT;
if (UartSetParam(_E1_COMM_, ¶m)==-1)
{
CUMsgBox box("UartSetParam Error", MSGBOX_NORMAL);
box.DoModal();
}
OpenEngine();
break;
}
default:
break;
}
}
CReadCodePage::~CReadCodePage()
{
switch(atoi(m_strRes)) {
case _T1_RFID_:
{
UartClose(_T1_COMM_);
break;
}
case _M1_RFID_:
{
Mifare_UnInitialization();
break;
}
case _E1_RFID_:
{
UartClose(_E1_COMM_);
CloseEngine();
break;
}
default:
break;
}
}
void CReadCodePage::OnInit()
{
RECT rc;
rc.left = 2;
rc.right = 157;
rc.top = 17;
rc.bottom = 110;
m_codebar.Create(this, "", 0, &rc);
m_codebar.SetReadOnly(FALSE); //现在可以测试输入法了
m_codebar.SetImeStyle(UIME_HZ_INPUT, INPUT_MODE_NORMAL);
// m_codebar.SetFocusEnable(FALSE);
rc.left = 0;rc.right=160;
rc.top = 112;rc.bottom =128;
m_labHelp.Create(this,"C-退出|7-识读|8-写入|9-清空",0,&rc);
m_labHelp.SetStyle( m_labHelp.GetState() | 8 );
SendMessage(&m_codebar, UM_KEYPRESS, 0, KEY_ENT);
if(!m_IsOpenSucc) m_codebar.SetText("初始化串口失败,请重启!");
m_codebar.Show();
}
void CReadCodePage::OnOK()
{
}
void CReadCodePage::OnUserMsg(UMSG *pMsg)
{
if(pMsg->nMessage == MSG_BARCODE){
ShowMsg((char *)pMsg->nData);
}
}
void CReadCodePage::OnKey(int nKey, int nState)
{
if(nKey == KEY_7){
BOOL bIsSucc=TRUE;
char strTmpData[1024]={0};
switch(atoi(m_strRes)) {
case _T1_RFID_:
{
if(!ReadT1Data(&strTmpData[0])){
ShowMsg("读取数据不成功!");
bIsSucc=FALSE;
}
break;
}
case _M1_RFID_:
{
if(!ReadM1Data(&strTmpData[0])){
ShowMsg("读取数据不成功!");
bIsSucc=FALSE;
}
break;
}
case _E1_RFID_:
{
if(!ReadE1Data(&strTmpData[0])){
ShowMsg("读取数据不成功!");
bIsSucc=FALSE;
}
break;
}
default:
break;
}
if(bIsSucc) ShowMsg(strTmpData);
}else if(nKey ==KEY_8){
char strWriteData[1024]={0};
if(strlen(m_codebar.GetTextPtr())==0){
ShowMsg("请先输入要写入的数据!");
return;
}
m_codebar.GetText(strWriteData);
strWriteData[1023]=0x00;
switch(atoi(m_strRes)) {
case _T1_RFID_:
{
if(!WriteT1Data(strWriteData)){
ShowMsg("写入数据不成功!");
}else{
ShowMsg("写入数据成功!");
}
break;
}
case _M1_RFID_:
{
if(!WriteM1Data(strWriteData)){
ShowMsg("写入数据不成功!");
}else{
ShowMsg("写入数据成功!");
}
break;
}
case _E1_RFID_:
{
ShowMsg("此EM卡不能写入数据!");
break;
}
default:
break;
}
}else if(nKey==KEY_9){
m_codebar.SetText("");
m_codebar.Show();
}
CUPage::OnKey(nKey,nState);
}
void CReadCodePage::ShowMsg(const char *str)
{
CUString m_str;
m_str.empty();
if(strlen(m_codebar.GetTextPtr())!=0){
m_str +=m_codebar.GetTextPtr();
m_str +="\n";
}
m_str +=str;
m_codebar.SetText(m_str.c_str());
SendMessage(&m_codebar,UM_KEYPRESS,0,KEY_DOWN);
m_codebar.Show();
}
BOOL CReadCodePage::ReadT1Data(char *pstr)
{
char xdata;
char cmd[30]={0};
cmd[0] = 0x2;
xdata = cmd[0];
cmd[1] = 0;
xdata ^= cmd[1];
cmd[2] = 0;
xdata ^= cmd[2];
cmd[3] = 0x32;
xdata ^= cmd[3];
cmd[4] = xdata;
int n = rfwr(cmd, pstr,TRUE);
if (n != 256) return FALSE;
beep(100);
return TRUE;
}
BOOL CReadCodePage::ReadM1Data(char *pstr)
{
int nsr = 0;
if (!Mifare_GetSerialNumber(&nsr)) {
return FALSE;
}
if (!Mifare_ReadBlock(0, 1, 0, pstr, nsr)) {
return FALSE;
}
beep(100);
return TRUE;
}
BOOL CReadCodePage::ReadE1Data(char *pstr)
{
int m_Buf_count=0;
char p_char;
USleep(100);
if(UartReadChar(_E1_COMM_, &p_char, 100) == -1){
return FALSE;
}
pstr[m_Buf_count]=p_char;m_Buf_count++;
while(UartReadChar(_E1_COMM_, &p_char, 100) != -1 && m_Buf_count<12)
{
pstr[m_Buf_count]=p_char;m_Buf_count++;
}
pstr[10]='\0';
UartClear(_E1_COMM_);
beep(100);
return TRUE;
}
BOOL CReadCodePage::WriteT1Data(char *pstr)
{
int i,len=0,k,n,j;
char xdata;
char cmd[30]={0};
char lvr[30]={0};
char tmpstr[5];
i=0;
cmd[0] = 0x2;
xdata = cmd[0];
cmd[1] = 0;
xdata ^= cmd[1];
cmd[2] = 5;
xdata ^= cmd[2];
cmd[3] = 0x20;
xdata ^= cmd[3];
cmd[4] = i;
xdata ^= cmd[4];
len=strlen(pstr);
if(len>256) return FALSE;
for(j=0;j<len;j+=4){
memset(tmpstr,0x00,sizeof(tmpstr));
if(len-j>=4){
memcpy(tmpstr,&pstr[j],4);
}
else{
memcpy(tmpstr,&pstr[j],len-j);
}
for (k=0; k<4; k++)
{
cmd[5+k] = tmpstr[k];
xdata ^= cmd[5+k];
}
cmd[9] = xdata;
cmd[10]=0x00;
n = rfwr(cmd, NULL,FALSE);
if (n!=0) return FALSE;
i++;
cmd[0] = 0x2;
xdata = cmd[0];
cmd[1] = 0;
xdata ^= cmd[1];
cmd[2] = 5;
xdata ^= cmd[2];
cmd[3] = 0x20;
xdata ^= cmd[3];
cmd[4] = i;
xdata ^= cmd[4];
}
beep(100);
return TRUE;
}
BOOL CReadCodePage::WriteM1Data(char *pstr)
{
int nsr = 0;
if (!Mifare_GetSerialNumber(&nsr)) {
return FALSE;
}
char buf[20];
memset(buf, 0xff, 20);
if (Mifare_Transkey(0, buf) == FALSE) {
return FALSE;
}
if (!Mifare_WriteBlock(0, 1, 0, pstr, nsr)) {
return FALSE;
}
beep(100);
return TRUE;
}
void CReadCodePage::OnQuit()
{
CUPage::OnQuit();
}
int CReadCodePage::rfwr(char *cmd, char *data,BOOL IsRead)
{
int i=0,j=0,len=0;
char lvb[300];
len = cmd[1]*256 + cmd[2] + 5;
UartOpen(COM5);
UartWrite(COM5, (char*)cmd, len,0);
if (cmd[3] == 0x16)
{
memset(sdata, 0, 10);
memcpy(sdata, (char*)(cmd+3), 8);
}
memset(lvb,0,100);
while (1)
{
j++;
i = UartReadChar(COM5,&lvb[0], 50);
if (!i)
{
if(lvb[0] == 0x02) break;
if (lvb[0] == 0x01) return -1;
}
if (j>=30)
{
if (cmd[3] != 0x34) return -2; //未响应
else if (j>400) //写整张卡耗时较久
return -2; //未响应
}
}
i = UartRead(COM5,&lvb[1], 2, 50);
if (i!=2) return -3;
len = lvb[1]*256 + lvb[2];
i = UartRead(COM5, &lvb[3], len+2, 100);
UartClose(COM5);
if (i != (len+2)) return -4;
j = 0x2;
for (i=1; i<(len+5); i++)
j ^= lvb[i];
if (j != 0) return -5;
if ((lvb[3] -1) == cmd[3]) return -6;
else if (lvb[3] != cmd[3]) return -7;
else
{
if (len == 0) return 0;
if (data) memcpy(data, lvb+4, len);
return (len);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -