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

📄 plotdatastream.cpp

📁 一个通过USB->UART读取C8051F060的程序
💻 CPP
字号:
// PlotDataStream.cpp: implementation of the CPlotDataStream class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "PlotDataStream.h"

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


//交换字节顺序
void  Swap(char *pChar1, char *pChar2)
{
	 char  tmp;
	 
	 tmp = *pChar1;
	 *pChar1 = *pChar2;
	 *pChar2 = tmp;
}

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
CPlotDataStream::CPlotDataStream():m_bFileOpened(FALSE)
{

}

CPlotDataStream::~CPlotDataStream()
{
		this->Cleanup();
}


BOOL   CPlotDataStream::InitFile(LPCTSTR  szFile)
{
		if (::strlen(szFile) <=4)
			return FALSE;
		
		this->Cleanup();
		m_bFileOpened = m_sDataFile.Open(szFile, CFile::modeCreate |CFile::modeWrite|CFile::typeBinary);
		
		return   m_bFileOpened;
}

//写入单点实时数据
void   CPlotDataStream::Stream(char cVal[], ULONG nChnlNum)
{
	    if (m_bFileOpened)
		{
				m_sDataFile.Write(cVal,  nChnlNum*sizeof(char));	//写入每记录块
		}
}

void   CPlotDataStream::Cleanup()
{
		if (m_bFileOpened)
		{
				m_sDataFile.Close();
				m_bFileOpened = FALSE;
		}
}

//连续显示数据
#define  PI  1.4142
#define  AC_REFVOLTAGE   2.43
#define  AC_CALCOEFF1     4.0*PI/4.0	//-校准系统
#define  DC_CALCOEFF1     25.45			//已校准

#define  _USETESTWAVEHEADERTAG
#include "analysis.h"

#define   CHNLNUMBYTE  4
typedef   struct  _tagMultiChnlData
{
	 unsigned short   CH1;
	 unsigned short   CH2;
}MultiChnlData;

void   CPlotDataStream::ContShowData(pfnCallBack  fpShowData, LPCTSTR  szFile)
{
		ASSERT(szFile);
		
		if (::strlen(szFile) < 10)
			return ;
		
		CFile         sDataFile;
		CFileStatus   fs;
		double        *dbBuffers[2];
		ULONG         dbBufferSize[2];
		union 
		{
	    		MultiChnlData    sMultiData;
				char szBuff[4];
		}_pp;

		TRY
		{			
				BOOL  bFileOpened = sDataFile.Open(szFile, CFile::modeRead|CFile::typeBinary|CFile::shareDenyNone);
				if (bFileOpened)
				{
						sDataFile.GetStatus(fs);

#ifdef  _USETESTWAVEHEADERTAG						
						if (fs.m_size <= 4096*3)
							return;
						//得到桢数
						ULONG numOfDataSize    = (fs.m_size-4096*2)/(CHNLNUMBYTE);
						sDataFile.Seek(4096*2, CFile::begin);
#else
						ULONG numOfDataSize    = fs.m_size/(CHNLNUMBYTE);
#endif
						
						dbBufferSize[0]        = numOfDataSize;
						dbBufferSize[1]        = numOfDataSize;
						for (int k=0; k<CHNLNUMBYTE/2; k++)
							dbBuffers[k] = (double*)::malloc(numOfDataSize*sizeof(double));
						
						for (ULONG j=0; j<numOfDataSize; j++)
						{
								sDataFile.Read(_pp.szBuff,  CHNLNUMBYTE*sizeof(char));								
					
								::Swap(&_pp.szBuff[0], &_pp.szBuff[1]);
								::Swap(&_pp.szBuff[2], &_pp.szBuff[3]);
								
								dbBuffers[0][j] = (_pp.sMultiData.CH1*AC_REFVOLTAGE/(1024*1.0)-AC_REFVOLTAGE/2.0)*AC_CALCOEFF1+0.002;	//交流通道
								dbBuffers[1][j] = _pp.sMultiData.CH2*AC_REFVOLTAGE/(65536*1.00)*DC_CALCOEFF1;							//直流通道

								//限制最大值
								if (dbBuffers[1][j] >= 59.0)
								{
										numOfDataSize   = j;
										for (int n=0; n<CHNLNUMBYTE/2; n++)
											dbBufferSize[n] = j;
										
										break;
								}
						}
//////////////////////////////////////////////////////////////////////////////
#if  0
						//2.求交流的有效值和剔除异常点
						double rms =0;
						::RMS(dbBuffers[0], numOfDataSize, &rms);
						for (ULONG h=0; h<numOfDataSize; h++)
						{
								if (dbBuffers[0][h] > rms*PI)
									dbBuffers[0][h] = rms*PI;
								if (dbBuffers[0][h] < (0.0-rms)*PI)
									dbBuffers[0][h] = (0.0-rms)*PI;
						}
#endif
/////////////////////////////////////////////////////////////////////////////
						//3.显示波形
						(*fpShowData)(dbBuffers, dbBufferSize, CHNLNUMBYTE/2);

						for (int m=0; m<CHNLNUMBYTE/2; m++)
						if (dbBuffers[m])
						{
								::free(dbBuffers[m]);
								dbBuffers[m] = NULL;
						}
//						if (dbBuffers[1])
//						{
//								::free(dbBuffers[1]);
//								dbBuffers[1] = NULL;
//						}

						sDataFile.Close();
						if (numOfDataSize >0)
						{
								::MessageBox(::AfxGetMainWnd()->GetSafeHwnd(), _T("已完成数据文件的显示!"), 
											_T("读取文件结束"), MB_ICONINFORMATION);								
						}
				}
		}
		CATCH(CFileException, ef)
		{
				::MessageBox(::AfxGetMainWnd()->GetSafeHwnd(), 
							_T("无法访问指定的文件,检查文件是否存在!"), 
							_T("访问文件错误"), MB_ICONERROR);
		}
		CATCH_ALL(e)
		{
				::MessageBox(::AfxGetMainWnd()->GetSafeHwnd(), 
							_T("显示历史趋势数据出现错误,检查文件损坏或是否有效趋势数据!\n\n"), 
							_T("无法识别文件错误"), MB_ICONERROR);
		}
		END_CATCH_ALL
}

void   CPlotDataStream::FetchRealData(int nSize, UINT IndPtArr[], double *dbDCValue[2]/*直流通道数据*/, 
									  double *dbACValue[2], LPCTSTR  szFile)
{
		ASSERT(szFile);

		CFile         sDataFile;
		CFileStatus   fs;
		int           nEnumCount = 0;
		union 
		{
	    		MultiChnlData    sMultiData;
				char szBuff[4];
		}_pp;
		
		TRY
		{			
				BOOL  bFileOpened = sDataFile.Open(szFile, CFile::modeRead|CFile::typeBinary|CFile::shareDenyNone);
				if (bFileOpened)
				{
						sDataFile.GetStatus(fs);
						
#ifdef  _USETESTWAVEHEADERTAG						
						if (fs.m_size <= 4096*3)
							return;

						/////////////////////////////////////////////////////////////
						//读取每字节显示
						ULONG numOfDataSize    = (fs.m_size-4096*3)/(CHNLNUMBYTE);
						sDataFile.Seek(4096*3, CFile::begin);
#else
						ULONG numOfDataSize    = fs.m_size/(CHNLNUMBYTE);
#endif
					
						for (ULONG j=0; j<numOfDataSize; j++)
						{		
								sDataFile.Read(_pp.szBuff,  CHNLNUMBYTE*sizeof(char));

								if (IndPtArr[nEnumCount] == j)
								{
										::Swap(&_pp.szBuff[0], &_pp.szBuff[1]);
										::Swap(&_pp.szBuff[2], &_pp.szBuff[3]);								
										dbACValue[0][nEnumCount] = (_pp.sMultiData.CH1*AC_REFVOLTAGE/(1024*1.0)-AC_REFVOLTAGE/2.0)*AC_CALCOEFF1;	//交流通道
										dbDCValue[0][nEnumCount] = _pp.sMultiData.CH2*AC_REFVOLTAGE/(65536*1.00)*DC_CALCOEFF1;	//直流通道
																		
										nEnumCount++;
								}
						}
						
						//////////////////////////////////////////////////////////////
						sDataFile.Close();
				}				
		}
		CATCH(CFileException, ef)
		{
				::MessageBox(::AfxGetMainWnd()->GetSafeHwnd(), 
							_T("无法访问指定的文件,检查文件是否存在!"), 
							_T("访问文件错误"), MB_ICONERROR);
		}
		CATCH_ALL(e)
		{
				::MessageBox(::AfxGetMainWnd()->GetSafeHwnd(), 
							_T("显示历史趋势数据出现错误,检查文件损坏或是否有效趋势数据!\n\n"), 
							_T("无法识别文件错误"), MB_ICONERROR);
		}
		END_CATCH_ALL
}

ULONG   CPlotDataStream::FetchSize(LPCTSTR  szFile)
{
		CFile         sDataFile;
		CFileStatus   fs;
		ULONG		  numOfDataSize = 0;

		TRY
		{			
				BOOL  bFileOpened = sDataFile.Open(szFile, CFile::modeRead|CFile::typeBinary|CFile::shareDenyNone);
				if (bFileOpened)
				{
						sDataFile.GetStatus(fs);

#ifdef  _USETESTWAVEHEADERTAG
						if (fs.m_size <= 4096*3)
							return 0;
						
						//读取每字节显示
						numOfDataSize    = (fs.m_size-4096*3)/(CHNLNUMBYTE);
						//sDataFile.Seek(4096*3, CFile::begin);
#else
						numOfDataSize    = fs.m_size/(CHNLNUMBYTE);
#endif
				}				
		}
		CATCH(CFileException, ef)
		{
				numOfDataSize = 0;
				::MessageBox(::AfxGetMainWnd()->GetSafeHwnd(), 
							_T("无法访问指定的文件,检查文件是否存在!"), 
							_T("访问文件错误"), MB_ICONERROR);
		}
		CATCH_ALL(e)
		{
				numOfDataSize = 0;
				::MessageBox(::AfxGetMainWnd()->GetSafeHwnd(), 
							_T("显示历史趋势数据出现错误,检查文件损坏或是否有效趋势数据!\n\n"), 
							_T("无法识别文件错误"), MB_ICONERROR);
		}
		END_CATCH_ALL

		return  numOfDataSize;
}

⌨️ 快捷键说明

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