📄 pack_comm.c
字号:
send_str(6,buf_tr);
order_mode=0x80;
break;
}
else
{
Back_Outorder(0,0,0,buf_tr);
}
}*/
}
}while(key!=VOID);
if(key==VOID) return CANCEL;
//------------接收命令------------//
Hand_num=200; /*循环20次,时间为20秒钟*/
do
{
if((trans_mode==0)||(trans_mode==1))
{
if(!rece(6,buf_tr))
{
if((buf_tr[1]==comm_func)&&(buf_tr[5]==0x66))
{
if(trans_mode==RECEIVE_MODE)send_ACK_NAK(ANSWER_ACK);
break;
}
else{send_ACK_NAK(ANSWER_NAK);}
}
}
else
{
/* EA=0;
if(!rece(5,buff))
{
ord_lenght=buff[4]+2;
if(!rece((ord_lenght-5),&buff[5]))
{
cs = crcxdata((ord_lenght-2),&buff[0]);
csh = (cs&0xff00)>>8;
csl = (cs&0x00ff);
if(
((buff[2]>=0x10) && (buff[2]<=0x18))
&&((buff[ord_lenght-2] ==csh)&&(buff[ord_lenght -1] ==csl))
)
{
command_type=buff[2];
for(j=0;j<(ord_lenght-6);j++)buf[j]=buff[5+j];//保存命令数据
order_mode=ord_lenght-6;
order_mode&=0x7f; //最高位为标志位
EA=1;
break;
}
else Back_Outorder(0,0,0,buf_tr);
}
else Back_Outorder(0,0,0,buf_tr);
}
EA=1;
*/
break;
}
Hand_num--;
}while(Hand_num);
if(!Hand_num) return COMM_FAIL;
//send_char(0xaa);
bc_pack_num=0; //保存的包号数
if(trans_mode==RECEIVE_MODE)//接收数据包
{
Hand=0;
pack_tail=0;
do
{
EA=0;
if(!rece(3,buff)) //包头+包长
{
if(buff[0]!=0x86)
{
//send_ACK_NAK(ANSWER_NAK);
EA=1;
Hand++;
}
else
{
pack_length=(buff[1]&0x00ff)<<8|(buff[2]&0x00ff);
//另注:包长==数据区的长度+包号长度,高位在前;
if(!rece(pack_length+3,&buff[3]))
{
//send_str(59,buff);return COMM_FAIL;
EA=1;
pack_num=((buff[3]&0x00ff)<<8)|(buff[4]&0x00ff);
if(pack_num!=bc_pack_num+1)//是否为连续包
{
//send_ACK_NAK(ANSWER_NAK);//需要重新接收技术,接收的包不连续
Hand++; //出错的次数允许3次
}
else//接收到下一包
{
pack_crc=crcxdata(pack_length+2,&buff[1]);
pack_tail=buff[pack_length+5];
if((buff[pack_length+4]==((pack_crc&0xff00)>>8))&&
(buff[pack_length+3]==(pack_crc&0x00ff))
&&((pack_tail==0x88)||(pack_tail==0x99)))
{
Hand=0;
beep(50);
if(comm_func==RV_PLU_HEAD)//若接收plu头信息
{
error=write_plu_name(bc_pack_num*per_pack_num,(pack_length-2)/data_len,&buff[5]);
if(error) return error;
bc_pack_num++;
plu_num=plu_num+(pack_length-2)/data_len;
sprintf(buf,"接收到第%u包数据",bc_pack_num);
lcd_disp(2,0,buf);
}
else if(comm_func==RV_PLU_ALL)//若接收plu整个结构信息
{
plu_num=plu_num+(pack_length-2)/data_len;
if(!(plu_num>MAX_PLU_NUM))
{
write_plu_all((plu_num-(pack_length-2)/data_len),(pack_length-2)/data_len,&buff[5]);//write_plu_all(bc_pack_num*per_pack_num,(pack_length-2)/data_len,&buff[5]);//起始PLU号,PLU个数,数据池
bc_pack_num++;//接收到第几包数据
sprintf(buf,"接收到第%u包数据",bc_pack_num);
lcd_disp(2,0,buf);
if(pack_tail==0x99){g_max_plu_no = plu_num;write_eeprom(PLU_NUM,2,&g_max_plu_no);}//保最大的PLU号在EE里面
}
else
{
write_plu_all((plu_num-(pack_length-2)/data_len),(MAX_PLU_NUM-(plu_num-(pack_length-2)/data_len)),&buff[5]);//起始PLU号,PLU个数,数据池
sprintf(buf,"PLU个数已到最大个数");
lcd_disp(2,0,buf);
pack_tail=0x99;
g_max_plu_no = MAX_PLU_NUM;
write_eeprom(PLU_NUM,2,&g_max_plu_no);//保最大的PLU号在EE里面
delayms(5000);
}
}
else if(comm_func==RV_BRANCH)//若接收部门整个结构信息
{
bc_pack_num++;//接收到第几包数据
sprintf(buf,"接收到第%u包数据",bc_pack_num);
lcd_disp(2,0,buf);
LL=plu_num;
plu_num=plu_num+(pack_length-2)/data_len;
if(plu_num>MAX_BRANCH_NUM) {plu_num=MAX_BRANCH_NUM;pack_tail=0x99;}
if(!(plu_num>MAX_BRANCH_NUM))
{
for(i=LL,cs=0;i<plu_num;i++,cs++)//一包数据中有plu_num-LL个部门数据
{
addtemp=cs*data_len+5;
for(j=0;j<4;j++)buf[j]=buff[addtemp+3-j];
for(j=4;j<8;j++)buf[j]=buff[addtemp+11-j];
for(j=8;j<12;j++)buf[j]=buff[addtemp+19-j];
for(j=12;j<16;j++)buf[j]=buff[addtemp+27-j];
for(j=16;j<data_len;j++)
{
buf[j]=buff[addtemp+j];
}
buf[j]=lrcdata(BRANCH_STRUCT_LEN-1,1,buf);
addtemp=BRANCH_ADDR+BRANCH_STRUCT_LEN*(i);
error = write_eeprom((uint)addtemp,BRANCH_STRUCT_LEN,buf);
if(error) return WRITE_EEPROM_FAIL;
}
if((pack_tail==0x99)||(plu_num==MAX_BRANCH_NUM))
{
j = plu_num;
write_eeprom(BRANCH_NUM,1,&j);
}//保最大的部门数在EE里面
}
}
else return COMM_FAIL; //无用的命令
if((pack_tail==0x88)||(pack_tail==0x99))
{
//send_ACK_NAK(ANSWER_ACK);
if(((plu_num==MAX_BRANCH_NUM)||(plu_num==MAX_PLU_NUM))&&(pack_tail!=0x99))
{
//pack_tail=0x99;
send_ACK_NAK(0x35);
}//主动要求结束通信
else send_ACK_NAK(ANSWER_ACK);
}
}// else//接收到下一包
else {Hand++;}//send_char(0x33);send_ACK_NAK(ANSWER_NAK);
}//if(!rece(pack_length+3,&buff[3]))
}//接收数据包成功
}//包头正确
}//接收到包头和包长
}while((pack_tail!=0x99)&&(Hand!=3));
if(Hand==3)
{
EA=1;
send_ACK_NAK(ANSWER_NAK);//send_char(0x33);
return COMM_FAIL;
}
if(pack_tail==0x99)
{
//2005.11.16
q=50;
do
{
q--;
if(!rece(6,buf_tr))
check=buf_tr[1];
else check=0;
}while((q!=0)&&(check!=0x32)&&(check!=0x33));
//if(check==0x35)
send_ACK_NAK(ANSWER_ACK);
EA=1;
return 0; //最后一包数据
}
} //接收模式
else if(trans_mode==SEND_MODE)//发送模式
{
//per_pack_num=15;//每包发15条
Hand=0;
if((comm_func==SD_PLU_HEAD)||(comm_func==SD_PLU_ALL))
{
pack_quotient=g_max_plu_no/per_pack_num;
pack_remainder=g_max_plu_no%per_pack_num;
}
else if(comm_func==SD_BRANCH)
{
error = read_eeprom(BRANCH_NUM,2,buf);
if(error) return READ_EEPROM_FAIL;
j=buf[0];
//send_char(j);
pack_quotient=j/per_pack_num; //完整的包数
pack_remainder=j%per_pack_num; //不足一包的个数
}
else if(comm_func==SD_FAUDATA)
{
if(read_eeprom(FAU_Quantity,2,&pack_length))return 1;
pack_quotient=(pack_length)/per_pack_num;//per_pack_num为一包可打FAU的个数
pack_remainder=(pack_length)%per_pack_num;//剩下的FAU的个数
}
else return COMM_FAIL; //无用的命令
valid_data_len=(uint)(per_pack_num*data_len);//实际有效的数据长度
valid_data_len+=2;//包长==数据区的长度+包号长度,高位在前
if(pack_quotient>0)
{
for(LL=0;LL<pack_quotient;LL++)
{
if(comm_func==SD_PLU_HEAD)
error=read_plu_name(bc_pack_num*per_pack_num,per_pack_num,&buff[5]); //每次读1015个字节的plu
else if(comm_func==SD_PLU_ALL)//上传整个PLU
error=read_plu_all(bc_pack_num*per_pack_num,per_pack_num,&buff[5]); //每次读取一个数据包的数据
if(comm_func==SD_BRANCH)
{
for(i=0;i<per_pack_num;i++)
{
addtemp=BRANCH_ADDR+(bc_pack_num*per_pack_num+i)*BRANCH_STRUCT_LEN;//BRANCH_ADDR+bc_pack_num*(per_pack_num+1)+BRANCH_STRUCT_LEN*i;
error = read_eeprom((uint)addtemp,(BRANCH_STRUCT_LEN-1),buf);//&buff[5+(BRANCH_STRUCT_LEN-1)*i]);
if(error) return READ_EEPROM_FAIL;
for(j=0;j<4;j++)buff[5+(BRANCH_STRUCT_LEN-1)*i+j]=buf[3-j];//数据的高低位对调
for(j=4;j<8;j++)buff[5+(BRANCH_STRUCT_LEN-1)*i+j]=buf[11-j];
for(j=8;j<12;j++)buff[5+(BRANCH_STRUCT_LEN-1)*i+j]=buf[19-j];
for(j=12;j<16;j++)buff[5+(BRANCH_STRUCT_LEN-1)*i+j]=buf[27-j];
for(j=16;j<data_len;j++)
{
buff[5+(BRANCH_STRUCT_LEN-1)*i+j]=buf[j];
}
//error = read_eeprom((uint)addtemp,(BRANCH_STRUCT_LEN-1),&buff[5+(BRANCH_STRUCT_LEN-1)*i]);
//if(error) return READ_EEPROM_FAIL;
}
}
else if(comm_func==SD_FAUDATA) //上传审计记录
{
addtemp=FAU_DATA_START_ADD+bc_pack_num*per_pack_num;
if(!(bc_pack_num%64)) //跨扇区跳过最后7个字节一扇区可打64包一包113个记录
{
error=read_flash(addtemp,49*9,&buff[5]);
error=read_flash((addtemp+7+49*9),64*9,&buff[5+49*9]);
}
else
error=read_flash(addtemp,per_pack_num,&buff[5]);
}
//if(error) return error;
bc_pack_num=bc_pack_num+1;/*包号加1*/
buff[0]=0x86;/*包头*/
buff[1]=*((uchar *)(&valid_data_len));//0x03;/*长度高字节*/
buff[2]=*((uchar *)(&valid_data_len)+1);//0xf2;/*长度低字节*///实际有效的数据长度
buff[3]=(bc_pack_num&0xff00)>>8;/*包号高字节*/
buff[4]=bc_pack_num&0x00ff; /*包号低字节*/
pack_crc=crcxdata(valid_data_len+2,&buff[1]);
buff[valid_data_len+3]=pack_crc&0x00ff;
buff[valid_data_len+4]=(pack_crc&0xff00)>>8;
if((bc_pack_num==pack_quotient)&&(pack_remainder==0))buff[valid_data_len+5]=0x99;
else buff[valid_data_len+5]=0x88;
send_str(valid_data_len+6,buff);
beep(50);
q=400;
do
{
q--;
if(!rece(6,buf_tr))
check=buf_tr[1];
else check=0;
}while((q!=0)&&(check!=0x32)&&(check!=0x33));
sprintf(buf,"发送第%u包数据",bc_pack_num);
lcd_disp(2,0,buf);
if(check==0x35){send_ACK_NAK(ANSWER_ACK); return 0;}
if(check!=0x32){LL--;bc_pack_num--;Hand++;delayms(5000);}
else {Hand=0;}
if(Hand>=3)return COMM_FAIL;
//if(check==0x32) return 0;
//else return COMM_FAIL;
//if(q==0) return COMM_FAIL;
//if(check==0x32) return 0;
//if(check==0x33) return 0;
}
}//if(pack_quotient>0)
if(pack_remainder!=0)
{
beep(50);
for(Hand=0;Hand<3;Hand++)
{
if(comm_func==SD_PLU_HEAD)
error=read_plu_name(bc_pack_num*per_pack_num,pack_remainder,&buff[5]); //取数据
else if(comm_func==SD_PLU_ALL)
error=read_plu_all(bc_pack_num*per_pack_num,pack_remainder,&buff[5]);//读取最后一个数据包的数据
if(comm_func==SD_BRANCH)
{
for(i=0;i<pack_remainder;i++)
{
addtemp=BRANCH_ADDR+(bc_pack_num*per_pack_num+i)*BRANCH_STRUCT_LEN;
error = read_eeprom((uint)addtemp,(BRANCH_STRUCT_LEN-1),buf);//&buff[5+(BRANCH_STRUCT_LEN-1)*i]);
if(error) return READ_EEPROM_FAIL;
for(j=0;j<4;j++)buff[5+(BRANCH_STRUCT_LEN-1)*i+j]=buf[3-j];//数据的高低位对调
for(j=4;j<8;j++)buff[5+(BRANCH_STRUCT_LEN-1)*i+j]=buf[11-j];
for(j=8;j<12;j++)buff[5+(BRANCH_STRUCT_LEN-1)*i+j]=buf[19-j];
for(j=12;j<16;j++)buff[5+(BRANCH_STRUCT_LEN-1)*i+j]=buf[27-j];
for(j=16;j<data_len;j++)
{
buff[5+(BRANCH_STRUCT_LEN-1)*i+j]=buf[j];
}
//error = read_eeprom((uint)addtemp,(BRANCH_STRUCT_LEN-1),&buff[5+(BRANCH_STRUCT_LEN-1)*i]);
//if(error) return READ_EEPROM_FAIL;
}
}
else if(comm_func==SD_FAUDATA)
{
addtemp=FAU_DATA_START_ADD+bc_pack_num*per_pack_num;
if(!(bc_pack_num%64)) //跨扇区跳过最后7个字节一扇区可打64包一包113个记录
{
if(pack_remainder>49)
{
error=read_flash(addtemp,49*9,&buff[5]);
error=read_flash((addtemp+7+49*9),(pack_remainder*data_len-49*9),&buff[5+49*9]);
}
else
error=read_flash(addtemp,pack_remainder*data_len,&buff[5]);
}
else
error=read_flash(FAU_DATA_START_ADD+bc_pack_num*per_pack_num,pack_remainder*data_len,&buff[5]);
}
if(error) return error;
bc_pack_num+=1;
buff[0]=0x86;/*包头*/
buff[1]=((pack_remainder*data_len+2)&0xff00)>>8;/*长度高字节*/
buff[2]=(pack_remainder*data_len+2)&0x00ff; /*长度低字节*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -