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

📄 scommtestdlg.cpp

📁 串口调试源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			pWndPopupOwner);	}
}

BEGIN_EVENTSINK_MAP(CSCommTestDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CSCommTestDlg)
	ON_EVENT(CSCommTestDlg, IDC_MSCOMM1, 1 /* OnComm */, OnOnComm, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()


void CSCommTestDlg::OpenCOM()
{	//打开串口

	m_ctrlComm.SetCommPort(m_com+1);		//设置打开com口
//	m_bPortOpen = 1;					//置打开状态为1
	m_ctrlComm.SetSettings(m_strSeting);	//设置端口
	m_ctrlComm.SetInputMode(1);					//以二进制方式捡取
	m_ctrlComm.SetRThreshold(1);				//当缓冲区中有一个以上字符时触发事件
	m_ctrlComm.SetDTREnable(TRUE);
	m_ctrlComm.SetRTSEnable(TRUE);
	if (!m_ctrlComm.GetPortOpen())			//如果端口没有打开
		m_ctrlComm.SetPortOpen(TRUE);		//则打开选定端口
	m_ctrlComm.SetInputLen(0);					//读取控件中缓冲区中全部内容
	m_ctrlComm.GetInput();						//预读缓冲区,清除残留数据
	ShowStatus();
}

CString CSCommTestDlg::parity(CString str)
{	//把奇偶校验位转换为规范的表示
	if (str == "None无")
		return "n";
	else if (str == "ODD奇")
		return "o";
	else if (str == "EVEN偶")
		return "e";
	else return "error";
}

void CSCommTestDlg::ChangSetting()
{
	UpdateData(TRUE);		//如果设置改变了则更新数据

	m_strSeting = m_baud+","+parity(m_check) +
				"," + m_data + "," + m_stop;	//重新设置打开设置
	if (m_ctrlComm.GetPortOpen())
		m_ctrlComm.SetPortOpen(FALSE);	//如果当前端口打开了则关上
	OpenCOM();						//重新打开
}

void CSCommTestDlg::OnOnComm() 
{
	// TODO: Add your control notification handler code here
	VARIANT variant_inp;
	COleSafeArray safearray_inp;
	LONG len,k;
	BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
	CString strtemp;
	
	if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
	{
		variant_inp=m_ctrlComm.GetInput(); //读缓冲区
		safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
		len=safearray_inp.GetOneDimSize(); //得到有效数据长度

		for(k=0;k<len;k++)
			safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
		for(k=0;k<len;k++) //将数组转换为Cstring型变量
		{
			BYTE bt=*(char*)(rxdata+k); //字符型
			if(m_ctrlHexDisplay.GetCheck())
				strtemp.Format("%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
			else 
				strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放

			m_strRXData+=strtemp; //加入接收编辑框对应字符串 
		}
	}
	UpdateData(FALSE); //更新编辑框内容

}

//由于这个转换函数的格式限制,在发送框中的十六制字符应该每两个字符之间插入一个空隔
//如:A1 23 45 0B 00 29
//CByteArray是一个动态字节数组,可参看MSDN帮助
int CSCommTestDlg::String2Hex(CString str, CByteArray &senddata)
{
	int hexdata,lowhexdata;
	int hexdatalen=0;
	int len=str.GetLength();

	senddata.SetSize(len/2);
	for(int i=0;i<len;)
	{
		char lstr,hstr=str[i];
		if(hstr==' ')
		{
			i++;
			continue;
		}
		i++;

		if(i>=len)break;
		
		lstr=str[i];
		hexdata=ConvertHexChar(hstr);
		lowhexdata=ConvertHexChar(lstr);

		#ifdef MSGBOX 
		if (hexdata == -1)
		{
			AfxMessageBox("输入字符超出16进制范围,无法按16进制正常发送",MB_ICONERROR);		//将高字符转换为16进制字符
			return -1;
		}
		if (lowhexdata == -1)	//再将低字符转换为16进制字符
		{
			AfxMessageBox("输入字符超出16进制范围,无法按16进制正常发送",MB_ICONERROR);		//将高字符转换为16进制字符
			return -1;
		}
		#endif

		if((hexdata==16)||(lowhexdata==16))
			break;
		else 
			hexdata=hexdata*16+lowhexdata;
		i++;
		senddata[hexdatalen]=(char)hexdata;
		hexdatalen++;
	}
	senddata.SetSize(hexdatalen);
	return hexdatalen;
}


//这是一个将字符转换为相应的十六进制值的函数
//好多C语言书上都可以找到
//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
char CSCommTestDlg::ConvertHexChar(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 return (-1);
}

void CSCommTestDlg::OnButtonManualsend() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE); //读取编辑框内容
//	m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送数据
	if(m_ctrlHexSend.GetCheck())
	{
		CByteArray hexdata;
		int len=String2Hex(m_strTXData,hexdata); //此处返回的len可以用于计算发送了多少个十六进制数
		m_ctrlComm.SetOutput(COleVariant(hexdata)); //发送十六进制数据
	}
	else 
		m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送ASCII字符数据
}

void CSCommTestDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_autosend.GetCheck())//m_bAutoSend
		OnButtonManualsend();	
	CDialog::OnTimer(nIDEvent);
}

void CSCommTestDlg::OnCheckAutosend() 
{
	
	// TODO: Add your control notification handler code here
	CButton * bn = (CButton *)GetDlgItem(IDC_BUTTON_MANUALSEND);   
	UpdateData(TRUE);
//	m_bAutoSend=!m_bAutoSend;
	if((m_autosend.GetCheck()&&m_ctrlComm.GetPortOpen()))
	{
		bn->EnableWindow(FALSE);
		SetTimer(1, atoi(m_time.GetBuffer(m_time.GetLength())), NULL);
	}
	else
	{
		bn->EnableWindow(TRUE);
		KillTimer(1);//取消定时
	}
}

void CSCommTestDlg::OnButtonXmtcls() 
{
	// TODO: Add your control notification handler code here
	m_strTXData="";
	SetDlgItemText(IDC_EDIT_TXDATA,"");	
}

void CSCommTestDlg::OnButtonRcvcls() 
{
	// TODO: Add your control notification handler code here
	m_strRXData="";
	SetDlgItemText(IDC_EDIT_RXDATA,"");		
}

void CSCommTestDlg::OnButtonClose() 
{
	// TODO: Add your control notification handler code here
	CButton * bn = (CButton *)GetDlgItem(IDC_BUTTON_MANUALSEND); //返回一个指向CWnd类的指针
	if (m_ctrlComm.GetPortOpen())
	{
		bn->EnableWindow(FALSE);//指定窗口使能禁止
		m_ctrlComm.SetPortOpen(FALSE);
		this->SetDlgItemText(IDC_BUTTON_CLOSE, "打开串口");
		//m_autosend.SetCheck(FALSE);
		KillTimer(1);//取消定时
	}
	else
	{	
		if(!m_autosend.GetCheck())
			bn->EnableWindow(TRUE);//指定窗口使能
		else 
			bn->EnableWindow(FALSE);
		m_ctrlComm.SetPortOpen(TRUE);
		this->SetDlgItemText(IDC_BUTTON_CLOSE, "关闭串口");
		if(m_autosend.GetCheck())
			SetTimer(1, atoi(m_time.GetBuffer(m_time.GetLength())), NULL);
	}
	ShowStatus();	
}

void CSCommTestDlg::ShowStatus()
{
	if (!m_ctrlComm.GetPortOpen())
		m_ctrlIcon.SetIcon((HICON)LoadImage(AfxGetApp()->m_hInstance,
		MAKEINTRESOURCE(IDI_ICON_CLOSE),
		IMAGE_ICON,
		GetSystemMetrics(SM_CXICON),
		GetSystemMetrics(SM_CXICON),
		0));	//显示关闭icon
	else
		m_ctrlIcon.SetIcon((HICON)LoadImage(AfxGetApp()->m_hInstance,
		MAKEINTRESOURCE(IDI_ICON_OPEN),
		IMAGE_ICON,
		GetSystemMetrics(SM_CXICON),
		GetSystemMetrics(SM_CXICON),
		0));	//显示打开icon
//	UpdateData(FALSE);
}

void CSCommTestDlg::OnSelchangeComboCom() 
{
	// TODO: Add your control notification handler code here
		UpdateData(TRUE);
	if (m_ctrlComm.GetPortOpen())
		m_ctrlComm.SetPortOpen(FALSE);	//如果当前端口打开了则关上
	OpenCOM();		
}

void CSCommTestDlg::OnSelchangeComboBaud() 
{
	// TODO: Add your control notification handler code here
	this->ChangSetting();
}

void CSCommTestDlg::OnSelchangeComboCheck() 
{
	// TODO: Add your control notification handler code here
	this->ChangSetting();
}

void CSCommTestDlg::OnSelchangeComboData() 
{
	// TODO: Add your control notification handler code here
	this->ChangSetting();
}

void CSCommTestDlg::OnSelchangeComboStop() 
{
	// TODO: Add your control notification handler code here
	this->ChangSetting();
}

⌨️ 快捷键说明

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