⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comtestdlg.cpp

📁 S3C2440com接口测试软件
💻 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 + -