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

📄 uartdlg.cpp

📁 串口程序检测
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		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 + -