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

📄 sercommdlg.cpp

📁 本软件是一个用于串口通信的软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{
		case 0:
			b = 1200;
			break;
		case 1:
			b = 2400;
			break;
		case 2:
			b = 4800;
			break;
		case 3:
			b = 9600;
			break;
		case 4:
			b = 14400;
			break;
		case 5:
			b = 19200;
			break;
		case 6:
			b = 38400;
			break;
		case 7:
			b = 57600;
			break;
		case 8:
			b = 115200;
			break;
		default:
			break;
	}

	m_nBaud = b;

	if (m_Port.InitPort(this, m_nCom, m_nBaud, m_cParity, m_nDatabits, m_nStopbits, \
		m_dwCommEvents, 512))
	{
		if(m_bOpenPort)
			m_Port.StartMonitoring();
	}
	else
	{
		AfxMessageBox("没有成功,请重试");
	}		
}

void CSERCOMMDlg::OnSelchangeComboStopbits() 
{
	// TODO: Add your control notification handler code here
	int s = m_StopBits.GetCurSel() + 1;

	m_nStopbits = s;

	if (m_Port.InitPort(this, m_nCom, m_nBaud, m_cParity, m_nDatabits, m_nStopbits, \
		m_dwCommEvents, 512))
	{
		if(m_bOpenPort)
			m_Port.StartMonitoring();
	}
	else
	{
		AfxMessageBox("没有成功,请重试");
	}		
}

void CSERCOMMDlg::OnButtonHexsend() 
{
	// TODO: Add your control notification handler code here
	if(m_Port.m_hComm==NULL)
	{
		AfxMessageBox("串口没有打开,请打开串口");
		return;
	}
	else
	{
		if(m_bPeriodSending)
		{
			AfxMessageBox("操作无效,请关闭周期发送");
		}
		else
		{
			m_ctrlTxData.GetWindowText(m_TxData);

			int strLen = m_TxData.GetLength();

			if(strLen > 0)
			{
				char data[512];
				int  len = strtohex(m_TxData, data);  //转换为16进制

				if(len == -1)
				{
					AfxMessageBox("错误的输入!");
					return ;
				}
				else
				{
					m_Port.WriteToPort(data, len);	//发送数据
					m_nTxCount += len;
				}

				CString strTemp;                    //显示发送字符数
				strTemp.Format("TX:%ld", m_nTxCount);
				m_ctrlTxCount.SetWindowText(strTemp);	

				if(m_bPeriodSend)
				{
					SetTimer(2, m_nSendPeriod, NULL);
					m_bPeriodSending = TRUE;
				}

				m_bHexSend = TRUE;
				m_bAsciiSend = FALSE;
			}
		}		
	}
}

void CSERCOMMDlg::OnButtonAsciisend() 
{
	// TODO: Add your control notification handler code here
	if(m_Port.m_hComm==NULL)
	{
		AfxMessageBox("串口没有打开,请打开串口");
		return;
	}
	else
	{
		if(m_bPeriodSending)              //正在进行周期发送
		{
			AfxMessageBox("操作无效,请关闭周期发送");
		}
		else
		{
			m_ctrlTxData.GetWindowText(m_TxData);

			int strLen = m_TxData.GetLength();
 
			if(strLen > 0)
			{
				m_Port.WriteToPort((LPCTSTR)m_TxData);	//发送数据
				m_nTxCount += m_TxData.GetLength();

				CString strTemp;                        //显示发送字符数
				strTemp.Format("TX:%ld", m_nTxCount);
				m_ctrlTxCount.SetWindowText(strTemp);	

				if(m_bPeriodSend)
				{
					SetTimer(2, m_nSendPeriod, NULL);
					m_bPeriodSending = TRUE;
				}

				m_bHexSend = FALSE;
				m_bAsciiSend = TRUE;
			}
		}
	}
}

void CSERCOMMDlg::OnChangeEditSendPeriod() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	
	// TODO: Add your control notification handler code here
	CEdit *pEdit = (CEdit*) GetDlgItem(IDC_EDIT_SEND_PERIOD);
	CString strText;
	pEdit->GetWindowText(strText);
	m_nSendPeriod = atoi(strText);	
}

void CSERCOMMDlg::OnCheckPeriodSend() 
{
	// TODO: Add your control notification handler code here
	m_bPeriodSend = !m_bPeriodSend;

	if(!m_bPeriodSend)
	{
		if(m_bPeriodSending)
			KillTimer(2);

		m_bPeriodSending = m_bPeriodSend;
	}
}

void CSERCOMMDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	int   i, chr, chr1, chr2, chr3;
	long  strLen;		  //指定时间内接收到字符长度
	long  nLen;           //屏幕显示的字符长度
	CString strTemp1, strTemp2;

	switch(nIDEvent) {
		case 1:                                      //接收显示定时器
			//显示接收字符数
			strTemp1.Format("%ld", m_nRxCount);
			strTemp1 = "RX:" + strTemp1;
			m_ctrlRxCount.SetWindowText(strTemp1); 

			//保存接收文件
			if(m_bSaveRcvFile)
			{
				CFile rcvFile;

				SetCurrentDirectory( (LPCSTR)m_SaveRcvPath );

				if(!rcvFile.Open(m_RcvFileName, CFile::modeWrite))
				{
					AfxMessageBox( "打开接收文件失败!");
					return;
				}

				rcvFile.SeekToEnd();
				rcvFile.Write(m_RxData, m_RxData.GetLength());
				rcvFile.Close();
			}

			//显示接收字符
			if(!m_bStopDisplay)
			{
				if(m_bHexDispaly)                      //十六进制显示
					strTemp2 = m_RxData;
				else
				{
					strLen = m_RxData.GetLength();     //ASCII显示

					for(i = 0; i < strLen;)
					{
						chr1 = hextooc(m_RxData[i ++]);
						chr2 = hextooc(m_RxData[i ++]);
						chr3 = hextooc(m_RxData[i ++]);

						chr = 16 * chr1 + chr2;
						strTemp1.Format("%c", chr);
						strTemp2 += strTemp1;
					}
				}

				nLen = m_ctrlRxData.GetWindowTextLength();
				m_ctrlRxData.SetSel(nLen, nLen);
				m_ctrlRxData.ReplaceSel(strTemp2);

				//写入屏幕文件
				if(m_bSaveScrFile)
				{
					CFile scrFile;

					SetCurrentDirectory( (LPCSTR)m_SaveScrPath );

					if(!scrFile.Open(m_ScrFileName, CFile::modeWrite))
					{
						AfxMessageBox( "打开屏幕文件失败!");
						return;
					}

					scrFile.SeekToEnd();
					scrFile.Write(strTemp2, strTemp2.GetLength());
					scrFile.Close();
				}		
			}

			m_RxData.Empty();
			break;
			
		case 2:                                     //周期发送定时器    
			if(m_Port.m_hComm==NULL)
			{
				AfxMessageBox("串口没有打开,请打开串口");
				m_bPeriodSend = m_bPeriodSending = FALSE;
				KillTimer(2);
				return;
			}
			else
			{
				m_ctrlTxData.GetWindowText(m_TxData);

				int strLen = m_TxData.GetLength();

				if(strLen > 0)
				{
					if(m_bHexSend)
					{
						char data[512];
						int  len = strtohex(m_TxData, data);  //转换为16进制

						if(len == -1)
						{
							AfxMessageBox("错误的输入!");
							m_bPeriodSend = m_bPeriodSending = FALSE;
							KillTimer(2);	
							return ;
						}
						else
						{
							m_Port.WriteToPort(data, len);	//发送数据
							m_nTxCount += len;
						}				
					}
					else
					{
						m_Port.WriteToPort((LPCTSTR)m_TxData);	//发送数据
						m_nTxCount += m_TxData.GetLength();	
					}

					CString strTemp;                        //显示发送字符数
					strTemp.Format("TX:%ld", m_nTxCount);
					m_ctrlTxCount.SetWindowText(strTemp);	
		
					if(m_bPeriodSend)
					{
						SetTimer(2, m_nSendPeriod, NULL);
						m_bPeriodSending = TRUE;
					}
				}
				else
				{
					m_bPeriodSend = m_bPeriodSending = FALSE;
					KillTimer(2);	
					return ;
				}
			}			
			break;

		default:
			break;
	}

	CDialog::OnTimer(nIDEvent);
}

void CSERCOMMDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
	KillTimer(1);      //清除定时器1

	if(m_bPeriodSending)
		KillTimer(2);      //清除定时器2

	m_Port.ClosePort(); //关闭串口
	m_RxData.Empty();  //清空接收数据字符串	
}

int CSERCOMMDlg::hextooc(int chr)
{
	if(chr >= '0' && chr <= '9')
		chr -= '0';
	else if(chr >= 'A' && chr <= 'F')
		chr = chr - 'A' + 10;
	else if(chr >= 'a' && chr <= 'f')
		chr = chr - 'a' + 10;
	else
		chr = -1;

	return chr;
}

int CSERCOMMDlg::strtohex(CString str, char *data)
{
	int ignor_sChar = FALSE;
	int len = 0;
	int fChar, sChar;		      //第一个字符,第二个字符
	int strLen = str.GetLength();

	for(int i = 0; i < strLen;)
	{
		fChar = hextooc(str[i ++]);
	
		if(i < strLen)
			sChar = hextooc(str[i ++]);
		else
			ignor_sChar = TRUE;

		if(i < strLen)
			i ++;

		if(fChar == -1 || sChar == -1)
			return -1;
		
		if(ignor_sChar)
			data[len ++] = fChar;
		else
			data[len ++] = fChar * 16 + sChar;
	}

	return len;
}

void CSERCOMMDlg::OnButtonSaveRcvFile() 
{
	// TODO: Add your control notification handler code here
	CString strTemp;
	CFileFind findfile;

	m_bSaveRcvFile = !m_bSaveRcvFile;

	if(m_bSaveRcvFile)
	{
		char       buf[30];   
		CFile      m_recFile;
		CFileFind  m_filefind;

		SetCurrentDirectory( (LPCSTR)m_SaveRcvPath );

		//文件名为Rec**.txt,以下代码自动检测文件名是否存在,若存在,则后面序号自动递增
		//如Rec00.txt Rec01.txt,程序自动为正要保存的文件命名为Rec02.txt.
		for(int j = 0; j < 100; j ++)
		{
			sprintf(buf, "Rec%02d.txt", j);
			m_RcvFileName.Format("%s", buf);
			strTemp = m_SaveRcvPath + m_RcvFileName;

			if(!m_filefind.FindFile(strTemp, 0))
				break;
		}
    
		if(!m_recFile.Open(m_RcvFileName, CFile::modeCreate | CFile::modeWrite )) 
		{
			AfxMessageBox( "创建接收文件失败!");
			return;
		}

		m_filefind.Close();
		m_recFile.Close();

		//显示保存接收文件
		strTemp = "Saving in:" + m_SaveRcvPath + m_RcvFileName;       
		m_ctrlSaveRcvPath.SetWindowText(strTemp);

		m_ctrlSaveRcvFile.SetWindowText("停止保存接收文件");
	}
	else
	{
		strTemp = "Path: " + m_SaveRcvPath;        //显示接收文件保存目录
		m_ctrlSaveRcvPath.SetWindowText(strTemp);
		m_ctrlSaveRcvFile.SetWindowText("保存接收文件");
	}
}


void CSERCOMMDlg::OnButtonSaveScrFile() 
{
	// TODO: Add your control notification handler code here
	CString strTemp;
	
	m_bSaveScrFile = !m_bSaveScrFile;

	if(m_bSaveScrFile)
	{
		char       buf[30];
		CFile      m_recFile;
		CFileFind  m_filefind;

		SetCurrentDirectory( (LPCSTR)m_SaveScrPath );

		//文件名为Rec**.txt,以下代码自动检测文件名是否存在,若存在,则后面序号自动递增
		//如Rec00.txt Rec01.txt,程序自动为正要保存的文件命名为Rec02.txt.
		for(int j = 0; j < 100; j ++)
		{
			sprintf(buf, "Rec%02d.txt", j);
			m_ScrFileName.Format("%s", buf);
			strTemp = m_SaveScrPath + m_ScrFileName;

			if(!m_filefind.FindFile(strTemp, 0))
				break;
		}
    
		if(!m_recFile.Open(m_ScrFileName, CFile::modeCreate | CFile::modeWrite )) 
		{
			AfxMessageBox( "创建屏幕文件失败!");
			return;
		}

		m_filefind.Close();
		m_recFile.Close();

		//显示保存接收文件
		strTemp = "Saving in:" + m_SaveScrPath + m_ScrFileName;       
		m_ctrlSaveScrPath.SetWindowText(strTemp);

		m_ctrlSaveScrFile.SetWindowText("停止保存屏幕文件");		
	}
	else
	{
		strTemp = "Path: " + m_SaveScrPath;		   //显示屏幕文件保存目录
		m_ctrlSaveScrPath.SetWindowText(strTemp);
		m_ctrlSaveScrFile.SetWindowText("保存屏幕文件");
	}
}

⌨️ 快捷键说明

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