📄 comtestdlg.cpp
字号:
// comtestDlg.cpp : implementation file
//
#include "stdafx.h"
#include "comtest.h"
#include "comtestDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CComtestDlg dialog
CComtestDlg::CComtestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CComtestDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CComtestDlg)
m_text = _T("");
m_times = 0;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CComtestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CComtestDlg)
DDX_Text(pDX, IDC_EDIT1, m_text);
DDX_Text(pDX, IDC_EDIT2, m_times);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CComtestDlg, CDialog)
//{{AFX_MSG_MAP(CComtestDlg)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CComtestDlg message handlers
BOOL CComtestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CenterWindow(GetDesktopWindow()); // center to the hpc screen
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
int CComtestDlg::OpenPort()
{
m_hComm = CreateFile(
TEXT("COM2:"),
GENERIC_READ | GENERIC_WRITE, //允许读和写
0, //独占方式(共享模式)
NULL,
OPEN_EXISTING, //打开而不是创建(创建方式)
0,
NULL
);
if (m_hComm == INVALID_HANDLE_VALUE)
{
// 无效句柄,返回。
return 2;
}
//分配设备缓冲区
SetupComm(m_hComm,1024,1024);
// 得到打开串口的当前属性参数,修改后再重新设置串口。
DCB commParam;
commParam.DCBlength=sizeof(DCB);
if (!GetCommState(m_hComm,&commParam))//取得默认端口的属性
{
return 3;
}
commParam.BaudRate = CBR_9600; // 设置波特率
commParam.ByteSize = 8; // 数据位,范围:4-8
commParam.Parity = NOPARITY; // 校验模式
commParam.StopBits = ONESTOPBIT; // 停止位
if (!SetCommState(m_hComm, &commParam))//DCB属性和相应端口绑定
{
return 3;
}
//设置串口读写操作延迟时间属性
COMMTIMEOUTS CommTimeOuts;
//GetCommTimeouts (m_hComm, &CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout = 100;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 10;
CommTimeOuts.WriteTotalTimeoutConstant = 1000;
if(!SetCommTimeouts( m_hComm, &CommTimeOuts ))
{
return 3;
}
return 0;
}
int CComtestDlg::InitCard(BYTE default_no,BYTE Shanqu)
{
int nError=0;
next:
Sleep(100);
nError++;
BYTE buff[31]; //var buff:array [0..30] of byte;
BYTE pass[6];
int i,dly; //i,dly:integer;
BYTE sum; //sum:byte;
DWORD outnum; //outnum:dword;
pass[0]=0x08;
pass[1]=0x04;
pass[2]=0x01;
pass[3]=0x00;
pass[4]=0x01;
pass[5]=0x09;
buff[0]=0xf0;
buff[1]=0x09;
buff[2]=0x11;
buff[3]=default_no;
buff[4]=Shanqu;
sum=0xf0+0x09+0x11+default_no+Shanqu;
for (i=0;i<=5;i++)
{
buff[i+5]=pass[i];
sum=sum+pass[i];
}
buff[11]=sum;//0xe0;//
buff[12]=0x7e;
//初始化缓冲区中的信息
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
WriteFile(m_hComm,buff,13,&outnum,NULL);
dly=0;
//cbnum=0;
do
{
dly=dly+1;
Sleep(1);
ClearCommError(m_hComm,&lperrors,&coms);
cbnum=coms.cbInQue;
}
while((cbnum<6)&&(dly<=200));
if(cbnum!=0) ReadFile(m_hComm,rdbftemp,cbnum,&readnumber,NULL);
if(cbnum<6)
{
if(nError<5)
goto next;
if(cbnum!=0)
{
sum=0;
for(i=0;i<=rdbftemp[1]+1;i++) sum=sum+rdbftemp[i];
if(sum!=(rdbftemp[rdbftemp[1]+2])) return 102;
return rdbftemp[2];
}
else
{
return 101;
}
}
else
{ //sucessfully的情况
sum=0;
for(i=0;i<=rdbftemp[1]+1;i++) sum=sum+rdbftemp[i];
if (sum!=(rdbftemp[rdbftemp[1]+2]))
{
if(nError<5)
goto next;
return 102;
}
if((nError<5)&&(rdbftemp[2]!=0))
goto next;
return rdbftemp[2];
}
}
int CComtestDlg::FindCard(BYTE card_no[])
{
BYTE buff[31]; //buff:array [0..30] of byte;
int i,dly; //i,dly:integer;
DWORD outnum; //outnum:dword;var buff:array [0..30] of byte;
buff[0]=0xf0;
buff[1]=0x01;
buff[2]=0x14;
buff[3]=0x05;//f0+01+14
buff[4]=0x7e;
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);//HANDLE m_hComm;
WriteFile(m_hComm,buff,5,&outnum,NULL);
dly=0;
do
{
dly=dly+1;
Sleep(1);
ClearCommError(m_hComm,&lperrors,&coms);// COMSTAT coms
cbnum=coms.cbInQue;
}
while ((cbnum<9)&&(dly<=100));
if(cbnum!=0) ReadFile(m_hComm,rdbftemp,cbnum,&readnumber,NULL);
if(cbnum<9)
{
if (cbnum!=0) return rdbftemp[2];
else return 101;
}
else
{
for(i=0;i<=3;i++) card_no[i]=rdbftemp[i+3];
return rdbftemp[2];
}
}
int CComtestDlg::ReadCard(BYTE dat[], int block_no, int next_no)
{
int nError=0;
next:
nError++;
Sleep(100);
BYTE buff[31]; //buff:array [0..30] of byte;
int i,dly; //i,dly:integer;
BYTE sum; //sum:byte;
DWORD outnum; //outnum:dword;
buff[0]=0xf0;
buff[1]=0x03;
buff[2]=0x12;
sum=0x05; //f0+03+12
buff[3]=block_no;
sum=sum+buff[3];
buff[4]=next_no;
sum=sum+buff[4];
buff[5]=sum;
buff[6]=0x7e;
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
WriteFile(m_hComm,buff,7,&outnum,NULL);
dly=0;
//cbnum=0;
do
{
dly=dly+1;
Sleep(1);
ClearCommError(m_hComm,&lperrors,&coms);
cbnum=coms.cbInQue;
}
while((cbnum<22)&&(dly<=200));
if(cbnum!=0) ReadFile(m_hComm,rdbftemp,cbnum,&readnumber,NULL);
if (cbnum<22)
{
if(nError<10)
goto next;
if (cbnum!=0) return rdbftemp[2];
else return 101;
}
else
{
for(i=0;i<=15;i++)
dat[i]=rdbftemp[i+4];
if((nError<10)&&(0!=rdbftemp[2]))
goto next;
return rdbftemp[2];
}
}
int CComtestDlg::FindAndRead()
{
int read_flag;
BYTE R_Data_buf[16];
WCHAR R_Data[33];
int len;
ClearWchar(R_Data);
read_flag=ReadCard(R_Data_buf,1,13); //reading block 1 BCD card code, cooporation code, sign, day
if (read_flag!=0)
{
return 1;
}
else
{
len=16;
BCDtoWchar(R_Data_buf,R_Data,len); //如果是读许多数据在此后加
}
// TCHAR CopInfo[33];
CString m_StrCop;
if('1'==R_Data[9])
{
m_text="administrator card!\r\n";
ClearWchar(R_Data);
read_flag=ReadCard(R_Data_buf,13,4); //reading block 4 chr cooporation name part I
if (read_flag!=0)
{
return 1;
}
else
{//读出数据
int ti=1000*(R_Data_buf[0]/16)+100*(R_Data_buf[0]%16)+10*(R_Data_buf[1]/16)+(R_Data_buf[1]%16);
CString m;
m.Format(_T("%d"),ti);
m_text +=m;
UpdateData(FALSE);
}
}
Sleep(50);
Buzzer();
return 0;
}
void CComtestDlg::BCDtoWchar(BYTE BCDcode[], WCHAR UniChar[], int len)
{
BYTE AnciChar[33];
int i=0;
for(i=0;i<len;i++)
{
AnciChar[2*i]=BCDcode[i]/16+48; //向低位移动4位,取高位+48得到对应的ASCII码
AnciChar[2*i+1]=BCDcode[i]%16+48; //取余得到低位+48得到对应的ASCII码
}
MultiByteToWideChar(CP_ACP,0,(const char *)AnciChar,2*len,UniChar,2*len); //转换位UNI码
UniChar[2*len]='\0'; //加结束字符,结束字符串
}
int CComtestDlg::CloseCard()
{
BYTE buff[11]; //buff:array [0..10] of byte;
DWORD outnum; //outnum:dword;
buff[0]=0xf0;
buff[1]=0x01;
buff[2]=0x16;
buff[3]=0x07; //f0+01+18
buff[4]=0x7e;
WriteFile(m_hComm,buff,5,&outnum,NULL);
return 0;
}
int CComtestDlg::Buzzer()
{
DWORD outnum;
BYTE buff[11];
buff[0]=0xf0;
buff[1]=0x01;
buff[2]=0x18;
buff[3]=0x09; //f0+01+18
buff[4]=0x7e;
WriteFile(m_hComm,buff,5,&outnum,NULL);
return 0;
}
void CComtestDlg::OnButton1()
{
// TODO: Add your control notification handler code here
if(OpenPort()!=0)
{
AfxMessageBox(TEXT("端口打开错误!"));
return;
}
Sleep(60);
for(BYTE i=0;i<4;i++)
{
if(InitCard(0,i)!=0)
{
// MessageBox(NULL,TEXT("chu shhi hua faild!\r\n"),TEXT("出错"),MB_OK);
}
}
BYTE Card_ID[5];
Sleep(100);
if(FindCard(Card_ID)!=0)
{
AfxMessageBox(TEXT("寻卡错误!"));
CloseCard();
ClosePort();
return;
}
if(FindAndRead()==1)
{
AfxMessageBox(TEXT("读卡错误!"));
CloseCard();
ClosePort();
return;
}
CloseCard();
ClosePort();
UpdateData(false);
}
void CComtestDlg::ClearWchar(WCHAR Wchar[])
{
int i;
for(i=0;i<33;i++)
Wchar[i]='\0';
}
void CComtestDlg::InttoWchar(BYTE Intdata[], WCHAR Wchar[], int len)
{
int i;
BYTE AnciChar[33];
for(i=0;i<len;i++)
AnciChar[i]=Intdata[i]+48;
MultiByteToWideChar(CP_ACP,0,(const char *)AnciChar,len,Wchar,len); //转换位UNI码
}
void CComtestDlg::AchartoWchar(BYTE Achar[], WCHAR Wchar[], int len)
{
Wchar[0]='\0';
MultiByteToWideChar(CP_ACP,0,(const char *)Achar,len,Wchar,len);
}
int CComtestDlg::ClosePort()
{
if(CloseHandle(m_hComm))
{
return 0;
}
else
{
return 1;
}
}
void CComtestDlg::WcharCopy(WCHAR OldChar[], WCHAR NewChar[], int first, int last,int newfirst)
{
for(int i=0;i<=last-first;i++)
NewChar[newfirst+i]=OldChar[first+i];
NewChar[newfirst+last-first+1]='\0';
}
int CComtestDlg::WriteCard(BYTE dat[],BYTE block_no)
{
int nError=0;
next0:
nError++;
Sleep(100);
BYTE buff[22];//var buff:array [0..22] of byte;
int i,dly;//i,dly:integer;
BYTE sum;//sum:byte;
DWORD outnum;//outnum:dword;
buff[0]=0xf0;// begin buff[0]:=$f0;0xf0
buff[1]=0x12;
buff[2]=0x15;
sum=0x17;
buff[3]=block_no;
sum=sum+buff[3];
for(i=0;i<=15;i++)
{
buff[4+i]=dat[i];
sum=sum+dat[i];
}
buff[20]=sum;
buff[21]=0x7e;
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
WriteFile(m_hComm,buff,22,&outnum,NULL);
dly=0;
do
{
dly=dly+1;
Sleep(1);
ClearCommError(m_hComm,&lperrors,&coms);
cbnum=coms.cbInQue;
}
while((cbnum<6)&&(dly<=200));// until ((cbnum>=6)or(dly>35));
if (cbnum !=0)
ReadFile(m_hComm,rdbftemp,cbnum,&readnumber,NULL);
if (cbnum<6)
{
if(nError<11)
goto next0;
if (cbnum !=0)
{
return rdbftemp[2];
}
else
return 101;
}
else
{
cbnum =coms.cbInQue;
if((nError<11)&&(0!=rdbftemp[2]))
goto next0;
return rdbftemp[2];
}
}
void CComtestDlg::WriteCardTime(int CardUseTime)
{
int ICardUseTime=CardUseTime;
// int ICardUseTime=2845;
CString W_Data,str1;
int write_flag,i;
BYTE W_Data_buf[16];
BYTE BCardUseTime[4];
for(i=0;i<16;i++)
W_Data_buf[i] =0;
BCardUseTime[3]=ICardUseTime/1000;//high
BCardUseTime[2]=(ICardUseTime%1000)/100;
BCardUseTime[1]=(ICardUseTime%100)/10;
BCardUseTime[0]=ICardUseTime%10;
W_Data_buf[0]=16*BCardUseTime[3]+BCardUseTime[2];
W_Data_buf[1]=16*BCardUseTime[1]+BCardUseTime[0];
write_flag =WriteCard(W_Data_buf,13); //写次数
// CString mm;
// mm.Format(_T("%d,%d,%d"),write_flag,(int)W_Data_buf[0],(int)W_Data_buf[1]);
if (write_flag!=0 )
MessageBox(_T("写卡失败"));
else
MessageBox(_T("写卡成功"));
return;
}
void CComtestDlg::OnButton3()
{
// TODO: Add your control notification handler code here
UpdateData();
if(OpenPort()!=0)
{
AfxMessageBox(TEXT("端口打开错误!"));
return;
}
Sleep(60);
for(BYTE i=0;i<4;i++)
{
if(InitCard(0,i)!=0)
{
// MessageBox(NULL,TEXT("chu shhi hua faild!\r\n"),TEXT("出错"),MB_OK);
}
}
BYTE Card_ID[5];
Sleep(100);
if(FindCard(Card_ID)!=0)
{
AfxMessageBox(TEXT("寻卡错误!"));
CloseCard();
ClosePort();
return;
}
WriteCardTime(m_times);
CloseCard();
ClosePort();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -