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

📄 comdlg.cpp

📁 运用通信API编写串口通信。 功能:1)通过串口进行数据的收发并在接收端显示收到的数据 2)打开串口
💻 CPP
📖 第 1 页 / 共 2 页
字号:
						data.pop_front();
				}
				
			}else
				data.pop_front();
		}
		if((is == TRUE)&&(data.size()>5)){
			length= data.at(3)*256+data.at(4);
			i=3;
			int num=0;
			while(is ){
				
				if(data.at(i) == 0XFF&&((i+2)<data.size())){				
					if(data.at(i+1)==0XFF&&data.at(i+2)==0XFB){
						data.erase(data.begin(),(data.begin()+i-1));
						is =FALSE;						
					}
				}
				if(is&&data[i] == 0XFB&&(i+1)<data.size()){
					if(data[i+1] == 0XFB&&(num == length+3)){
						sum = sum - data[i-1];
						is = FALSE;
						correct = TRUE;
					}else if(data[i+1] == 0XFB&&(num != length+3)){
						data.erase(data.begin(),(data.begin()+i));
						is = FALSE;
					}else{
						sum += data[i];
						num++;
						if(num > (length+4)){
							data.erase(data.begin(),(data.begin()+i-1));
							correct = FALSE;
							is = FALSE;
						}
					}
				}else if(is == TRUE){
					sum += data[i];
					num++;
					if(num > (length+4)){
						data.erase(data.begin(),(data.begin()+i-1));
						correct = FALSE;
						is = FALSE;
					}
				}
				
				if(is&&(i==(data.size()-1))){
					is = FALSE;
					next = TRUE;
				}
				
				i++;				
			}
			
			if(correct){				
				sum = sum % 256;
				if(sum == data.at(length+5)&&(data.at(length+6)==0XFB)&&(data.at(length+7)==0XFB)){
					
					for(i=0;i<(length+8);i++){
						Output[i] = data.at(0);
						
						r.Format("%02X ",Output[i]);
						
						recvStr += r;
						data.pop_front();
					}
					display = TRUE;
				}else{
					data.erase(data.begin(),(data.begin()+length+7));
					
				}
				if(!data.empty()){
					retr = TRUE;
					is = FALSE;	
					correct = FALSE;
				}
			}else if(!data.empty()&&next){
				retr = FALSE;
			}else
				retr = TRUE;
		}else
			retr = FALSE;
		
	}
	
	if(display == TRUE){
		return TRUE;			
	}else{
		return FALSE;
	}
	
	
}


void CComDlg::OnButtonCloseport() 
{
	// TODO: Add your control notification handler code here
    fEventRun=FALSE;
	WaitForSingleObject(hThreadEvent,INFINITE);
	CloseHandle(hThreadEvent);	
	CloseHandle(m_hCom);			
	m_btnClosePort.EnableWindow(FALSE);
	m_btnSend.EnableWindow(FALSE);	
	m_btnConfig.EnableWindow(TRUE);
}

void CComDlg::OnButtonSend() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	if (m_strSend!="") {
		Writecom(m_strSend);
		m_strSend += "\15\12";
		m_editReceive.ReplaceSel("send: "+m_strSend);      //to update display
	}
	else
		MessageBox("please input data!");
	
}

void CComDlg::OnButtonConfig() 
{
	// TODO: Add your control notification handler code here
	CString strStatus,strTemp;
	if(myconfig.DoModal()==IDOK)	
	{
		UpdateData(TRUE);
		switch (myconfig.m_intPort)	
		{
		case 0:
			{
				strStatus="COM1";
				myCom="COM1";
				break;
			}
		case 1:
			{
				strStatus="COM2";
				myCom="COM2";
				break;
			}
		case 2:
			{
				strStatus="COM3";
				myCom="COM3";
				break;
			}
		case 3:
			{
				strStatus="COM4";
				myCom="COM4";
				break;
			}
		case 4:
			{
				strStatus="COM5";
				myCom="COM5";
			}
			break;
		case 5:
			{
				strStatus="COM6";
				myCom="COM6";
			}
			break;
		case 6:
			{
				strStatus="COM7";
				myCom="COM7";
				break;
			}
		case 7:
			{
				strStatus="COM8";
				myCom="COM8";
				break;
			}
		case 8:
			{
				strStatus="COM9";
				myCom="COM9";
				break;
			}
		}
		strStatus+=",";
		switch(myconfig.m_intBaud)	
		{
		case 0:
			{
				strStatus+="38400";
				myBaudRate=CBR_38400;
				break;
			}
		case 1:
			{
				strStatus+="19200";
				myBaudRate=CBR_19200;
				break;
			}
		case 2:
			{
				strStatus+="9600";
				myBaudRate=CBR_9600;
				break;
			}
		case 3:
			{
				strStatus+="4800";
				myBaudRate=CBR_4800;
				break;
			}
		case 4:
			{
				strStatus+="2400";
				myBaudRate=CBR_2400;
				break;
			}
		case 5:
			{
				strStatus+="1200";
				myBaudRate=CBR_1200;
				break;
			}
		
		}
		strStatus+=",";
		switch(myconfig.m_intParity)		
		{
		case 0:
			{
				myfParity=FALSE;
				myParity=NOPARITY;
				strStatus+="N";
				break;
			}
		case 1:
			{
				myfParity=TRUE;
				myParity=ODDPARITY;
				strStatus+="O";
				break;
			}
		case 2:
			{
				myfParity=TRUE;
				myParity=EVENPARITY;
				strStatus+="E";
				break;
			}
		case 3:
			{
				myfParity=TRUE;
				myParity=MARKPARITY;
				strStatus+="M";
				break;
			}
		case 4:
			{
				myfParity=TRUE;
				myParity=SPACEPARITY;
				strStatus+="S";
				break;
			}
		}
		strStatus+=",";
		myByteSize=myconfig.m_intData+5; 
		strTemp.Format("%d",myByteSize);
		strStatus+=strTemp;
		strStatus+=",";
		switch(myconfig.m_intStop)		
		{
		case 0:
			{
				strStatus+="1";
				myStopBits=ONESTOPBIT;
				break;
			}
		case 1:
			{
				strStatus+="1.5";
				myStopBits=ONE5STOPBITS;
				break;
			}
		case 2:
			{
				strStatus+="2";
				myStopBits=TWOSTOPBITS;
				break;
			}
		}
		
		strStatus="COM___"+strStatus;			
		this->SetWindowText(strStatus);
		UpdateData(FALSE);
		m_btnOpenPort.EnableWindow(TRUE);	
		m_btnClosePort.EnableWindow(FALSE);
		m_btnConfig.EnableWindow(FALSE);
		}
		
}



void CComDlg::Writecom(CString strInput)
{
	UpdateData(TRUE);	
	int		length;
	DWORD	dwErrorFlags;
	COMSTAT ComStat;
	BYTE	MySendByte[1000];
	DWORD	nLength=0;


	length=ConvertString(m_strSend,MySendByte);

	ClearCommError(m_hCom,&dwErrorFlags,&ComStat);

	BOOL fState=WriteFile(m_hCom,MySendByte,length,&nLength,&Wol);
	if(!fState)
	{
		ULONG my_error=GetLastError();
		if(my_error==ERROR_IO_PENDING)
		{
			GetOverlappedResult(m_hCom,&Wol,&nLength,TRUE);
		}
		else
			nLength=0;
	}

}

void CComDlg::OnButtonC() 
{
	// TODO: Add your control notification handler code here

    SetFocus();
    m_editReceive.SetSel(0,-1);		
    m_editReceive.Clear();
    m_editSend.Clear();
}


char CComDlg::ConvertSingleChar(char ch)
{
	if((ch>='0')&&(ch<='9'))
		return ch-0x30;
	else if((ch>='A')&&(ch<='F'))
		return ch-'A'+10;
	else if((ch>='a')&&(ch<='f'))
		return ch-'a'+10;
	else
		AfxMessageBox("Please input the number from '0' to '9' or the character from '/A/a' to 'F/f' ");
	return -1;
}

int CComDlg::ConvertString(CString str, BYTE SendData[])
{
    int highhexdata,lowhexdata;
	int hexdatalen=0;
	int len=str.GetLength();
	for(int i=0;i<len;)
	{
		char lstr,hstr=str[i];
		if(hstr==' ')
		{
			i++;
			continue;
		}
		i++;
		if(i>=len)
			break;
		lstr=str[i];
		highhexdata=ConvertSingleChar(hstr);
		lowhexdata=ConvertSingleChar(lstr);
		if((highhexdata==16)||(lowhexdata==16))
			break;
		else 
			highhexdata=highhexdata*16+lowhexdata;
		i++;
		SendData[hexdatalen]=(char)highhexdata;
		hexdatalen++;
	}
	return hexdatalen;
}

HBRUSH CComDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
	// TODO: Change any attributes of the DC here
	  if(nCtlColor==CTLCOLOR_EDIT)
        pDC->SetTextColor(RGB(0,0,255));    
    if(nCtlColor== CTLCOLOR_LISTBOX)
    {
        HBRUSH m_hbrush;
        m_hbrush=CreateSolidBrush(RGB(0,0,0));
        pDC->SetBkMode(TRANSPARENT);
        pDC->SetTextColor(RGB(255,255,255));
        return m_hbrush;
    }
    CBrush m_cBrush;
    m_cBrush.CreateSolidBrush(RGB(0,255,255));
    switch(nCtlColor)
    {
    case CTLCOLOR_DLG:
        pDC->SetBkMode(TRANSPARENT);
       break;
    case CTLCOLOR_STATIC:
        pDC->SetTextColor(RGB(255,0,0));
        pDC->SetBkColor(RGB(0,255,255));      
        break;
    }
    DeleteObject(m_cBrush);

	// TODO: Return a different brush if the default is not desired
	return hbr;
}

⌨️ 快捷键说明

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