📄 sercommdlg.cpp
字号:
{
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 + -