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

📄 posbusmodem.lst

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

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

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

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

 663                                      if(strncmp(buf, RetInfo[i], strlen(RetInfo[i]))==0)
 664                                              break;
 665                              }
 666                          return (i+1);
 667                      } else return (-3);//retcode invalid
 668                  }
 669              }
 670              return (-4);//retcode too long
 671          }
 672          
 673          */


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2876    ----
   CONSTANT SIZE    =    183    ----
   XDATA SIZE       =    132    1736
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     19     111
   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 + -