📄 posbusmodem.lst
字号:
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 + -