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

📄 dataexp.cpp

📁 串口通讯演示程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "CeTools.h"
#include "UManageView.h"

extern int ExitRevThread;
int ViewLineNo;
WORD CheckSum(BYTE *buf, int len);
void ErrRate(int flag,CUManageView* pObject);
CString BinToStr(BYTE *buf,int len);//转换成字符串
CString BinToStr2(BYTE *buf,int len);//转换成整数串
CString DataExp_3(BYTE *buf,int *len);//解码
CString DataExp_2(BYTE *buf,int len,int *LineNo,int RunNT);
CString DataExp_1(BYTE *buf,int *len,DWORD *ErrLen,int RunNT);
CString DataExp_0(BYTE *buf,int *len,DWORD *ErrLen,int RunNT);

/***********************************************************
	用途:从RvBuff中取出数据及长度,解释数据形成文本形式,
		  送往ViewDataStr[].ViewData用于显示
	调用:独立线程
	参数:父指针
	返回:不用
***********************************************************/
UINT DataExp( LPVOID pParam )
{
	int k,i,m,k1;
	int DataPos=0,DataPos2=0,MDataPos=0;
	int JDataPos=0,JDataPos2=0;
	CString str;
	CStdioFile csf;
	int Alen=0,Blen=0,Errlen=0;

	BYTE bTemp[4];
	BYTE DataBuff[R_BUFFER_SIZE],DataBuff2[R_BUFFER_SIZE],MDataBuff[R_BUFFER_SIZE];
	BYTE JDataBuff[R_BUFFER_SIZE],JDataBuff2[R_BUFFER_SIZE];
	BYTE Z_Buff[140];
	CString ViewData="";
	ViewLineNo=0;

	csf.Open("ABErr.txt",CFile::modeCreate|CFile::modeWrite|CFile::typeText);
	CUManageView* pObject = (CUManageView*)pParam;
	if(pObject == NULL || !pObject->IsKindOf(RUNTIME_CLASS(CUManageView)))
		return 0; // 非法参数
	while(1)
	{
		Sleep(50);
		if(ExitRevThread)//退出
		{
			csf.Close();
			return 10;
		}
		if(pObject->RvStr.Endp == pObject->RvStr.sp)//无数据
			continue;
		m=pObject->RvStr.Endp;
		if(m>pObject->RvStr.sp)
			k=pObject->RvStr.Endp-pObject->RvStr.sp;
		else
			k=R_BUFFER_SIZE-pObject->RvStr.sp+m;
		pObject->app->BufferDataLen=k;
		if(k<280 && pObject->RvStr.TimerCount<10)
			continue;
		k1=m;
		if(ViewLineNo>10000)
			ViewLineNo=0;
		if(pObject->app->BmState==0)//无编码
		{
			m=k;
			k=pObject->RvStr.sp;
			for(i=0;i<m;i++)
			{
				DataBuff[DataPos++]=pObject->RvStr.RvBuff[k++];
				k%=R_BUFFER_SIZE;
				DataPos%=R_BUFFER_SIZE;
			}
			pObject->RvStr.sp=k;
			ViewData=DataExp_1(DataBuff,&DataPos,&pObject->app->ErrCodeRate.ErrLen,pObject->app->RunNT);
			if(!ViewData.IsEmpty())
			{
				for(i=0;i<2;i++)
				{
					if(pObject->app->ViewDataStr[i].Enable)
					{
						pObject->app->ViewDataStr[i].Enable=0;
						pObject->app->ViewDataStr[i].ViewData+=ViewData;
						pObject->app->ViewDataStr[i].DataFlag=1;
						pObject->app->ViewDataStr[i].Enable=1;
						break;
					}
				}
				ViewData.Empty();
			}
			//计算误码率
			pObject->app->ErrCodeRate.TotalLen+=m;
			pObject->app->ErrCodeRate_m.CommTotalLen+=m;

			if(pObject->app->ErrCodeRate.TotalLen>140*10)
			{
				ErrRate(0,pObject);
			}
			continue;
		}

		while(1)//有编码,找同步码
		{
			k=pObject->RvStr.sp;
			for(i=0;i<4;i++)
			{
				bTemp[i]=pObject->RvStr.RvBuff[k++];
				k%=R_BUFFER_SIZE;
				if(k==k1)
					break;
			}
			if(k==k1)
				break;
			if((bTemp[0]==pObject->SynCode[0] && bTemp[1]==pObject->SynCode[1] && bTemp[2]==pObject->SynCode[2] && bTemp[3]==pObject->SynCode[3])||
				(bTemp[0]==pObject->SynCode2[0] && bTemp[1]==pObject->SynCode2[1] && bTemp[2]==pObject->SynCode2[2] && bTemp[3]==pObject->SynCode2[3]))
//			if(bTemp[0]==pObject->SynCode[0] && bTemp[1]==pObject->SynCode[1] && bTemp[2]==pObject->SynCode[2] && bTemp[3]==pObject->SynCode[3])
			{
				//取数据长度
				if(k1>k)
					m=k1-k;
				else
					m=R_BUFFER_SIZE-k+k1;
				if(m<136)
					break;//此时pObject->sp指向SynCode[0]
				pObject->RvStr.sp=k;//指向第一个数据
				m=0;
				for(i=0;i<136;i++)
				{
					Z_Buff[i]=pObject->RvStr.RvBuff[k++] ^ pObject->XorCode[m++];
					m%=4;
					k%=R_BUFFER_SIZE;
				}
				pObject->RvStr.sp+=135;
				pObject->RvStr.sp%=R_BUFFER_SIZE;
				//判断显示的通道
				if(Z_Buff[0]==0xc0 || Z_Buff[0]==0xc1)//A通道
				{	
					if(Z_Buff[0]==0xc0)//B结束
					{
						str.Format("Blen=%d",Blen);
						csf.WriteString(str);
						Blen=0;
					}
					Alen+=140;
					if(pObject->app->CurRevType==2)//解码
					{
						for(int ii=0;ii<4;ii++)
						{
							JDataBuff[JDataPos++]=pObject->SynCode[ii];
							JDataPos%=R_BUFFER_SIZE;
						}
						m=17*8;
						for(i=0;i<m;i++)
						{
							JDataBuff[JDataPos++]=Z_Buff[i];
							JDataPos%=R_BUFFER_SIZE;
						}
					}
					else
					{
						if(Z_Buff[2]<0x02)//管理
						{
							m=14*8;
							for(i=0;i<m;i++)
							{
								MDataBuff[MDataPos++]=Z_Buff[24+i];
								MDataPos%=R_BUFFER_SIZE;
							}
						}
						else 
						{
							if(Z_Buff[1]==0x01)//新文件
							{
								m=14*8;//剩余14帧112字节
								for(i=0;i<m;i++)
								{
									DataBuff[DataPos++]=Z_Buff[24+i];
									DataPos%=R_BUFFER_SIZE;
								}
							}
							else
							{
								m=16*8;
								for(i=0;i<m;i++)
								{
									DataBuff[DataPos++]=Z_Buff[8+i];
									DataPos%=R_BUFFER_SIZE;
								}
							}
						}
					}
					pObject->app->ErrCodeRate.TotalLen+=m+4;//4字节同步码
					pObject->app->ErrCodeRate_m.CommTotalLen+=m+4;
				}
				else if(Z_Buff[0]==0xd0 || Z_Buff[0]==0xd1)
				{
					if(Z_Buff[0]==0xd0)//A结束
					{
						str.Format(" Alen=%d Errlen=%d\n",Alen,Errlen);
						csf.WriteString(str);
						Alen=0;
						Errlen=0;
					}
					Blen+=140;
					if(pObject->app->CurRevType==2)//解码
					{
						for(int ii=0;ii<4;ii++)
						{
							JDataBuff2[JDataPos2++]=pObject->SynCode[ii];
							JDataPos2%=R_BUFFER_SIZE;
						}
						m=17*8;
						for(i=0;i<m;i++)
						{
							JDataBuff2[JDataPos2++]=Z_Buff[i];
							JDataPos2%=R_BUFFER_SIZE;
						}
					}
					else
					{
						//B通道
						if(Z_Buff[1]==0x01)//新文件
						{
							m=14*8;//剩余14帧112字节
							for(i=0;i<m;i++)
							{
								DataBuff2[DataPos2++]=Z_Buff[24+i];
								DataPos2%=R_BUFFER_SIZE;
							}
						}
						else
						{
							m=16*8;
							for(i=0;i<m;i++)
							{
								DataBuff2[DataPos2++]=Z_Buff[8+i];
								DataPos2%=R_BUFFER_SIZE;
							}
						}
					}
					pObject->app->ErrCodeRate2.TotalLen+=m+4;//4字节同步码
					pObject->app->ErrCodeRate2_m.CommTotalLen+=m+4;
				}
			}
			else
			{
				if(bTemp[0]==0x55)
				{
					pObject->app->ErrCodeRate.TotalLen++;
					pObject->app->ErrCodeRate_m.CommTotalLen++;
					pObject->app->ErrCodeRate2.TotalLen++;
					pObject->app->ErrCodeRate2_m.CommTotalLen++;
				}
				else
				{
					//误码增加
	//				if(bTemp[0]!=0xaa && bTemp[0]!=0x8f)
					pObject->app->ErrCodeRate.ErrLen++;
					pObject->app->ErrCodeRate.TotalLen++;
					pObject->app->ErrCodeRate_m.CommTotalLen++;
					pObject->app->ErrCodeRate2.ErrLen++;
					pObject->app->ErrCodeRate2.TotalLen++;
					pObject->app->ErrCodeRate2_m.CommTotalLen++;

					Errlen++;
				}
				if(pObject->app->ErrCodeRate.TotalLen>140*10)
				{
					ErrRate(0,pObject);
				}
			}

			pObject->RvStr.sp++;//此时pObject->sp指向下一个SynCode[0]
			pObject->RvStr.sp%=R_BUFFER_SIZE;
			if(pObject->RvStr.sp==k1)
				break;
		}
		if(MDataPos>8)
		{
			//解释数据...
			ViewData=DataExp_0(MDataBuff,&MDataPos,&pObject->app->ErrCodeRate.ErrLen,pObject->app->RunNT);
			if(!ViewData.IsEmpty())
			{
				for(i=0;i<2;i++)
				{
					if(pObject->app->ViewDataStr[i].Enable)
					{
						pObject->app->ViewDataStr[i].Enable=0;
						pObject->app->ViewDataStr[i].ViewData+=ViewData;
						pObject->app->ViewDataStr[i].DataFlag=1;
						pObject->app->ViewDataStr[i].Enable=1;
						break;
					}
				}
				ViewData.Empty();
			}
		}
		if(DataPos>0)
		{
			//解释数据...
			ViewData=DataExp_1(DataBuff,&DataPos,&pObject->app->ErrCodeRate.ErrLen,pObject->app->RunNT);
			if(!ViewData.IsEmpty())
			{
				for(i=0;i<2;i++)
				{
					if(pObject->app->ViewDataStr[i].Enable)
					{
						pObject->app->ViewDataStr[i].Enable=0;
						pObject->app->ViewDataStr[i].ViewData+=ViewData;
						pObject->app->ViewDataStr[i].DataFlag=1;
						pObject->app->ViewDataStr[i].Enable=1;
						break;
					}
				}
				ViewData.Empty();
			}
			if(pObject->app->ErrCodeRate.TotalLen>140*10)
			{
				ErrRate(0,pObject);
			}
		}
		if(DataPos2>0)
		{
			//解释数据...
			ViewData=DataExp_1(DataBuff2,&DataPos2,&pObject->app->ErrCodeRate2.ErrLen,pObject->app->RunNT);
			if(!ViewData.IsEmpty())
			{
				for(i=0;i<2;i++)
				{
					if(pObject->app->ViewDataStr2[i].Enable)
					{
						pObject->app->ViewDataStr2[i].Enable=0;
						pObject->app->ViewDataStr2[i].ViewData+=ViewData;
						pObject->app->ViewDataStr2[i].DataFlag=1;
						pObject->app->ViewDataStr2[i].Enable=1;
						break;
					}
				}
				ViewData.Empty();
			}
			if(pObject->app->ErrCodeRate2.TotalLen>140*10)
			{
				ErrRate(1,pObject);
			}
		}
		if(JDataPos>0)
		{
			ViewData=DataExp_3(JDataBuff,&JDataPos);
			if(pObject->app->ErrCodeRate.TotalLen>140*10)
				ErrRate(0,pObject);
			if(!ViewData.IsEmpty())
			{
				for(i=0;i<2;i++)
				{
					if(pObject->app->ViewDataStr[i].Enable)
					{
						pObject->app->ViewDataStr[i].Enable=0;
						pObject->app->ViewDataStr[i].ViewData+=ViewData;
						pObject->app->ViewDataStr[i].DataFlag=1;
						pObject->app->ViewDataStr[i].Enable=1;
						break;
					}
				}
				ViewData.Empty();
			}
		}
		if(JDataPos2>0)
		{
			ViewData=DataExp_3(JDataBuff2,&JDataPos2);
			if(!ViewData.IsEmpty())
			{
				for(i=0;i<2;i++)
				{
					if(pObject->app->ViewDataStr2[i].Enable)
					{
						pObject->app->ViewDataStr2[i].Enable=0;
						pObject->app->ViewDataStr2[i].ViewData+=ViewData;
						pObject->app->ViewDataStr2[i].DataFlag=1;
						pObject->app->ViewDataStr2[i].Enable=1;
						break;
					}
				}
				ViewData.Empty();
			}
			if(pObject->app->ErrCodeRate2.TotalLen>140*10)
				ErrRate(1,pObject);
		}
		if(ExitRevThread)
		{
			csf.Close();
			return 10;
		}
	}
	csf.Close();
	return 1;
}
/***************************************************
	用途:依据《华易数据规约》解释buf中的管理数据,
		  返回文本形式的内容,用于显示
	调用:DataExp
	参数:去除了同步码、扰码的数据,
		  及数据的长度
	返回:返回文本形式的内容
***************************************************/
CString DataExp_0(BYTE *buf,int *len,DWORD *ErrLen,int RunNT)//CRevDataView* pObject)
{
	BYTE aCh,sCh;
	DWORD i;
	DWORD k,k1,sum;
	CString ViewData="";


	k=*len;
	k1=*ErrLen;
	for(i=0;i<k;i++)
	{
		if(k-i<8)
		{
			CopyMemory(buf,&buf[i],k-i);
			*len=k-i;
			return ViewData;
		}
		switch(buf[i])//校时
		{
		case 1:
			if(k-i<8)
			{
				CopyMemory(buf,&buf[i],k-i);
				*len=k-i;
				return ViewData;
			}
			sum=CheckSum(&buf[i],6);
			aCh=(BYTE)sum;
			sCh=(BYTE)(sum>>8);
			if(buf[i+6]==sCh && buf[i+7]==aCh)
			{
				ViewData+=DataExp_2(&buf[i],6,&ViewLineNo,RunNT);
				i+=8-1;
			}
			else
			{
				k1++;
				*ErrLen=k1;
			}
			break;
		case 2:
			if(buf[i+8]==0)//密钥
			{
				if(k-i<27)
				{
					CopyMemory(buf,&buf[i],k-i);
					*len=k-i;
					return ViewData;
				}
				sum=CheckSum(&buf[i],25);
				aCh=(BYTE)sum;
				sCh=(BYTE)(sum>>8);
				if(buf[i+25]==sCh && buf[i+26]==aCh)
				{
					ViewData+=DataExp_2(&buf[i],25,&ViewLineNo,RunNT);
					i+=27-1;
				}
				else
				{
					k1++;
					*ErrLen=k1;
				}
			}
			else//开台
			{
				if(k-i<16)
				{
					CopyMemory(buf,&buf[i],k-i);
					*len=k-i;
					return ViewData;
				}
				sum=CheckSum(&buf[i],14);
				aCh=(BYTE)sum;
				sCh=(BYTE)(sum>>8);
				if(buf[i+14]==sCh && buf[i+15]==aCh)
				{
					ViewData+=DataExp_2(&buf[i],14,&ViewLineNo,RunNT);
					i+=16-1;
				}
				else
				{
					k1++;
					*ErrLen=k1;
				}
			}
			break;
		default:
			break;
		}//switch
	}//for i
	return ViewData;
}
/***************************************************
	用途:依据《华易数据规约》解释buf中的数据,
		  返回文本形式的内容,用于显示
	调用:DataExp
	参数:去除了同步码、扰码、控制帧的数据,
		  及数据的长度
	返回:返回文本形式的内容
***************************************************/
CString DataExp_1(BYTE *buf,int *len,DWORD *ErrLen,int RunNT)//CRevDataView* pObject)
{
//	float a,b,c;
	BYTE *bp,*bwp;
	BYTE aCh,sCh;
	BYTE DataBuf[256],DataLen;
	DWORD i,blen;
	DWORD j;
	DWORD spos,k,k1;
	CString ViewData="";


	bp=buf;
	k=*len;
	k1=*ErrLen;
	spos=0;
	while(1)
	{
		if(spos>=k)
		{
			*len=0;
			return ViewData; 
		}
		//找AA
		bp=&buf[spos];
		bwp=bp;
		for(i=spos;i<k;i++)
		{
			if(*bp==0xaa)
				break;
			bp++;
		}
		//没找到AA
		if(i>=k)
		{
			for(i=spos;i<k;i++)
			{
				if(*bwp!=0x8f)
					k1++;
//					pObject->app->ErrCodeRate.ErrLen++;
				bwp++;
			}
			*len=0;
			if(k1!=0)
				*ErrLen=k1;
			return ViewData;
		}
		bwp=bp;//bwp指向0xaa
		bp++;//bp指向包长度
		blen=*bp;//包长度
		if(blen<256 && blen>1)//检查包长度的有效性
		{
			//不够一包数据
			if(k-i-2<blen)//把有效数据移至buf[0]处
			{
				bp=buf;
				for(j=0;j<k-i;j++)
				{
					*bp=*bwp;
					bwp++;
					bp++;
				}
				*len=k-i;
				return ViewData;
			}
			//算校验
			aCh=0;
			sCh=0;
			DataLen=0;
			bp++;//bp指向类型,开始算校验
			for(j=0;j<blen-2;j++)
			{
				aCh+=*bp;
				if(j%2==0)
					sCh-=*bp;
				else
					sCh+=*bp;
				DataBuf[DataLen++]=*bp;
				bp++;
			}
			//bp指向第一个校验字节

			if((*bp++==aCh)&&(*bp++==sCh))//bp指向下一个0xaa
			{
				//解释数据
				ViewData+=DataExp_2(DataBuf,DataLen,&ViewLineNo,RunNT);
				spos+=blen+2;
			}
			else
			{
//				pObject->app->ErrCodeRate.ErrLen++;
				k1++;
				*ErrLen=k1;
				spos++;
			}
		}
		else
		{
//			pObject->app->ErrCodeRate.ErrLen++;
			spos++;
			k1++;
			*ErrLen=k1;
		}
	}
}
/************************************************************
	用途:依据《华易数据规约》解释buf中的数据(类型+数据区),
		  返回文本形式的内容,用于显示
	调用:DataExp1
	参数:只有一包的数据,及数据的长度
	返回:返回文本形式的内容
************************************************************/
CString DataExp_2(BYTE *buf,int len,int *LineNo,int RunNT)
{
	CString str,str1;
	BYTE *ip,i;
	DWORD dw;
	WORD index,wtemp;
	int No;
	No=*LineNo;
	str.Empty();
	if(buf[0]==0x01)//对时
	{
		str.Format("%d     ",++No);
		if(RunNT)
			str+="对时   ";
		else
			str+="Settime   ";
		ip=&buf[1];

⌨️ 快捷键说明

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