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

📄 tranrev.cpp

📁 串口程序检测
💻 CPP
字号:
///////////Head Files///////////////
#include "stdafx.h"

#include "Macro.h"
#include "Global.h"
#include "Functions.h"

#include "Uart.h"
#include "UartDlg.h"

///////////////////////////////////

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

char string[RX_BUF_SIZE*3+1];

void CUartDlg::ReceiveData()
{
	int i,j=0;			
	long RevByteLen;

	VARIANT variant_inp = m_mscomm.GetInput(); 
	COleSafeArray safearray_inp = variant_inp;

	RevByteLen = (long)safearray_inp.GetOneDimSize(); 
	if(!RevByteLen) return;                             // 若接收数据为空则退出

	for(i=0; i<RevByteLen; i++)
	{
		safearray_inp.GetElement( (long*)(&i), m_RxBuf+i ); 
	}                                                        // 将数据移存到接收缓冲区

	m_iCountRxByte += RevByteLen;		

	if(m_bErrDetect)           // 监测到错误
	{
		BYTE differ;
		bool PacketErrFlag = false;
		for (i=0; i<RevByteLen; i++)
		{				
			if( m_RxBuf[i]!=m_cErrCycleIndex )
			{
				differ = m_RxBuf[i]^m_cErrCycleIndex;
				m_iErrBitNum += differ%2+((differ>>1)%2)+((differ>>2)%2)+((differ>>3)%2)+((differ>>4)%2)+((differ>>5)%2)+((differ>>6)%2)+((differ>>7)%2);					
				PacketErrFlag = true;
			}

			if( (m_iRxBitNum/8+i)%5 == 5-1 )
			{
				if( PacketErrFlag == true )	m_iErrPacketNum += 1; 
				m_iRxPacketNum += 1; 
				PacketErrFlag = false;
			}
			m_cErrCycleIndex++;
			if (m_cErrCycleIndex == m_iErrCycleNum)	m_cErrCycleIndex = 0;
		}

		m_iRxBitNum += RevByteLen*8;						
		m_fErrBitRate = (float)m_iErrBitNum / m_iRxBitNum;	
		m_fErrPacketRate = (float)m_iErrPacketNum / m_iRxPacketNum;	 

	}
	if(!m_bRxShowPause)
	{		
		if(m_bRxHex)
		{
			HexByte2String(m_RxBuf, string, RevByteLen);

			m_strRxEdit = string;
		}
		else
		{
			CString str;
			str = (char *)m_RxBuf;
			m_strRxEdit += str;	
		}
	}//if(!m_bRxShowPause)

	if( !m_strFileName.IsEmpty() )
	{	
		if(m_bRxShowPause || !m_bRxHex)
			HexByte2String(m_RxBuf, string, RevByteLen);

		if(!m_file.Open(m_strFileName, CFile::modeReadWrite|CFile::modeCreate|CFile::modeNoTruncate, &m_file_exception)) 
		{ 
			m_file_exception.ReportError(); 
			return; 
		} 

		m_file.SeekToEnd();
		CArchive ar(&m_file, CArchive::store);		

		for(i=0; i<RevByteLen*3; i++) 
			ar<<string[i]; 		

		ar.Flush(); 		
		ar.Close(); 
		m_file.Close(); 
	}
	
}


void CUartDlg::ReceivePic()
{
	int i,j=0;			
	long RevByteLen;

	VARIANT variant_inp = m_mscomm.GetInput(); 
	COleSafeArray safearray_inp = variant_inp;

	RevByteLen = (long)safearray_inp.GetOneDimSize(); 
	if(!RevByteLen) return;

	for(i=0; i<RevByteLen; i++)
	{
		safearray_inp.GetElement( (long*)(&i), m_RxBuf+i ); 
		m_strRecPic += m_RxBuf[i];                       //========
	}

	m_iCountRxByte += RevByteLen;
	


	if(m_bErrDetect)           // 监测错误
	{
		BYTE differ;
		bool PacketErrFlag = false;
		for (i=0; i<RevByteLen; i++)
		{				
			if( m_RxBuf[i]!=m_TxPicBuf[m_iPicIndex] )   ///////======
			{
				differ = m_RxBuf[i]^m_TxPicBuf[m_iPicIndex];
				m_iErrBitNum += differ%2+((differ>>1)%2)+((differ>>2)%2)+((differ>>3)%2)+((differ>>4)%2)+((differ>>5)%2)+((differ>>6)%2)+((differ>>7)%2);					
				PacketErrFlag = true;
			}

			if( (m_iRxBitNum/8+i)%5 == 5-1 )
			{
				if( PacketErrFlag == true )	m_iErrPacketNum += 1; 
				m_iRxPacketNum += 1; 
				PacketErrFlag = false;
			}
			m_iPicIndex++;
			if (m_iPicIndex == m_iPicLength)	m_iPicIndex = 0;  ////=========
		}

		m_iRxBitNum += RevByteLen*8;						
		m_fErrBitRate = (float)m_iErrBitNum / m_iRxBitNum;	
		m_fErrPacketRate = (float)m_iErrPacketNum / m_iRxPacketNum;	 

	}
	if(!m_bRxShowPause)
	{		
		if(m_bRxHex)
		{
			HexByte2String(m_RxBuf, string, RevByteLen);

			m_strRxEdit = string;
		}
		else
		{
			CString str;
			str = (char *)m_RxBuf;
			m_strRxEdit += str;	
		}
	}//if(!m_bRxShowPause)

	
}

bool CUartDlg::GetTxSourceData(BYTE outBuf[], int *pdatalen) 
{//get data
	BYTE i;

	if(m_bTxCycle)	
	{
		*pdatalen = m_iTxCycleNum;
		for(i=0;i<m_iTxCycleNum;i++)
			outBuf[i] = i;                // 手动发送时数据为0到179的循环序列
	}
	else		
	{
		if(m_bTxHex)                   // 十六进制发送数据
		{
			if(!String2HexByte(m_strTxEdit, outBuf, pdatalen))
				return false;	
		}
		else
		{
			*pdatalen = m_strTxEdit.GetLength();                 //从编辑窗口获取数据
			strcpy((char *)outBuf, (LPCTSTR)m_strTxEdit);			
		}		
	}

	return true; 
}

void CUartDlg::TransmitData(BYTE inBuf[], int num)
{	
	int i;

	CByteArray bytearray;

	bytearray.SetSize(num);
	for(i=0; i<num; i++)
	{
		bytearray.SetAt(i,inBuf[i]);
	}	
	
	m_mscomm.SetOutput(COleVariant(bytearray));

	m_iCountTxByte += num;		
}

void CUartDlg::TxBeginFunc(tx_begin_mode TxBeginMode)
{
	switch(TxBeginMode)	
	{
	case TimerAuto:
		((CEdit *)GetDlgItem(IDC_OPEN_PORT))->EnableWindow(false);
		((CEdit *)GetDlgItem(IDC_TX_AUTO_CTS))->EnableWindow(false);
		((CEdit *)GetDlgItem(IDC_TX_MANUAL))->EnableWindow(false);
		GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("自动间隔发送中..."));
		GetDlgItem(IDC_STATIC_BIT_RATE_SHOW)->SetWindowText("实际速率:0.00bit/s"); 
		break;

	case DetectCts:
		((CEdit *)GetDlgItem(IDC_OPEN_PORT))->EnableWindow(false);
		((CEdit *)GetDlgItem(IDC_TX_AUTO_SPAN_SEL))->EnableWindow(false);	
		((CEdit *)GetDlgItem(IDC_TX_MANUAL))->EnableWindow(false);
		GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("自动检测CTS发送中..."));
		GetDlgItem(IDC_STATIC_BIT_RATE_SHOW)->SetWindowText("实际速率:0.00bit/s"); 
		break;

	case Manual:
		((CEdit *)GetDlgItem(IDC_OPEN_PORT))->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);		
		GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("手动发送中..."));		
		break;
	};
/*
((CEdit *)GetDlgItem(IDC_INI_PORT_NUM))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_INI_BAUD_RATE))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_INI_DATA_BIT))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_INI_CHECK_BIT))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_INI_STOP_BIT))->EnableWindow(false);*/

}

void CUartDlg::TxStopFunc(tx_begin_mode TxBeginMode, tx_stop_mode TxStopMode)
{
	switch(TxBeginMode)	
	{

	case TimerAuto:

	case DetectCts:

		ShowTxActualRate();				

		if( TxStopMode == StopAuto )
		{		
			GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("自动停止发送!"));
		}
		if( TxStopMode == StopManual )
		{
			GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("手动停止发送!"));	
		}
		break;	

	case Manual:
		GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("手动发送完毕!"));

		break;
	}

	m_iTxByteCounterConv = 0;  
	m_bTxAutoSpan = false;	
	((CEdit *)GetDlgItem(IDC_TX_AUTO_SPAN_SEL))->EnableWindow(true);
	((CEdit *)GetDlgItem(IDC_TX_AUTO_CTS))->EnableWindow(true);
	m_bTxAutoCts = false;	
	((CEdit *)GetDlgItem(IDC_TX_MANUAL))->EnableWindow(true);
	((CEdit *)GetDlgItem(IDC_OPEN_PORT))->EnableWindow(true);
//	m_bTxPicAutoCts = false;             //888888888   还原标志

	UpdateData(false);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -