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

📄 nsawhws1.c

📁 一种电度表的通讯程序,实际中已使用
💻 C
📖 第 1 页 / 共 2 页
字号:
	}
}
*/


void FindWhSync(WORD UartNo){
WORD	i,j,k,m,nbytes,UnitNo,Stat,ms,pos,RecvData=OFF;
BYTE	*p;
BYTE	sync;

for(i=0;i<30;i++){	  // loop return when nbytes=0 or finding
//	nbytes=1;
//	if(i==0)sync=0x06;
//	if(i==1)sync=0x8b;
//	if(i==2)sync=0xd6;
	nbytes=RecvUart(UartNo,&sync,1);
	if(nbytes!=0)if(debug)printf("s=%x\n",sync);
	if(nbytes!=0){
		RecvData=ON;
		if(debug)printf("sync=%x,Whp->SynCode[%d]=%x\n",sync,Whp->RecvSyncNum,Whp->SynCode[Whp->RecvSyncNum]);
		if(sync==Whp->SynCode[Whp->RecvSyncNum]){//SynCode is filled at OrgPkt
			Whp->RecvSyncNum++;
			if(debug)printf("RecvSyncNum=%d,SynBytes=%d\n",Whp->RecvSyncNum,Whp->SynBytes);
			if(Whp->RecvSyncNum==Whp->SynBytes){
				Whp->RecvSyncNum=0;
				Whp->SyncFull=ON;
				for(k=0;k<Whp->SynBytes;k++)
					Whp->FromBuff[k]=Whp->SynCode[k];
				Whp->RecvByteNum=Whp->SynBytes;
				if(debug)printf("Find sync\n");
				break;
				}
			}
		else if(Whp->RecvSyncNum>=1){
			Whp->RecvSyncNum=0;
			}
		}
	if(Whp->SyncFull==ON)break;//case if break from inner for loop
	}
if(RecvData==OFF)ReadNoByteFromWh(UartNo);
else{
	RecordWhRecvData(UartNo);
	}
}


void FindWhSyncListen(WORD UartNo){
WORD	i,j,k,m,nbytes,UnitNo,Stat,ms,pos,RecvData=OFF;
WORD	Bool;
BYTE	*p;
//printf("in findwhsync..");
for(i=0;i<5;i++){	 // loop return when nbytes=0 or finding
	pos=Whp->RecvByteNum;
	nbytes=sizeof(Wh[0].FromBuff)-Whp->RecvByteNum;
	p=&Whp->FromBuff[pos];
	nbytes=RecvUart(UartNo,p,nbytes);
	if(nbytes==0)continue;
	Whp->RecvByteNum+=nbytes;
	RecvData=ON;
	if(debug)for(j=0;j<nbytes;j++)printf("s:%02x ",p[j]);
	for(j=0;j<nbytes;j++){
//printf("p[%d]=%x,Whp->SynCode[%d]=%x\n",j,p[j],Whp->RecvSyncNum,Whp->SynCode[Whp->RecvSyncNum]);
		Bool=OFF;
		Bool|=(Whp->RecvSyncNum==1&&p[j]==0x8B);//cmd
		Bool|=(Whp->RecvSyncNum==2&&p[j]==0xD6);//cmd
		if(Bool){
			Whp->RecvSyncNum++;
//printf("RecvSyncNum=%d,SynBytes=%d\n",Whp->RecvSyncNum,Whp->SynBytes);
			if(Whp->RecvSyncNum==Whp->SynBytes){
				Whp->RecvSyncNum=0;
				Whp->SyncFull=ON;
				m=(&p[j]-&Whp->FromBuff[0]+1)-Whp->SynBytes;
				Whp->RecvByteNum=Whp->RecvByteNum-m;
				for(k=0;k<Whp->RecvByteNum;k++)
					Whp->FromBuff[k]=Whp->FromBuff[m+k];
				//printf("Find sync\n");
				break;
				}
			}
		else if(Whp->RecvSyncNum>=1){
			Whp->RecvSyncNum=0;
			}
		}
	if(Whp->SyncFull==ON)break;//case if break from inner for loop
	}
if(RecvData==OFF)ReadNoByteFromWh(UartNo);
else{
	RecordWhRecvData(UartNo);
	}
}

void	RecordWhRecvData(WORD UartNo){
WORD	UnitNo,addr;

if(Lib.Listen==OFF){
	UnitNo=Whp->DnUnitNo;	//start from 0
	addr=UnitNo-Whp->MinNo;
	Whp->RecvData=ON;
	mytime(&Whp->LastRecvDataTime[addr]);
	}
}

void ReadNoByteFromWh(WORD UartNo){
time_t	CurTime,Dltt1,Dltt2;
WORD	UnitNo,addr;

if(Lib.Listen==ON){ReadNoByteFromWhListen(UartNo);return;}
UnitNo=Whp->DnUnitNo;	//start from 0
addr=UnitNo-Whp->MinNo;

mytime(&CurTime);
Dltt1=DiffTime(&CurTime,&Whp->LastRecvDataTime[addr]);
//printf("2:Whp->OnePktSendTime=%d\n",Whp->OnePktSendTime);
Dltt2=DiffTime(&CurTime,&Whp->OnePktSendTime);
if(Dltt1>LIMIT_WH_T){
	mytime(&Whp->LastRecvDataTime[addr]);
	Lib.WhStat[addr]=STOPPED;
	}
if(Dltt2>=LIMIT_WH_T1){       /*overtime or a part packet*/
	Whp->PktIsTimeOut=ON;
	if(++Whp->ErrTimes[UnitNo]>LIMIT_WH_ERR_TIMES){
		Whp->ErrTimes[UnitNo]=0;
		}
	}
}

void ReadNoByteFromWhListen(WORD UartNo){
time_t	CurTime,Dltt1;
WORD	Addr,i,MinNo;
mytime(&CurTime);
MinNo=Whp->MinNo;
for(i=Uart[UartNo].StartNo;i<Uart[UartNo].StartNo+Uart[UartNo].LimitNum;i++){
	Addr=i-MinNo;
	Dltt1=DiffTime(&CurTime,&Whp->LastRecvDataTime[Addr]);
	if(Dltt1>=LIMIT_WH_T) {
		mytime(&Whp->LastRecvDataTime[Addr]);
		Lib.WhStat[Addr]=STOPPED;
		ClearWhBuff(UartNo);
		}
	}
}

void	ReadWhHead(WORD UartNo){
WORD	nbytes,i,HeadBytes;
BYTE	*p;

HeadBytes=Whp->HeadBytes;
if(Whp->RecvByteNum>=HeadBytes){
	Whp->HeadFull=ON;//may HeadBytes=0
	return;
	}
nbytes=HeadBytes-Whp->RecvByteNum;
p=&Whp->FromBuff[Whp->RecvByteNum];
nbytes=uintmin(nbytes,sizeof(Whp->FromBuff)-Whp->RecvByteNum);
nbytes=RecvUart(UartNo,p,nbytes);
if(debug)for(i=0;i<nbytes;i++)printf("WH:h=%x\n",p[i]);
if (nbytes==0){ReadNoByteFromWh(UartNo);}
else{
	RecordWhRecvData(UartNo);
	Whp->RecvByteNum+=nbytes;
	}
if(Whp->RecvByteNum>=HeadBytes){
	Whp->HeadFull=ON;//may HeadBytes=0
	(*(FunCalFromWhPktNbyts[0].Fun))();
	}
if(Whp->HeadFull==ON)if(debug)printf("Whp->HeadFull==ON\n");
}


void	ReadWhData(WORD UartNo){
WORD	nbytes,i,PktBytes;
BYTE	*p;
WORD	Comd;

PktBytes=Whp->PktBytes;
if(Whp->RecvByteNum>=PktBytes){
	Whp->DataFull=ON;
	return;
	}
p=&Whp->FromBuff[Whp->RecvByteNum];
nbytes=uintmin(PktBytes,sizeof(Whp->FromBuff)-Whp->RecvByteNum);
nbytes=RecvUart(UartNo,p,nbytes);
//for(i=0;i<nbytes;i++)printf("WH:d=%x\n",p[i]);
if (nbytes==0){ReadNoByteFromWh(UartNo);}
else{
	RecordWhRecvData(UartNo);
	Whp->RecvByteNum+=nbytes;
	if(Whp->RecvByteNum>=PktBytes)Whp->DataFull=ON;
	}
if(Whp->DataFull==ON)if(debug)printf("Whp->DataFull==ON\n");
}

int	WhBuffInit(WORD UartNo){
WORD	i,StartNo;

GroupNo=Uart[UartNo].SameFunNo;
if ( (Whp= (WhS __far *)_vload( VmhWh[GroupNo], _VM_DIRTY)) == NULL ){
	printf("FromToWh vload error\n");
	_vheapterm();
	exit( -1 );
	}
for(i=0;i<LIMIT_WH_NUM;i++){
	mytime(&Whp->LastRecvDataTime[i]);
	Whp->ErrTimes[i]=0;
	}

mytime(&Whp->OnePktSendTime);
Whp->RecvData=OFF;

Whp->ReadNeed=OFF;	 /*  ON/OFF    */
Whp->SyncFull=OFF;
Whp->HeadFull=OFF;
Whp->DataFull=OFF;
Whp->SendPktStat=OFF;
Whp->RecvSyncNum=0;
Whp->FindSyncNum=0;
Whp->RecvByteNum=0;

Whp->OrgBytes=0;
Whp->SendBytes=0;
Whp->SendPkt[0]=OFF;	   /*for panel & terminal*/
Whp->RecvPkt[0]=OFF;
Whp->SendPkt[1]=OFF;	   /*for panel & terminal*/
Whp->RecvPkt[1]=OFF;
Lib.WhBanRun[GroupNo][0]=OFF;
Lib.WhBanRun[GroupNo][1]=OFF;
Whp->OrgPktStat=ON;

Whp->CurOrgPktUnitNo=Uart[UartNo].StartNo;//start from 0

Whp->MinNo=FindMinNo(UART_FOR_WH_METER);

ClearWhBuff(UartNo);
(*(FunWhBuffInitProc[0].Fun))(GroupNo);
}










void ClearWhBuff(WORD UartNo){
Whp->SyncFull=OFF;
Whp->HeadFull=OFF;
Whp->DataFull=OFF;
Whp->RecvSyncNum=0;
Whp->FindSyncNum=0;
Whp->RecvByteNum=0;

Whp->OrgPktStat=ON;
Whp->SendPktStat=OFF;
Whp->JudgePktIsOver=OFF;
Whp->ReadNeed=OFF;
}


void WhTimeProc(){
int  i;
time_t CurTime,DltT,DltT1;
mytime(&CurTime);
for(i=0;i<sizeof(TxDt)/sizeof(TxDtS);i++){
	DltT=DiffTime(&CurTime,&TxDt[i].LastTime);
	if(DltT>=TxDt[i].DltTime){
		TxDt[i].LastTime=CurTime;
		TxDt[i].Occur=ON;
		}
	}
}


//1:	FunBuffInitProc()
WORD WhWsBuffInit(WORD GroupNo){
/*-------------------------------------------------------------------
WeiSheng:
Suml=Addr^...^Data
Sumh=Addr+...+Data
From Wh Pkt:Addr,0x8B,0xD6,nbytes,data,Suml,Sumh,0x0D:total 38 bytes
To   Wh Pkt:Addr,0xB8,0x6D,0x0F,0x00,0x00,Suml,Sumh,0x0D:total 9 bytes
-----------------------------------------------------------------------*/
Whp->SynBytes=3;
Whp->SynCode[0]=1;	//addr
Whp->SynCode[1]=0x8B;
Whp->SynCode[2]=0xD6;
Whp->HeadBytes=3;
Whp->PktBytes=38;
Lib.WhNumPerMeter=4;
}

//2:	FunToWhProc()
WORD ToWhWsProc(WORD UartNo,ULONG Addr){
WORD	i,nbytes;
WORD	CheckSum;


Whp->SynCode[0] = Addr;//for find sync
Whp->ToBuff[0] = Addr;
Whp->ToBuff[1] = 0xB8;
Whp->ToBuff[2] = 0x6D;
Whp->ToBuff[3] = 0x0F;
Whp->ToBuff[4] = 0x00;
Whp->ToBuff[5] = 0x00;
CheckSum=CalWhWsCheckSum(&Whp->ToBuff[0],6);
*(WORD *)&Whp->ToBuff[6] = CheckSum;
Whp->ToBuff[8] = 0x0D;
Whp->ToBuff[9] = 0xff;
Whp->ToBuff[10]=0xff;
Whp->ToBuff[11]=0xff;
Whp->OrgBytes=12;
return(ON);
}

//3:	FunFromWhProc()
int  FromWhWsProc(WORD UartNo){
ULONG	lBcd,lHex[4];
BYTE	Bcd[4];
WORD	i,YmOff,UpUnitNo;

UpUnitNo=Whp->UpUnitNo;     //start from  0
if(UpUnitNo==0xFF)return(1);
for( i = 3 ;i<35;i++){
	if(Whp->FromBuff[i] >= 0x30&& Whp->FromBuff[i] <= 0x39)
		Whp->FromBuff[i] = Whp->FromBuff[i] - 0x30;
	else if(Whp->FromBuff[i] >= 'A'&&Whp->FromBuff[i] <= 'F')
		Whp->FromBuff[i] = Whp->FromBuff[i] -'A' + 10;
	else if(Whp->FromBuff[i] >= 'a'&&Whp->FromBuff[i] <= 'f')
		Whp->FromBuff[i] = Whp->FromBuff[i] -'a' + 10;
	}
//Wp
Bcd[0] = Whp->FromBuff[3]*16 + Whp->FromBuff[4];	//low
Bcd[1] = Whp->FromBuff[5]*16 + Whp->FromBuff[6];
Bcd[2] = Whp->FromBuff[7]*16 + Whp->FromBuff[8];
Bcd[3] = Whp->FromBuff[9]*16 + Whp->FromBuff[10];
//if(debug)for(i=0;i<4;i++)printf("Bcd[%d]=%02x ",i,Bcd[i]);
lHex[0]=*(ULONG *)&Bcd[0];
//if(debug)printf("lHex[0]=%ld\n",lHex[0]);

//Wq
Bcd[0] = Whp->FromBuff[11]*16 + Whp->FromBuff[12];//low
Bcd[1] = Whp->FromBuff[13]*16 + Whp->FromBuff[14];
Bcd[2] = Whp->FromBuff[15]*16 + Whp->FromBuff[16];
Bcd[3] = Whp->FromBuff[17]*16 + Whp->FromBuff[18];//high
//for(i=0;i<4;i++)printf("Bcd[%d]=%02x ",i,Bcd[i]);
lHex[1]=*(ULONG *)&Bcd[0];
//printf("lHex[1]=%ld\n",lHex[1]);

//-Wq
Bcd[0]= Whp->FromBuff[19]*16 + Whp->FromBuff[20];//low
Bcd[1]= Whp->FromBuff[21]*16 + Whp->FromBuff[22];
Bcd[2]= Whp->FromBuff[23]*16 + Whp->FromBuff[24];
Bcd[3]= Whp->FromBuff[25]*16 + Whp->FromBuff[26];//high
lHex[2]=*(ULONG *)&Bcd[0];

//-Wp
Bcd[0]= Whp->FromBuff[27]*16 + Whp->FromBuff[28];//low
Bcd[1]= Whp->FromBuff[29]*16 + Whp->FromBuff[30];
Bcd[2]= Whp->FromBuff[31]*16 + Whp->FromBuff[32];
Bcd[3]= Whp->FromBuff[33]*16 + Whp->FromBuff[34];//high
lHex[3]=*(ULONG *)&Bcd[0];
//printf("Wp=%ld,Wq=%ld,-Wp=%ld,-Wq=%ld\n",lHex[0],lHex[1],lHex[2],lHex[3]);
YmOff = UpUnitNo * 4;
PutYmInLib(UartNo,YmOff,&lHex[0],16);
Lib.Bj3UnitYmReceived=ON;
return(1);
}

//4:	FunCalFromWhPktNBytes()
int CalFromWhWsPktNbytes(){
Whp->PktBytes=38;
return(1);
}

//5:	FunCheckWhPkt()
WORD CheckWhWsPkt(WORD UartNo){
WORD CheckSum,CheckRight,nbytes,i,UpUnitNo,Addr;

Addr=Whp->FromBuff[0];
UpUnitNo=WhCalUnitNo(UartNo,Addr);	//start from 0
Whp->UpUnitNo=UpUnitNo;
if(UpUnitNo==0xFF)return(OFF);
if(debug)printf("~~~~~~~~~~check:");
nbytes=Whp->PktBytes;
CheckSum=CalWhWsCheckSum(&Whp->FromBuff[0],nbytes-3);
if(CheckSum!=*(WORD *)&Whp->FromBuff[nbytes-3]){
	CheckRight=OFF;
	Whp->ErrTimes[UpUnitNo]++;
	if(Whp->ErrTimes[UpUnitNo]>LIMIT_WH_ERR_TIMES){
		Whp->ErrTimes[UpUnitNo]=0;
		}
	}
else	CheckRight=ON;
RecordWhRecvDataListen(UartNo);
if(debug)printf("check end,CheckRight=%d\n",CheckRight);
return(CheckRight);
}
void RecordWhRecvDataListen(WORD UartNo){
WORD	UnitNo,addr;
UnitNo=Whp->UpUnitNo; //start from 0
Whp->RecvData=ON;
addr=UnitNo-Whp->MinNo;
mytime(&Whp->LastRecvDataTime[addr]);
}

WORD	CalWhWsCheckSum(BYTE Buf[],WORD nbytes){
BYTE	sum[2];
WORD	i,CheckSum;

sum[0] = 0;
sum[1] = 0;
for( i = 0; i<nbytes;i++){
	sum[0] = sum[0] ^ Buf[i];
	sum[1] = sum[1] + Buf[i];
	}
CheckSum=*(WORD *)&sum[0];
return(CheckSum);
}

⌨️ 快捷键说明

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