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

📄 uartdlg.cpp

📁 串口程序检测
💻 CPP
📖 第 1 页 / 共 3 页
字号:

	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 + -