📄 nsawhws1.c
字号:
}
}
*/
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 + -