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

📄 busmodem.lst

📁 抄水表手持POS代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
 452           return ModemTx(rbuf, length,0 ,funno,dl);
 453          }
 454          
 455          char ModemSendFunno(unsigned char *txbuf, int length,unsigned int sno ,unsigned char funno)
 456          {
 457            unsigned char xdata buf[1024];//,tmp[16];
 458            unsigned int  sum=0;
 459            int i,ret;
 460            if(length>1000)                     return MODEM_NOK;
 461            buf[0]=0xa9;                          buf[1]=0x6e;   
 462            buf[2]=(unsigned char)sno;    buf[3]=sno>>8;        
 463            buf[4]=(unsigned char)length; buf[5]=length>>8;         
 464            buf[6]=funno;                                 buf[7]=funno^0xff;        
 465            for(i=0;i<length;i++)   buf[8+i]=txbuf[i];
 466            for(i=0;i<(length+8);i++) sum=sum+(unsigned int)buf[i];
 467            buf[8+length]  =(unsigned char) sum;
 468            buf[9+length]  =(unsigned char)(sum>>8);  
 469            _Calc_crc(CRC16,  length+10, buf, buf+8+length+2);  
 470            _delay_1ms(2);ret=modem_write(modemhd,length+12,buf);
 471            if ( ret <= 0 )        {return MODEM_NOK; }
 472            return MODEM_OK;
 473          }
 474          
 475          
 476          
 477          unsigned char ModemFunno(unsigned char *rbuf,int length,unsigned char funno, int waittm)
 478          {
 479            uchar crc[2],tmp[16];
C51 COMPILER V6.23a  BUSMODEM                                                              08/30/2004 18:06:36 PAGE 9   

 480            int i;
 481            unsigned sum;
 482            i=modem_rec(waittm,length,rbuf);
 483            if(i!=length)    {return MODEM_NOK;}
 484            if ((rbuf[0]!=0xa9) || (rbuf[1]!=0x6e) ) return MODEM_NOK;
 485            if ((rbuf[2]!=0x00) || (rbuf[3]!=0x00) || (rbuf[4]!=length-12) || (rbuf[5]!=0x00) || (rbuf[6]!=funno) ) 
             -     return MODEM_NOK;
 486            sum=0;
 487            for(i=0;i<length-4;i++)  sum=sum+(int)rbuf[i];
 488            if(rbuf[length-4]!=(unsigned char)(sum) )    return MODEM_NOK;
 489            if(rbuf[length-3]!=(unsigned char)(sum>>8) ) return MODEM_NOK;
 490          
 491            _Calc_crc(CRC16,length-2,rbuf,crc);
 492            if(rbuf[length-2]  !=crc[0] ) return MODEM_NOK;
 493            if(rbuf[length-1]  !=crc[1] ) return MODEM_NOK;
 494          
 495           return MODEM_OK;
 496          }
 497          */
 498          //test uart1 operation
 499          char ModemTx(unsigned char *txbuf, int length,unsigned int sno ,unsigned char funno,int waittm)
 500          {
 501   1        unsigned char xdata buf[1024],rbuf[100],crc16[2];//,tmp[16];
 502   1        unsigned int  sum=0;
 503   1        int i,ret;
 504   1        if(length>1000)                     return MODEM_NOK;
 505   1        buf[0]=0xa9;                          buf[1]=0x6e;   
 506   1        buf[2]=(unsigned char)sno;    buf[3]=sno>>8;        
 507   1        buf[4]=(unsigned char)length; buf[5]=length>>8;         
 508   1        buf[6]=funno;                                 buf[7]=funno^0xff;        
 509   1        for(i=0;i<length;i++)   buf[8+i]=txbuf[i];
 510   1        for(i=0;i<(length+8);i++) sum=sum+(unsigned int)buf[i];
 511   1        buf[8+length]  =(unsigned char) sum;
 512   1        buf[9+length]  =(unsigned char)(sum>>8);  
 513   1        _Calc_crc(CRC16,  length+10, buf, buf+8+length+2);  
 514   1        _delay_1ms(2);ret=modem_write(modemhd,length+12,buf);
 515   1        if ( ret <= 0 )        {return MODEM_NOK; }
 516   1      
 517   1        memset(rbuf,0,sizeof(rbuf));
 518   1        i=modem_rec(waittm,17,rbuf);
 519   1        if(i!=17)    {return MODEM_NOK;}
 520   1        if ((rbuf[0]!=0xa9) || (rbuf[1]!=0x6e) ) return MODEM_NOK;
 521   1        if ((rbuf[2]!=0x00) || (rbuf[3]!=0x00) || (rbuf[4]!=0x05) || (rbuf[5]!=0x00) || (rbuf[6]!=0x00) )      r
             -eturn MODEM_NOK;
 522   1        if (memcmp(buf+2,rbuf+8,5)!=0) return MODEM_NOK;
 523   1        sum=0;
 524   1        for(i=0;i<13;i++)  sum=sum+(int)rbuf[i];
 525   1        if(rbuf[13]!=(unsigned char)(sum) )    return MODEM_NOK;
 526   1        if(rbuf[14]!=(unsigned char)(sum>>8) ) return MODEM_NOK;
 527   1        _Calc_crc(CRC16,  15,rbuf,crc16);
 528   1        if(rbuf[15]  !=crc16[0] ) return MODEM_NOK;
 529   1        if(rbuf[16]  !=crc16[1] ) return MODEM_NOK;
 530   1        return MODEM_OK;
 531   1      }
 532          
 533          /*int ModemRx(unsigned char *rbuf, int length,int dl)
 534          {
 535          //datformat: 0xa9,0x6e,sno[0], sno[1], length[0],length[1],txbuf[0], txbuf[1], data[0...length-1],sum[0],s
             -um[1],crc[0],crc[1]
 536          //datformat: 0xa9,0x6e,sno[0], sno[1], length[0],length[1],sum[0],sum[1],crc[0],crc[1]
 537            unsigned char xdata buf[1024];
 538            unsigned int  sum=0;
C51 COMPILER V6.23a  BUSMODEM                                                              08/30/2004 18:06:36 PAGE 10  

 539            int i,r_ret,t_ret;
 540            _delay_1ms(dl);
 541            r_ret=modem_rec(10,length,buf);
 542            if(r_ret<12)    {return 0;}
 543            if ((rbuf[0]!=0xa9) || (rbuf[1]!=0x6e) ) return 0;
 544            if (rbuf[6]!=(rbuf[7]^0xff) )  return 0;
 545            buf[0]=0xa9;                          buf[1]=0x6e;   
 546            buf[2]=rbuf[2];                               buf[3]=rbuf[3];               
 547            buf[4]=5;                                             buf[5]=0;         
 548            buf[6]=buf[6];                                buf[7]=rbuf[7];           
 549            for(i=0;i<5;i++)   buf[8+i]=rbuf[i];
 550            for(i=0;i<(5+8);i++) sum=sum+(unsigned int)buf[i];
 551            buf[8+5]  =(unsigned char) sum;
 552            buf[9+5]  =(unsigned char)(sum>>8);  
 553            _Calc_crc(CRC16,  5+10, buf, buf+8+5+2);  
 554            t_ret=modem_write(modemhd,5+12,buf);
 555            if ( t_ret <= 0 )      {return 0; }
 556            return r_ret;
 557          }
 558          
 559          
 560          int Calc_crc(uchar mode, uchar len, uchar *in, uchar *out)//CRC
 561          {
 562            int  i, j, stat;
 563            uint crc;
 564            stat=MI_CRC_ZERO;
 565            if (mode==CRC8) {
 566                  *out=0xC7;      // bit-swapped 0xE3
 567                  for (j=0; j<len; j++){
 568                    *out=*out^in[j];
 569                    for(i=0;i<8;i++) {if (*out&0x80) *out=(*out<<1)^0x1D; else  *out = *out<<1;  }
 570                  }
 571                  if (*out)  stat=MI_CRC_NOTZERO;
 572            }
 573            else { // CRC16  //   crc = 0xC78C;   // bit-swapped 0x31E3
 574                  crc = 0x0000;   // bit-swapped 0x31E3
 575                  for (j=0;j<len; j++){
 576                    crc=crc^((uint)in[j]<<8);
 577                    for (i=0;i<8;i++)  {if (crc&0x8000) crc=(crc<<1)^0x1021; else crc=crc<<1; }
 578                  }
 579                  out[0]=(uchar)(crc>>8); out[1]=(uchar)crc;
 580                  if (crc) stat=MI_CRC_NOTZERO;
 581            }
 582            return (stat);
 583          }
 584          
 585          */
 586          int modem_rec(int dltm,int recnum,uchar *buf)
 587          {
 588   1        unsigned char xdata buff[300];
 589   1        int reclen=0,n,i,dlcnt=0;
 590   1        while(1)
 591   1        {
 592   2      //  if (reclen>=recnum)         return  reclen;
 593   2        if (dlcnt>=(dltm/100)) return MODEM_NOK;  //over time
 594   2        _delay_1ms(100);dlcnt++;
 595   2        memset(buff,0,sizeof(buff));
 596   2        n=modem_read(modemhd,100,buff);
 597   2        if (n==0) continue;
 598   2        else if(n<0) return MODEM_NOK;
 599   2        else if(n>0) 
 600   2             {
C51 COMPILER V6.23a  BUSMODEM                                                              08/30/2004 18:06:36 PAGE 11  

 601   3                 for(i=0;i<n;i++) {reclen++;buf[i]=buff[i];if (i>=256) return reclen;}
 602   3                 while(1)
 603   3                        {
 604   4                        if (reclen>=recnum) return reclen;
 605   4                        if (dlcnt>=(dltm/100)) return reclen;
 606   4                        _delay_1ms(100);dlcnt++;
 607   4                memset(buff,0,sizeof(buff));
 608   4                        n=modem_read(modemhd,100,buff);
 609   4                        if (n==0)    return reclen;
 610   4                        else if(n<0) return MODEM_NOK;   
 611   4                        else if(n>0) 
 612   4                           for(i=0;i<n;i++)  {buf[reclen]=buff[i];reclen++;if (i>=256) return reclen;}
 613   4                }
 614   3             }  
 615   2        }
 616   1      }
 617          /*
 618          
 619          int modem_retcode(int modemhd, char *buf, int len)
 620          {
 621              int i, ret;
 622              uchar state=Leading_CR;
 623              uchar xdata *p; 
 624              uchar xdata str[32];
 625              p = (uchar *)buf;
 626              for(i=0;i<len;i++) {
 627                  ret =  modem_read((uchar)modemhd, 1, p);
 628                  if(ret<0) return ret;
 629                  else if(ret==0) {
 630                      _delay_1ms(mspb);
 631                      ret = modem_read((uchar)modemhd, 1, p);
 632                      if(ret<0) return ret;
 633                      else if(ret==0) return 0;
 634                  }
 635                   if(ret>0){_Display(0,0,_R232Buf,16); 
 636                                  _Display(0,1,buf,16);
 637                                  sprintf(str,"ret=%02x           ",(uint)ret);_Display(0,2,str,16);}
 638                  switch(state)
 639                  {
 640                  case Leading_CR:
 641                      if(*p=='\r') state = Leading_LF;
 642                      break;
 643                  case Leading_LF:
 644                      if(*p=='\n') state = Message;
 645                      else if(*p!='\r') state = Leading_CR;
 646                      break;
 647                  case Message:
 648                      if(*p=='\r') {
 649                          *p = 0;
 650                          state = Trailing_LF;
 651                      } else p++;
 652                      break;
 653                  case Trailing_LF:
 654                      if(*p=='\n') {
 655                          //get ret code
 656                              for(i=0;i<11;i++) {
 657                                      if(strncmp(buf, RetInfo[i], strlen(RetInfo[i]))==0)
 658                                              break;
 659                              }
 660                          return (i+1);
 661                      } else return (-3);//retcode invalid
 662                  }
C51 COMPILER V6.23a  BUSMODEM                                                              08/30/2004 18:06:36 PAGE 12  

 663              }
 664              return (-4);//retcode too long
 665          }
 666          
 667          */


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2590    ----
   CONSTANT SIZE    =    183    ----
   XDATA SIZE       =    132    1736
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      3      97
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  2 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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