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

📄 fbycommudlg.cpp

📁 五气FBY-200通讯软件,分析仪调试专用
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		bAddrOrCmd=1;
		break;
	case 2:
		COMMAND[0]=m_DevIDVal;
		ChckSum+=COMMAND[0];
		COMMAND[1]=0xa0;
		ChckSum+=COMMAND[1];
		COMMAND[2]=0x01;
		ChckSum+=COMMAND[2];
		COMMAND[3]=ChckSum;
		CMDLENGTH=4;
		SendCommand(COMMAND,1,3);
		bSending=1;
		bAddrOrCmd=0;
		break;
	default:
		break;
	}
	
}

void CFbycommuDlg::OnBtninit() 
{
	// TODO: Add your control notification handler code here
	
	char string1[10]="初始化";
	char string2[10]="";

	UpdateData();
	m_BtnInit.GetWindowText(string2,10);
	if(!strcmp(string1,string2))
	{
		m_BtnInit.SetWindowText("关  闭");
		if(InitPort()<0)return;
		int temp=m_Func.GetCurSel();
		switch(temp)
		{
		case 0:
			m_BtnTest.EnableWindow(TRUE);
			m_BtnClean.EnableWindow(TRUE);
			m_BtnFeed.EnableWindow(TRUE);
			m_BtnGetStatus.EnableWindow(TRUE);
			m_BtnGetData.EnableWindow(TRUE);
			m_BtnAutoTest.EnableWindow(TRUE);
			m_BtnReset.EnableWindow(TRUE);
			break;
		case 1:
		case 2:
			m_BtnTest.EnableWindow(TRUE);
			m_BtnClean.EnableWindow(TRUE);
			m_BtnFeed.EnableWindow(TRUE);
			m_BtnGetStatus.EnableWindow(TRUE);
			m_BtnGetData.EnableWindow(TRUE);
			m_BtnAutoTest.EnableWindow(FALSE);
			m_BtnReset.EnableWindow(TRUE);
			break;
		default:
			break;
		}
	}
	else
	{
		m_BtnInit.SetWindowText("初始化");
		m_BtnTest.EnableWindow(FALSE);
		m_BtnClean.EnableWindow(FALSE);
		m_BtnFeed.EnableWindow(FALSE);
		m_BtnGetStatus.EnableWindow(FALSE);
		m_BtnGetData.EnableWindow(FALSE);
		m_BtnAutoTest.EnableWindow(FALSE);
		m_BtnReset.EnableWindow(FALSE);

		CloseHandle(postRecvEvent);
		CloseHandle(read_os.hEvent);

		CloseHandle(postRecvEvent);
		CloseHandle(read_os.hEvent);

		if(hCommDev!=0)
		{
			CloseHandle(hCommDev);
			hCommDev=0;
		}

		TerminateThread(comThreadHwnd,1);

	}
}

void CFbycommuDlg::OnBtnreset() 
{
	// TODO: Add your control notification handler code here
	BYTE ChckSum=0;

	m_RecvDataVal+="复位:";
	int temp=m_Func.GetCurSel();
	switch(temp)
	{
	case 0:
		COMMAND[0]=0x9a;
		CMDLENGTH=1;
		SendCommand(COMMAND,1,0);
		bSending=0;
		bAddrOrCmd=0;
		break;
	case 1:
		COMMAND[0]=m_DevIDVal;
		COMMAND[1]=0xc0;
		CMDLENGTH=2;
		SendCommand(COMMAND,1,3);
		bSending=0;
		bAddrOrCmd=1;
		break;
	case 2:
		COMMAND[0]=m_DevIDVal;
		ChckSum+=COMMAND[0];
		COMMAND[1]=0xc0;
		ChckSum+=COMMAND[1];
		COMMAND[2]=0x01;
		ChckSum+=COMMAND[2];
		COMMAND[3]=ChckSum;
		CMDLENGTH=4;
		SendCommand(COMMAND,1,3);
		bSending=1;
		bAddrOrCmd=0;
		break;
	default:
		break;
	}
	
}

void CFbycommuDlg::OnBtntest() 
{
	// TODO: Add your control notification handler code here
	BYTE ChckSum=0;

	m_RecvDataVal+="测量:";
	int temp=m_Func.GetCurSel();
	switch(temp)
	{
	case 0:
		COMMAND[0]=0x88;
		CMDLENGTH=1;
		SendCommand(COMMAND,1,0);
		bSending=0;
		bAddrOrCmd=0;
		break;
	case 1:
		COMMAND[0]=m_DevIDVal;
		COMMAND[1]=0x88;
		CMDLENGTH=2;
		SendCommand(COMMAND,1,3);
		bSending=0;
		bAddrOrCmd=1;
		break;
	case 2:
		COMMAND[0]=m_DevIDVal;
		ChckSum+=COMMAND[0];
		COMMAND[1]=0x88;
		ChckSum+=COMMAND[1];
		COMMAND[2]=0x01;
		ChckSum+=COMMAND[2];
		COMMAND[3]=ChckSum;
		CMDLENGTH=4;
		SendCommand(COMMAND,1,3);
		bSending=1;
		bAddrOrCmd=0;
		break;
	default:
		break;
	}
}

void CFbycommuDlg::OnSelchangeCombofunc() 
{
	// TODO: Add your control notification handler code here
	char string1[10]="初始化";
	char string2[10]="";
	m_BtnInit.GetWindowText(string2,10);
	if(strcmp(string1,string2))
	{
		int temp=m_Func.GetCurSel();
		switch(temp)
		{
		case 0:
			m_BtnTest.EnableWindow(TRUE);
			m_BtnClean.EnableWindow(TRUE);
			m_BtnFeed.EnableWindow(TRUE);
			m_BtnGetStatus.EnableWindow(TRUE);
			m_BtnGetData.EnableWindow(TRUE);
			m_BtnAutoTest.EnableWindow(TRUE);
			m_BtnReset.EnableWindow(TRUE);
			break;
		case 1:
		case 2:
			m_BtnTest.EnableWindow(TRUE);
			m_BtnClean.EnableWindow(TRUE);
			m_BtnFeed.EnableWindow(TRUE);
			m_BtnGetStatus.EnableWindow(TRUE);
			m_BtnGetData.EnableWindow(TRUE);
			m_BtnAutoTest.EnableWindow(FALSE);
			m_BtnReset.EnableWindow(TRUE);
			break;
		default:
			break;
		}
	}
	else
	{
		m_BtnTest.EnableWindow(FALSE);
		m_BtnClean.EnableWindow(FALSE);
		m_BtnFeed.EnableWindow(FALSE);
		m_BtnGetStatus.EnableWindow(FALSE);
		m_BtnGetData.EnableWindow(FALSE);
		m_BtnAutoTest.EnableWindow(FALSE);
		m_BtnReset.EnableWindow(FALSE);
	}
}

int CFbycommuDlg::InitPort()
{
	char string[100];
	DCB dcb;

	PortInfo.Port=m_PortVal;

	if(hCommDev!=0)
	{
		sprintf(string,"The COM%d have been opened!",PortInfo.Port);
		MessageBox(string,"COM OPEN",MB_ICONEXCLAMATION);
		return -1;
	}

	//	open serial port
	sprintf(string,"COM%d",PortInfo.Port);
	hCommDev=CreateFile(string,GENERIC_READ|GENERIC_WRITE,
		0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
		NULL);

	if(hCommDev==(HANDLE)-1)
	{
		sprintf(string,"OpenComPort COM%d failed!",PortInfo.Port);
		MessageBox(string,"COM OPEN",MB_ICONEXCLAMATION);
		GetLastError();
		CloseHandle(hCommDev);
		return -1; //INVALID_HANDLE_VALUE;
	}
	comMask=SetCommMask(hCommDev,EV_RXCHAR|EV_TXEMPTY); 
	comBuf=SetupComm(hCommDev,1024,1024);

	dcb.DCBlength=sizeof(DCB);
	comState=GetCommState(hCommDev,&dcb);
	int SelectID=m_BaudRate.GetCurSel();
	switch(SelectID)
	{
	case 0:
		PortInfo.BaudRate=300;
		break;
	case 1:
		PortInfo.BaudRate=600;
		break;
	case 2:
		PortInfo.BaudRate=1200;
		break;
	case 3:
		PortInfo.BaudRate=2400;
		break;
	case 4:
		PortInfo.BaudRate=4800;
		break;
	case 5:
		PortInfo.BaudRate=9600;
		break;
	case 6:
		PortInfo.BaudRate=19200;
		break;
	default:
		break;
	}
	dcb.BaudRate=PortInfo.BaudRate;
	dcb.fBinary=true;
	SelectID=m_Func.GetCurSel();
	switch(SelectID)
	{
	case 1:
	case 2:
		dcb.fParity=true;
		dcb.Parity=3;
		break;
	default:
		dcb.fParity=false;
		dcb.Parity=0;
		break;
	}
	dcb.fOutxCtsFlow=false;
	dcb.fOutxDsrFlow=false;
	dcb.fDtrControl=DTR_CONTROL_ENABLE;
	dcb.fDsrSensitivity=false;
	dcb.fOutX=false;
	dcb.fInX=false;
	dcb.fErrorChar=false;
	dcb.fRtsControl=RTS_CONTROL_ENABLE;
	dcb.ByteSize=8;
	dcb.StopBits=0;

	if(!SetCommState(hCommDev,&dcb))
	{
		CloseHandle(hCommDev);
		GetLastError();
		MessageBox("SetCommState failed!!!","SetCommState",MB_ICONEXCLAMATION);
		return -1;
	}
	
	COMMTIMEOUTS CommTimeOuts;
	CommTimeOuts.ReadIntervalTimeout=MAXDWORD;
	CommTimeOuts.ReadTotalTimeoutMultiplier=0;
	CommTimeOuts.ReadTotalTimeoutConstant=0;
	CommTimeOuts.WriteTotalTimeoutMultiplier=0;
	CommTimeOuts.WriteTotalTimeoutConstant=2000;
	SetCommTimeouts(hCommDev,&CommTimeOuts);


	memset(&read_os,0,sizeof(OVERLAPPED));
	postRecvEvent=CreateEvent(NULL,TRUE,TRUE,NULL);
	ASSERT(postRecvEvent);
	read_os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
	ASSERT(read_os.hEvent);
	postRecvHwnd=m_hWnd;

	memset(&write_os,0,sizeof(OVERLAPPED));
	postSendEvent=CreateEvent(NULL,TRUE,TRUE,NULL);
	ASSERT(postSendEvent);
	write_os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
	ASSERT(write_os.hEvent);
	postSendHwnd=m_hWnd;

	comThreadHwnd=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,
		(LPTHREAD_START_ROUTINE)CommWatchThread,
		(LPVOID)NULL,0 ,&dwThreadID);

	PurgeComm(hCommDev,PURGE_TXCLEAR);
	PurgeComm(hCommDev,PURGE_RXCLEAR);
	return 1; 

}



void CFbycommuDlg::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	CloseHandle(postRecvEvent);
	CloseHandle(read_os.hEvent);

	CloseHandle(postRecvEvent);
	CloseHandle(read_os.hEvent);

	if(hCommDev!=0) CloseHandle(hCommDev);

	TerminateThread(comThreadHwnd,1);

	CDialog::OnClose();
}

LRESULT CFbycommuDlg::OnCommRecvNotify(WPARAM wParam,LPARAM lParam)
{
	BYTE strRecvBuf[4096];
	DWORD iRecvStrLen;
	char tempchar[10];
	DWORD i;

	ClearCommError(hCommDev,&dwErrorFlag,&comStat);
	iRecvStrLen=comStat.cbInQue;
	if(iRecvStrLen>0)
	{
		BOOL bReturn=ReadFile(hCommDev,strRecvBuf,
			iRecvStrLen,&iRecvStrLen,&read_os);
		if(!bReturn)
		{
			if(ERROR_IO_PENDING==GetLastError())
				if(WaitForSingleObject(read_os.hEvent,100))
					iRecvStrLen=0;
			MessageBox("Error on ReadFile!");
		}
		if(strRecvBuf[0]==m_DevIDVal&&bAddrOrCmd)
		{
			CMDLENGTH-=1;
			if(CMDLENGTH>0)	SendCommand(&COMMAND[1],CMDLENGTH,4);
			bAddrOrCmd=0;
			bSending=0;
		}
		for(i=0;i<iRecvStrLen;i++)
		{
			if(	m_RadioDecHexVal==0)sprintf(tempchar,"%d,",strRecvBuf[i]);
			else sprintf(tempchar,"%XH,",strRecvBuf[i]);
			m_RecvDataVal+=tempchar;
		}
	}
	SetEvent(postRecvEvent);
	UpdateData(FALSE);

	return TRUE;
}

LRESULT CFbycommuDlg::OnCommSendNotify(WPARAM wParam,LPARAM lParam)
{

	ClearCommError(hCommDev,&dwErrorFlag,&comStat);
	DWORD iSendStrLen=comStat.cbInQue;
	if(iSendStrLen==0)
	{
		if(bSending)
		{
			CMDLENGTH-=1;
			if(CMDLENGTH>0)	SendCommand(&COMMAND[1],CMDLENGTH,4);
			bAddrOrCmd=0;
			bSending=0;
		}
	}
	SetEvent(postSendEvent);
	return TRUE;
}


//改变奇偶校验位
BYTE CFbycommuDlg::ChangeParity(BYTE ParityMark)
{
	GetCommState(hCommDev,&dcb);
	if(!ParityMark)	dcb.fParity=false;
	else dcb.fParity=true;
	dcb.Parity=ParityMark;
	SetCommState(hCommDev,&dcb);

	GetCommState(hCommDev,&dcb);
	return dcb.Parity ;
}

BOOL CFbycommuDlg::SendCommand(BYTE *CommandArray, DWORD CommandLength, BYTE ParityMark)
{
	DWORD dwBytesWritten;

	EscapeCommFunction(hCommDev,SETRTS);
	ChangeParity(ParityMark);
	if(!WriteFile(hCommDev,CommandArray,CommandLength,&dwBytesWritten,&write_os))
	{
		ClearCommError(hCommDev,&dwErrorFlag,&comStat);
		return FALSE;
	}
	ClearCommError(hCommDev,&dwErrorFlag,&comStat);
	EscapeCommFunction(hCommDev,CLRRTS);

	return TRUE;
}



void CFbycommuDlg::OnRadiodec() 
{
	// TODO: Add your control notification handler code here
	m_RadioDecHexVal=0;
	UpdateData(FALSE);
}

void CFbycommuDlg::OnRadiohex() 
{
	// TODO: Add your control notification handler code here
	m_RadioDecHexVal=1;
	UpdateData(FALSE);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -