📄 uartdlg.cpp
字号:
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.
switch(m_iIniPortNum)//设置串口号
{
case 0: { m_mscomm.SetCommPort(1); break; }
case 1: { m_mscomm.SetCommPort(2); break; }
}
m_mscomm.SetInBufferSize(RX_BUF_SIZE);
m_mscomm.SetOutBufferSize(TX_BUF_SIZE);
if( !m_mscomm.GetPortOpen())
{
m_mscomm.SetPortOpen(TRUE);
GetDlgItem(IDC_STATIC_OPEN)->SetWindowText(_T("OK!"));
GetDlgItem(IDC_STATIC_OPEN)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("串口已打开!"));
}
else
{
GetDlgItem(IDC_STATIC_OPEN)->SetWindowText(_T("ERR!"));
GetDlgItem(IDC_STATIC_OPEN)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("串口错误!"));
return;
}
switch(m_iIniBaudRate)//设置波特率
{
case 0: { setstr.Format(_T("%d,"),9600); break; }
case 1: { setstr.Format(_T("%d,"),38400); break; }
}
switch(m_iIniCheckBit)//设置校验位
{
case 0: { setstr += _T("n,"); break; }
case 1: { setstr += _T("o,"); break; }
case 2: { setstr += _T("e,"); break; }
}
switch(m_iIniDataBit)//设置数据位
{
case 0: { setstr += _T("4,"); break; }
case 1: { setstr += _T("5,"); break; }
case 2: { setstr += _T("6,"); break; }
case 3: { setstr += _T("7,"); break; }
case 4: { setstr += _T("8,"); break; }
}
switch(m_iIniStopBit)//设置停止位
{
case 0: { setstr += _T("1"); break; }
case 1: { setstr += _T("1.5"); break; }
case 2: { setstr += _T("2"); break; }
}
m_mscomm.SetSettings(setstr);
//input output buffer
m_mscomm.SetSThreshold(TX_TRIG);
m_mscomm.SetOutBufferCount(0);
m_mscomm.SetRThreshold(RX_TRIG);
m_mscomm.SetInputMode(1);
m_mscomm.SetInputLen(0);
m_mscomm.SetInBufferCount(0);
//line status
m_bStatusRts = false;
m_bStatusDtr = false;
m_mscomm.SetRTSEnable(false);
m_mscomm.SetDTREnable(false);
m_bStatusCts = m_mscomm.GetCTSHolding();
m_bStatusDsr = m_mscomm.GetDSRHolding();
m_bStatusDcd = m_mscomm.GetCDHolding();
m_cTxCycleIndex = 0;
m_cErrCycleIndex = 0;
m_iPicIndex = 0; //=========
GetDlgItem(IDC_STATUS_RTS)->EnableWindow(true);
GetDlgItem(IDC_STATUS_DTR)->EnableWindow(true);
GetDlgItem(IDC_STATUS_BREAK)->EnableWindow(true);
GetDlgItem(IDC_TX_AUTO_SPAN_SEL)->EnableWindow(true);
GetDlgItem(IDC_TX_AUTO_CTS)->EnableWindow(true);
GetDlgItem(IDC_TX_MANUAL)->EnableWindow(true);
GetDlgItem(IDC_RX_FRESH)->EnableWindow(true);
GetDlgItem(IDC_OPEN_PORT)->SetWindowText(_T("关闭串口"));
//m_pThread = AfxBeginThread(CommProc, this, THREAD_PRIORITY_NORMAL,0, 0, NULL);//创建串口监视线程
}
else
{
m_bOpen=false;
//line status
m_bStatusBreak = false;
m_bStatusCts = false;
m_bStatusDcd = false;
m_bStatusDsr = false;
m_bStatusDtr = false;
m_bStatusRing = false;
m_bStatusRts = false;
((CEdit *)GetDlgItem(IDC_OPEN_PORT))->SetWindowText(_T("打开串口"));
GetDlgItem(IDC_STATIC_OPEN)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_OPEN)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("串口已关闭!"));
((CEdit *)GetDlgItem(IDC_STATUS_RTS))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_STATUS_DTR))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_STATUS_BREAK))->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);
if(m_mscomm.GetPortOpen())
m_mscomm.SetPortOpen(FALSE);//close serial port
}
UpdateData(false);
}
void CUartDlg::OnCountClr()
{
m_iCountRxByte = 0;
m_iCountTxByte = 0;
UpdateData(false);
}
void CUartDlg::OnErrDetect()
{
UpdateData(true);
//((CEdit *)GetDlgItem(IDC_ERR_NUM))->EnableWindow(m_bErrDetect);
//((CEdit *)GetDlgItem(IDC_ERR_RATE))->EnableWindow(m_bErrDetect);
//((CEdit *)GetDlgItem(IDC_ERR_CYCLE_NUM))->EnableWindow(m_bErrDetect);
}
void CUartDlg::OnErrClr()
{
m_iRxBitNum = 0;
m_iErrBitNum = 0;
m_fErrBitRate = 0.0;
m_iRxPacketNum = 0;
m_iErrPacketNum = 0;
m_fErrPacketRate = 0.0;
UpdateData(false);
}
void CUartDlg::OnErrCycleRst()
{
m_cErrCycleIndex = 0;
}
void CUartDlg::OnStatusRts()
{
UpdateData(true);
m_mscomm.SetRTSEnable(m_bStatusRts);
}
void CUartDlg::OnStatusDtr()
{
UpdateData(true);
m_mscomm.SetDTREnable(m_bStatusDtr);
}
void CUartDlg::OnStatusBreak()
{
UpdateData(true);
m_mscomm.SetBreak(m_bStatusBreak);
}
void CUartDlg::OnTxShowClr()
{
m_strTxEdit.Empty();
UpdateData(false);
}
void CUartDlg::OnTxCycle()
{
UpdateData(true);
((CEdit *)GetDlgItem(IDC_TX_EDIT))->EnableWindow(!m_bTxCycle);
((CEdit *)GetDlgItem(IDC_TX_HEX))->EnableWindow(!m_bTxCycle);
}
void CUartDlg::OnTxCycleRst()
{
m_cTxCycleIndex = 0;
}
void CUartDlg::OnTxModeTimer()
{
int SourceDataLen;
UpdateData(true);
if(m_bTxAutoSpan)
{
TxBeginFunc(TimerAuto);
m_mscomm.SetHandshaking(0);
if(!GetTxSourceData(m_TxBuf, &SourceDataLen))
{//数据源格式出错
DlgErrorDeal(SrcDataFrmErr);
return;
}
m_tClockStart = clock();
if( (!m_bTxStopAuto) || (SourceDataLen<m_iTxStopByte) )
{
TransmitData(m_TxBuf, SourceDataLen);
m_iTxByteCounterConv += SourceDataLen;
SetTimer(1, m_iTxAutoSpan, NULL);//ms
//bWinTimer1 = true;
}
else
{
TransmitData(m_TxBuf, m_iTxStopByte);
TxStopFunc(TimerAuto, StopAuto);
}
}
else
{
KillTimer(1);
TxStopFunc(TimerAuto, StopManual);
}
}
void CUartDlg::OnTimer(UINT nIDEvent)
{
int SourceDataLen;
UpdateData(true);
if(!GetTxSourceData(m_TxBuf, &SourceDataLen))
{//数据源格式错误
KillTimer(1);
DlgErrorDeal(SrcDataFrmErr);
return;
}
if( (!m_bTxStopAuto) || (SourceDataLen<m_iTxStopByte-m_iTxByteCounterConv) )//不自动停止或者未达到自动停止字节数
{
TransmitData(m_TxBuf, SourceDataLen);
m_iTxByteCounterConv += SourceDataLen;
ShowTxActualRate();
}
else
{
KillTimer(1);
TransmitData(m_TxBuf, m_iTxStopByte-m_iTxByteCounterConv);
TxStopFunc(TimerAuto, StopAuto);
}
UpdateData(false);
CDialog::OnTimer(nIDEvent);
}
void CUartDlg::OnTxModeCts()
{
int SourceDataLen;
UpdateData(true);
if(m_bTxAutoCts)
{
TxBeginFunc(DetectCts);
m_mscomm.SetHandshaking(2);
if(!GetTxSourceData(m_TxBuf, &SourceDataLen))
{ //数据源格式错误
DlgErrorDeal(SrcDataFrmErr);
return;
}
switch(g_iTxThreadPriority) //默认为3
{
case 0: m_pThread = AfxBeginThread(TransmitDataCTS, this, THREAD_PRIORITY_TIME_CRITICAL, 0, 0, NULL);break;
case 1: m_pThread = AfxBeginThread(TransmitDataCTS, this, THREAD_PRIORITY_HIGHEST, 0, 0, NULL);break;
case 2: m_pThread = AfxBeginThread(TransmitDataCTS, this, THREAD_PRIORITY_ABOVE_NORMAL, 0, 0, NULL);break;
case 3: m_pThread = AfxBeginThread(TransmitDataCTS, this, THREAD_PRIORITY_NORMAL, 0, 0, NULL);break;
case 4: m_pThread = AfxBeginThread(TransmitDataCTS, this, THREAD_PRIORITY_BELOW_NORMAL, 0, 0, NULL);break;
case 5: m_pThread = AfxBeginThread(TransmitDataCTS, this, THREAD_PRIORITY_LOWEST, 0, 0, NULL);break;
case 6: m_pThread = AfxBeginThread(TransmitDataCTS, this, THREAD_PRIORITY_IDLE, 0, 0, NULL);break;
}
m_tClockStart = clock();
if( m_mscomm.GetCTSHolding() )
{
SetEvent(m_hEventTxCts);
}
}
else
{
TxStopFunc(DetectCts, StopManual);
}
}
void CUartDlg::OnTxModeManual()
{
int SourceDataLen;
UpdateData(true);
TxBeginFunc(Manual); //手动发送数据
m_mscomm.SetHandshaking(0); //无握手协议
if(!GetTxSourceData(m_TxBuf, &SourceDataLen))
{//数据源格式错误
DlgErrorDeal(SrcDataFrmErr);
return;
}
TransmitData(m_TxBuf,SourceDataLen);
TxStopFunc(Manual, DefaultStop);
UpdateData(false);
}
void CUartDlg::OnRxShowPause()
{
m_bRxShowPause = !m_bRxShowPause;
if(m_bRxShowPause)
{
((CEdit *)GetDlgItem(IDC_RX_SHOW_PAUSE))->SetWindowText(_T("恢复显示"));
}
else
{
((CEdit *)GetDlgItem(IDC_RX_SHOW_PAUSE))->SetWindowText(_T("暂停显示"));
}
}
void CUartDlg::OnRxShowClr()
{
m_strRxEdit.Empty();
m_strRecPic.Empty();//=========
UpdateData(false);
}
void CUartDlg::OnRxFresh()
{
if(m_bTxPicAutoCts)
{
ReceivePic();
UpdateData(false);
}
else
{
ReceiveData();
UpdateData(false);
}
}
void CUartDlg::OnOnCommMscomm()
{
switch(m_mscomm.GetCommEvent())
{
case 1:
break;
case 2:
if(m_bTxPicAutoCts) ReceivePic(); // 增加的接收图片事件
else { ReceiveData(); }
break;
case 3:
m_bStatusCts = m_mscomm.GetCTSHolding();
if( m_bTxAutoCts&&m_bStatusCts )
{
SetEvent(m_hEventTxCts); //设置事件
}
break;
case 4:
m_bStatusDsr = m_mscomm.GetDSRHolding();
break;
case 5:
m_bStatusDcd = m_mscomm.GetCDHolding();
break;
case 6:
m_bStatusRing = true;
break;
case 7:
break;
case 1001:
break;
case 1004:
GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("framing error!"));
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -