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

📄 pack_comm.c

📁 税控收款机源码:拼音输入法,LCD,VFD驱动,IC卡驱动,税控国标
💻 C
📖 第 1 页 / 共 4 页
字号:
		   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 + -