📄 uartdlg.cpp
字号:
case 1006:
GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("lost!"));
break;
//comEventRxOver 1008 Receive Buffer Overflow. There is no room in the receive buffer.
case 1008:
GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("Receive Buffer Overrun!"));
break;
case 1009:
GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("Parity Error!"));
break;
//comEventTxFull 1010 Transmit Buffer Full. The transmit buffer was full while trying to queue a character.
case 1010:
GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("Transmit Buffer Overrun!"));
break;
//comEventDCB 1011 Unexpected error retrieving Device Control Block (DCB) for the port.
case 1011:
GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("Unexpected error!"));
break;
}
UpdateData(false);
}
void CUartDlg::OnReset() // 重置
{
int i;
m_mscomm.SetOutBufferCount(0); //清空输出缓冲区
m_mscomm.SetInBufferCount(0); //清空输入缓冲区
m_pThread = NULL;
//m_bOpen = false;
//m_bRxShowPause = false;
m_cTxCycleIndex = 0;
m_cErrCycleIndex = 0;
m_iPicIndex = 0;//=========
for(i=0;i<RX_BUF_SIZE;i++) m_RxBuf[i] = 0; //清空接收缓冲区
for(i=0;i<TX_BUF_SIZE;i++) m_TxBuf[i] = 0; //清空发送缓冲区
m_iTxByteCounterConv = 0;
//
RX_TRIG = 360;
m_iCountRxByte = 0;
m_iCountTxByte = 0;
m_iErrCycleNum = 180;
m_bErrDetect = true;
m_iRxBitNum = 0;
m_iErrBitNum = 0;
m_fErrBitRate = 0.0;
m_iRxPacketNum = 0;
m_iErrPacketNum = 0;
m_fErrPacketRate = 0.0;
m_strRxEdit.Empty();
m_bRxHex = true;
m_strTxEdit.Empty();
m_bTxHex = true;
m_bTxCycle = true;
m_iTxCycleNum = 180;
m_bTxAutoSpan = false;
//m_iTxAutoSpan = 1000;
m_bTxAutoCts = false;
//m_bTxStopAuto = true;
//m_iTxStopByte = 100;
//m_bStatusBreak = false;
//m_bStatusCts = false;
//m_bStatusDcd = false;
//m_bStatusDsr = false;
//m_bStatusDtr = false;
//m_bStatusRing = false;
//m_bStatusRts = false;
m_strFileName.Empty();
//GetDlgItem(IDC_STATIC_OPEN)->ShowWindow(SW_HIDE);
//((CEdit *)GetDlgItem(IDC_STATUS_RTS))->EnableWindow(false);
//((CEdit *)GetDlgItem(IDC_STATUS_DTR))->EnableWindow(false);
//((CEdit *)GetDlgItem(IDC_STATUS_BREAK))->EnableWindow(false);
//((CEdit *)GetDlgItem(IDC_STATUS_CTS))->EnableWindow(false);
//((CEdit *)GetDlgItem(IDC_STATUS_DSR))->EnableWindow(false);
//((CEdit *)GetDlgItem(IDC_STATUS_RING))->EnableWindow(false);
//((CEdit *)GetDlgItem(IDC_STATUS_DCD))->EnableWindow(false);
//((CEdit *)GetDlgItem(IDC_TX_EDIT))->EnableWindow(false);
//((CEdit *)GetDlgItem(IDC_TX_HEX))->EnableWindow(false);
//((CEdit *)GetDlgItem(IDC_TX_AUTO_SPAN_SEL))->EnableWindow(false);
//((CEdit *)GetDlgItem(IDC_TX_AUTO_CTS))->EnableWindow(false);
//((CEdit *)GetDlgItem(IDC_TX_MANUAL))->EnableWindow(false);
//((CEdit *)GetDlgItem(IDC_RX_FRESH))->EnableWindow(false);
/////
UpdateData(false);
}
void CUartDlg::OnOption()
{
UpdateData(true);
CDlgOption DlgOption;
if(DlgOption.DoModal() == IDOK)
{
g_iTxThreadPriority = DlgOption.m_iTxThreadPriority; //=============
RX_TRIG = DlgOption.m_iRxTrig;
}
}
void CUartDlg::ShowTxActualRate()
{
m_tClockEnd = clock();
if( m_tClockEnd-m_tClockStart < 4000 ) return;
float TxBitRate = (float)m_iTxByteCounterConv*8 / (m_tClockEnd-m_tClockStart);
CString str_bit_rate;
str_bit_rate.Format(_T("实际速率:%.2fkbit/s"),TxBitRate);
GetDlgItem(IDC_STATIC_BIT_RATE_SHOW)->SetWindowText(str_bit_rate);
}
void CUartDlg::DlgErrorDeal(err_code_type nErrCode)
{
switch(nErrCode)
{
case SrcDataFrmErr:
m_bTxAutoSpan = false;
m_bTxAutoCts = false;
UpdateData(false);
((CEdit *)GetDlgItem(IDC_OPEN_PORT))->EnableWindow(true);
((CEdit *)GetDlgItem(IDC_TX_AUTO_SPAN_SEL))->EnableWindow(true);
((CEdit *)GetDlgItem(IDC_TX_AUTO_CTS))->EnableWindow(true);
((CEdit *)GetDlgItem(IDC_TX_MANUAL))->EnableWindow(true);
GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("数据错误!"));
AfxMessageBox("Input data error!");
break;
case OtherErr:
break;
};//switch(nErrCode)
}
void CUartDlg::OnButtonSaveFile()
{
// TODO: Add your control notification handler code here
CTime ctime = CTime::GetCurrentTime();//COleDateTime
int iYear, iMonth, iDay, iHour, iMinute, iSecond;
iYear = ctime.GetYear();
iMonth = ctime.GetMonth();
iDay = ctime.GetDay();
iHour = ctime.GetHour();
iMinute = ctime.GetMinute();
iSecond = ctime.GetSecond();
CString strDefaultFileName="", strFileNameFilter;
strDefaultFileName.Format(_T("%02d月-%02d日-%02d时-%02d分.txt"), iMonth, iDay, iHour, iMinute);
strFileNameFilter = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");
CFileDialog FileSaveDlg(false, "txt", strDefaultFileName, OFN_OVERWRITEPROMPT, strFileNameFilter, NULL);
FileSaveDlg.m_ofn.lpstrTitle = _T("保存文件");
if (FileSaveDlg.DoModal() == IDOK)
{
m_strFileName = FileSaveDlg.GetPathName();
FILE *fp;
fp = fopen(m_strFileName, "a");
fprintf(fp, "==============================================================================================\n");
fprintf(fp, "%04d年-%02d月-%02d日-%02d时-%02d分-%02d秒\n", iYear, iMonth, iDay, iHour, iMinute, iSecond);
fprintf(fp, "接收数据:\n");
fclose(fp);
}
}
void CUartDlg::OnButtonStoreResult()
{
// TODO: Add your control notification handler code here
if( !m_strFileName.IsEmpty() )
{
FILE *fp;
fp = fopen(m_strFileName, "a");
CTime ctime = CTime::GetCurrentTime();
int iYear, iMonth, iDay, iHour, iMinute, iSecond;
iYear = ctime.GetYear();
iMonth = ctime.GetMonth();
iDay = ctime.GetDay();
iHour = ctime.GetHour();
iMinute = ctime.GetMinute();
iSecond = ctime.GetSecond();
fprintf(fp, "\n=========测试结果统计: %04d年-%02d月-%02d日-%02d时-%02d分-%02d秒========================================\n", iYear, iMonth, iDay, iHour, iMinute, iSecond);
fprintf(fp, "发送数据: 0x%02x - 0x%2x \n", 0, m_iErrCycleNum-1);
fprintf(fp, "接收比特数:%-6d\t\t错误比特数:%-6d\t\t误比特率:%.3f\t\t\n", m_iRxBitNum, m_iErrBitNum,m_fErrBitRate);
fprintf(fp, "接收包数: %-6d\t\t错误包数: %-6d\t\t误包率: %.3f\t\t\n", m_iRxPacketNum, m_iErrPacketNum,m_fErrPacketRate);
fprintf(fp, "==============================================================================================\n");
fprintf(fp,"\n\n\n");
fclose(fp);
}
}
//保存参数配置
void CUartDlg::IniFileStore(CString FileName)
{
FILE *fp;
fp = fopen(FileName, "w");
fprintf(fp, "%d\n", m_iIniPortNum);
fprintf(fp, "%d\n", m_iIniBaudRate);
fprintf(fp, "%d\n", m_iIniDataBit);
fprintf(fp, "%d\n", m_iIniCheckBit);
fprintf(fp, "%d\n", m_iIniStopBit);
fprintf(fp, "%d\n", m_bStatusBreak);
fprintf(fp, "%d\n", m_bStatusCts);
fprintf(fp, "%d\n", m_bStatusDcd);
fprintf(fp, "%d\n", m_bStatusDsr);
fprintf(fp, "%d\n", m_bStatusRing);
fprintf(fp, "%d\n", m_iIniPortNum);
fprintf(fp, "%d\n", m_bStatusRts);
fprintf(fp, "%d\n", m_bTxHex);
fprintf(fp, "%d\n", m_bTxCycle);
fprintf(fp, "%d\n", m_iTxCycleNum);
fprintf(fp, "%d\n", m_iTxAutoSpan);
fprintf(fp, "%d\n", m_bTxStopAuto);
fprintf(fp, "%d\n", m_iTxStopByte);
fprintf(fp, "%d\n", m_bRxHex);
fprintf(fp, "%d\n", m_bRxShowPause);
fprintf(fp, "%d\n", m_bErrDetect);
fprintf(fp, "%d\n", m_iErrCycleNum);
fprintf(fp, "%d\n", g_iTxThreadPriority);
fclose(fp);
}
void CUartDlg::IniFileLoad(CString FileName)
{
FILE *fp;
fp = fopen(FileName, "r");
fscanf(fp, "%d\n", &m_iIniPortNum);
fscanf(fp, "%d\n", &m_iIniBaudRate);
fscanf(fp, "%d\n", &m_iIniDataBit);
fscanf(fp, "%d\n", &m_iIniCheckBit);
fscanf(fp, "%d\n", &m_iIniStopBit);
fscanf(fp, "%d\n", &m_bStatusBreak);
fscanf(fp, "%d\n", &m_bStatusCts);
fscanf(fp, "%d\n", &m_bStatusDcd);
fscanf(fp, "%d\n", &m_bStatusDsr);
fscanf(fp, "%d\n", &m_bStatusRing);
fscanf(fp, "%d\n", &m_iIniPortNum);
fscanf(fp, "%d\n", &m_bStatusRts);
fscanf(fp, "%d\n", &m_bTxHex);
fscanf(fp, "%d\n", &m_bTxCycle);
fscanf(fp, "%d\n", &m_iTxCycleNum);
fscanf(fp, "%d\n", &m_iTxAutoSpan);
fscanf(fp, "%d\n", &m_bTxStopAuto);
fscanf(fp, "%d\n", &m_iTxStopByte);
fscanf(fp, "%d\n", &m_bRxHex);
fscanf(fp, "%d\n", &m_bRxShowPause);
fscanf(fp, "%d\n", &m_bErrDetect);
fscanf(fp, "%d\n", &m_iErrCycleNum);
fscanf(fp, "%d\n", &g_iTxThreadPriority);
fclose(fp);
}
void CUartDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
UpdateData(true);
m_iIniPortNum = ((CComboBox*)GetDlgItem(IDC_INI_PORT_NUM))->GetCurSel();//设置串口号
m_iIniBaudRate = ((CComboBox*)GetDlgItem(IDC_INI_BAUD_RATE))->GetCurSel();//设置波特率
m_iIniDataBit = ((CComboBox*)GetDlgItem(IDC_INI_DATA_BIT))->GetCurSel();//设置数据位
m_iIniCheckBit = ((CComboBox*)GetDlgItem(IDC_INI_CHECK_BIT))->GetCurSel();//2 Even parity. 3 Mark parity. 0 No parity. 1 Odd parity. 4 Space parity.
m_iIniStopBit = ((CComboBox*)GetDlgItem(IDC_INI_STOP_BIT))->GetCurSel();//0=1 stop bit. 1=1.5 stop bits. 2=2 stop bits.
IniFileStore(m_strIniFileName);
CDialog::OnClose();
}
void CUartDlg::OnButtonPicbrowse()
{
// TODO: Add your control notification handler code here
CFileDialog PicFileOpen(TRUE,NULL,NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"All Files(*.*)|*.*|Bmp Files(*.bmp)|*.bmp|Jpg Files(*.jpg)|*.jpg|Mp3 Files(*.mp3)|*.mp3|Wav Files(*.wav)|*.wav|",
AfxGetMainWnd());
if( PicFileOpen.DoModal()==IDOK)
{
// CString strFileName = PicFileOpen.GetFileName(); //文件名
// CString strFileExt = PicFileOpen.GetFileExt(); //扩展名
CString lpstrName = PicFileOpen.GetPathName(); // 路径名
m_strPicPath = lpstrName;
UpdateData(false);
}
int i = ((CComboBox*)GetDlgItem(IDC_INI_PIC_STYLE))->GetCurSel();
if((i = 0)||(i =1))
PICDlg::PicPreview(m_strPicPath); //8888888888实现图片的预览功能
CFile PicFile;
if(!PicFile.Open(m_strPicPath,CFile::modeRead))
{
AfxMessageBox("Failed to open the file!");
PicFile.Close();
}
m_iPicLength = PicFile.GetLength();
CString str;
str.Format("%d",m_iPicLength);
m_strPicLength =str;
UpdateData(false); // 在编辑窗口显示图片文件的大小
m_TxPicBuf = new BYTE [m_iPicLength];
if(!PicFile.Read(m_TxPicBuf,m_iPicLength)) //读取数据到发送缓冲区
{
AfxMessageBox("Failed to read the file!");
PicFile.Close();
}
PicFile.Close();
//以上准备数据、下面发送数据
}
void CUartDlg::OnButtonSendPic()
{
// TODO: Add your control notification handler code here
// TODO: Add your control notification handler code here
UpdateData(true);
if(m_bTxPicAutoCts) // 检测cts有效发送
{
TxBeginFunc(DetectCts);
m_mscomm.SetHandshaking(2);
switch(g_iTxThreadPriority) // 默认为3
{
case 0: m_pThread = AfxBeginThread(TransmitPictureCTS, this, THREAD_PRIORITY_TIME_CRITICAL, 0, 0, NULL);break;
case 1: m_pThread = AfxBeginThread(TransmitPictureCTS, this, THREAD_PRIORITY_HIGHEST, 0, 0, NULL);break;
case 2: m_pThread = AfxBeginThread(TransmitPictureCTS, this, THREAD_PRIORITY_ABOVE_NORMAL, 0, 0, NULL);break;
case 3: m_pThread = AfxBeginThread(TransmitPictureCTS, this, THREAD_PRIORITY_NORMAL, 0, 0, NULL);break;
case 4: m_pThread = AfxBeginThread(TransmitPictureCTS, this, THREAD_PRIORITY_BELOW_NORMAL, 0, 0, NULL);break;
case 5: m_pThread = AfxBeginThread(TransmitPictureCTS, this, THREAD_PRIORITY_LOWEST, 0, 0, NULL);break;
case 6: m_pThread = AfxBeginThread(TransmitPictureCTS, this, THREAD_PRIORITY_IDLE, 0, 0, NULL);break;
}
m_tClockStart = clock(); // 获取开始发送时间
if( m_mscomm.GetCTSHolding() )
{
SetEvent(m_hEventTxCts);
}
}
else
{
TxStopFunc(DetectCts, StopManual);
}
}
void CUartDlg::OnButtonSavepic()
{
// TODO: Add your control notification handler code here
int i = ((CComboBox*)GetDlgItem(IDC_INI_PIC_STYLE))->GetCurSel();
switch(i)
{
case 0: m_strPicSavePath+=".bmp"; break;
case 1: m_strPicSavePath+=".jpg"; break;
case 2: m_strPicSavePath+=".mp3"; break;
case 3: m_strPicSavePath+=".wav"; break;
default: break;
}
if(!m_PicFile.Open(m_strPicSavePath, CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate)) return;
m_PicFile.SeekToEnd();
LPTSTR lpsz =(LPTSTR)(LPCTSTR)m_strRecPic;
m_PicFile.Write(lpsz,m_strRecPic.GetLength());
m_bTxPicAutoCts = false; //888888888 还原标志
delete []m_TxPicBuf; //释放内存
m_PicFile.Flush();
m_PicFile.Close();
if((i = 0)||(i =1))
PICDlg2::PicPreview(m_strPicSavePath); //8888888888实现图片的预览功能
}
void CUartDlg::OnButtonPicSavePath()
{
// TODO: Add your control notification handler code here
CFileDialog PicFileSave(FALSE,NULL,NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"All Files(*.*)|*.*|Bmp Files(*.bmp)|*.bmp|Jpg Files(*.jpg)|*.jpg|",AfxGetMainWnd());
if( PicFileSave.DoModal()==IDOK)
{
// CString strFileName = PicFileOpen.GetFileName(); //文件名
// CString strFileExt = PicFileOpen.GetFileExt(); //扩展名
CString lpstrName = PicFileSave.GetPathName(); // 路径名
m_strPicSavePath = lpstrName;
UpdateData(false);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -