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

📄 busmodem.c

📁 抄水表手持POS代码
💻 C
📖 第 1 页 / 共 2 页
字号:
// This modul has the following functin:
// fuctionno=0: for protocol               			:NULL
// fuctionno=2: Link...(devno,StationNo)			:devno[LL],devno[HH],StationNo[LL],StationNo[HH]
// fuctionno=4: Login  (user name,password,OpSnr)	
//                                                  :user name[10],password[10],OpSnr[4],SecurityStr[16]	
// fuctionno=6: logout (down net)					:NULL
// fuctionno=8: CheckTime send LocalTm,rec SeverTm)	:loctm[6],svrtm[6](tm_format:YYMMDDhhmmss)
// fuctionno=10: Transfer Data ()					:data[...]
// fuctionno=12: Transfer End ()					:

#include "_POS.h"


#define MODEM_CP_LINK		02
#define MODEM_CP_LOGIN		04
#define MODEM_CP_LOGOUT		06
#define MODEM_CP_CHECKTIME  0X08
#define MODEM_CP_TDSTART	10        //packageno;;length_L;length_H;Sum_L;Sum_H;;
#define MODEM_CP_TDDATA		12        //data...
#define MODEM_CP_TDEND		14        //packageno;;length_L;length_H;Sum_L;Sum_H;;

#define CRC_POLYNOM     0x1021
#define CRC_PRESET      0xFFFF
#define CRC_CHKBYTES    2

#define MI_CRC_ZERO		0
#define MI_CRC_NOTZERO	1


char ModemLink(char *dialnum,int devno,int StationNo);
char ModemLogin(char username[10],char password[10],char opsnr[4]);
char ModemTime();
char ModemTx(unsigned char *txbuf, int length,unsigned int sno ,unsigned char funno,int waittm);  //length<240
char ModemTx5(unsigned char *txbuf, int length,unsigned int sno ,unsigned char funno,int waittm);  //length<240
int  ModemRx(unsigned char *rbuf, int length,int dl);//return =0:NOK,  1~256 OK'
char ModemOnline();
void ModemOffline();
char ModemSend(uchar *tm,int length);


unsigned char  ModemInit();
unsigned char  modemdial(unsigned char*num);
void modemanswer();
int modem_retcode(int handle,char *buf,int len);
int modem_rec(int dltm,int recnum,uchar *buf);
//int Calc_crc(uchar mode, uchar len, uchar *in, uchar *out);


unsigned char modemhd;

#define ESC    0x1b

#define EM              -150

//ret code state
#define Leading_CR		0
#define Leading_LF		1
#define Message			2
#define Trailing_CR		3
#define Trailing_LF		4

//return code
#define RE_NONE		    0
#define RE_OK			1
#define RE_CONNECT		2
#define RE_RING			3
#define RE_NOCARRIER	4
#define RE_ERROR		5
#define RE_NODIALTONE	6
#define RE_BUSY			7
#define RE_NOANSWER		8
#define RE_CARRIER		9
#define RE_DATA         10
#define RE_FAX          11
#define RE_UNKNOWN		12
#define RE_TIMEOUT		13

#define MODEM_CP_REQDATA		15				//request data
#define MODEM_CP_RDSTART		16
#define MODEM_CP_RDSTDATA	18
#define MODEM_CP_RDEND		1a

#define MODEM_OK		1
#define MODEM_NOK		0


//modem command state
#define Idle        0
#define Dialing     1
#define Answer      2
#define Hangup      3
#define Online      4

#define PACKETSIZE  110
extern unsigned char devid;


char xdata  RetInfo[11][12] = {//
	"OK",
	"CONNECT",
	"RING",
	"NO CARRIER",
	"ERROR",
	"NO DIALTONE",
	"BUSY",
	"NO ANSWER",
	"CARRIER",
	"DATA",
	"FAX"
};

unsigned int mspb=2;



//-------------------------------------------------------------------------------------------------
int modem_read(char dev_id,uint len,uchar *buf)
{
 int last_r;
 while(1)
 {
  last_r=_pRecBuf;
  if(last_r==R232MEMMAX){ memcpy(buf,_R232Buf,len);_pRecBuf=0;return last_r;}
  _delay_1ms(200); 
  if(last_r==_pRecBuf)
  {
   /*if(last_r>sizeof(buf))memcpy(buf,_R232Buf,sizeof(buf));
	else */memcpy(buf,_R232Buf,last_r);
	_pRecBuf=0;return last_r;
  }
 }
}

int modem_write(char dev_id,uint len,uchar *buf)
{
_os232(buf,len);
}

unsigned char  modemdial(unsigned char *num)
{
uchar xdata phone[20]="            ";
uchar xdata cmd[40]="ATDT";
uchar xdata buf[40];
int i,len,ret;

    if(strlen(num)<2)
    {
     _Clr(); _Display(0,1, "请输入电话号码:",15);
     if(_GetStr(0,2,phone,16)==0) return MODEM_NOK;
     strcat(cmd, phone);
     strcat(cmd, "\r");
	 }
	 else
	 { strcat(cmd, num);   strcat(cmd, "\r");	}
    len = strlen(cmd);
//	_display(LCD1,3,0,"请稍等.....");
    _os232(cmd, len );
    _delay_1ms(3000);_delay_1ms(3000);_delay_1ms(3000);
    ret = modem_read(modemhd,len,(uchar *)buf);
    if( ret<0 || ret!=len || strncmp(cmd, buf, len)!=0 )
    {
		return MODEM_NOK;
    }
    for(i=0;i<8;i++) {
       	ret = modem_retcode(modemhd, buf, 40);
       	if(ret==RE_NONE) {_delay_1ms(1500*mspb);continue;} 
        else if( ret==RE_CONNECT || ret==RE_CARRIER) {return MODEM_OK;}
        
    }
	return MODEM_NOK;
}

int modem_retcode(int modemhd, char *buf, int len)
{
int i, ret;
uchar xdata *p; 
    p = (uchar *)buf;
    for(i=0;i<len;i++) 
	 {
        ret =  modem_read((uchar)modemhd, 1, p);
        if(ret<0) return ret;
        else if(ret==0) {
            _delay_1ms(mspb);
            ret = modem_read((uchar)modemhd, 1, p);
            if(ret<0) return ret;
            else if(ret==0) return 0;
        }
			for(i=0;i<11;i++) {
		            if(strncmp(buf+2, RetInfo[i], strlen(RetInfo[i]))==0)
			         {return (i+1);  }
	            }
                
	}
   return (-4);
}







/*void modem_test()
{
  unsigned char retchar,rbuf[300],ss[6000];  
  unsigned char  menu_head[15]="请选择测试项目";
  unsigned char  menu0[18]="Modem Link(8001)";
  unsigned char  menu1[18]="ModemTime ";
  unsigned char  menu2[18]="ChkModemOnline   ";
//  unsigned char  menu3[18]="ModemTx      ";
  unsigned char  menu3[18]="ModemRx";
  unsigned char  menu4[18]="modemOffline";
  unsigned char  menu5[18]="modemLogin     ";
  unsigned char  menu6[18]="modemLogout    ";
  unsigned char  menu7[18]="ModemTime       ";
  unsigned char  menu8[18]="TxPacket     ";
  unsigned char  menu9[18]="TxBegin-x-End ";
//  unsigned char  menu6[18]="ModemOnline  ";
  unsigned char  *  menu[12]={menu0,menu1,menu2,menu3,menu4,menu5,menu6,menu7,menu8,menu9,0,0},tmp[0x20]; 
  int ret,i;
  
  page_clear(LCD1);
  while (1) {
    retchar=select_menu(menu_head,menu,10,0,0);
    if ( retchar == 0x1b ) return;
    switch (retchar) {
      case 0:
    	//file_test();
		if(ModemLink("",129,989)==MODEM_NOK)
		    {
			str_display(LCD1,0,0,"link fail");
			delay(1000);
			if(ModemLink("",129,989)==MODEM_NOK);
			}
    	delay(500);
		if(ModemOnline()==MODEM_OK)  str_display(LCD1,1,0,"Online..   ");
		else {//ModemOffline();
		      str_display(LCD1,0,0,"联结不成功...   ");
			  }
		get_key();
    	break;
      case 1:
	     page_clear(LCD1);
		 ModemLogin("duzhaohui\0","ok duzh\0","1234");
		 break;
      case 2:
        page_clear(LCD1);
		if(ModemOnline()==MODEM_OK) str_display(LCD1,0,0,"Online      "); 
		else str_display(LCD1,0,0,"Downline   "); 
		get_key();
        break;  
      case 3:
         page_clear(LCD1);
		 ret=ModemRx(rbuf, 100,9000);
         if(ret>0) {sprintf(tmp,"Rec:%05dbtypes.",ret);str_display(LCD1,1,0,tmp);break;}
		 else str_display(LCD1,1,0,"Nothing rec.");
		 get_key();
      /*        if (ModemTx("asdasdf", 7,11 ,0x99,1300)==MODEM_OK)
		  {
		  str_display(LCD1,0,0,"SendOk1;     ");
		  if (ModemTx("asdfasdf2w332423!#@@$e4", 240,11 ,0x99,2500)==MODEM_OK) {str_display(LCD1,1,0,"SendOk2;     "); get_key();break;}
		  else {str_display(LCD1,1,0,"SendNOk2;     "); get_key();break;}
		  }
		  else	{str_display(LCD1,0,0,"SendFalse    ");get_key();}*/
/*        break; 
      case 4:
         page_clear(LCD1);
		 ModemOffline();
         break;  
      case 5:
	     page_clear(LCD1);
		 ModemLogin("duzhaohui\0","ok duzh\0","1234");
         break;  
      case 6:
	     page_clear(LCD1);		 
         if (ModemTx(NULL, 0,11 ,MODEM_CP_LOGOUT,2500)==MODEM_OK) str_display(LCD1,1,0,"TDLOGOUT Ok1;     "); else str_display(LCD1,1,0,"TDLOGOUT fail;     "); 
         break;  
      case 7:
	     page_clear(LCD1);
         ModemTime();
         break;  
      case 8:
	     page_clear(LCD1);
		 for(i=0;i<6000;i++) {if ((i&1)==1) ss[i]=i;else ss[i]=i>>8;}
		 if (ModemSend(ss,6000)==MODEM_OK) str_display(LCD1,1,0,"TxPacket OK;     "); 
		 else str_display(LCD1,1,0,"TxPacket fail;     "); 
		 get_key();
         break;  
      case 9:
	     page_clear(LCD1);
         if (ModemTx5(NULL, 0,11 ,MODEM_CP_TDSTART,500)==MODEM_OK) str_display(LCD1,1,0,"TDSTART Ok1;     "); else str_display(LCD1,1,0,"TDSTART fail;     "); 
         if (ModemTx5("ASDKL;FJALK;SDFJ89QWURIEPOIDF", 238,12 ,MODEM_CP_TDDATA,500)==MODEM_OK)  str_display(LCD1,1,0,"TDDATA Ok1;     "); else str_display(LCD1,1,0,"TDDATA fail;     "); 
         if (ModemTx5(NULL, 0,11 ,MODEM_CP_TDEND,500)==MODEM_OK)  str_display(LCD1,1,0,"TDSTEND Ok1;     "); else str_display(LCD1,1,0,"TDSTEND Fail;     "); 
		 get_key();
         break;  
     default:
        break;  
    }
  }
}
*/


char ModemSend(uchar *txbuf,int length)
{
int pdiv,pmod,i,sno=0,chksum=0;
uchar xdata tmp[9];
pdiv=length/PACKETSIZE;
pmod=length%PACKETSIZE;
//packageno;;length_L;length_H;Sum_L;Sum_H;
tmp[0]=pdiv+1;
tmp[1]=(uchar)length;tmp[2]=(uchar)(length>>8);
for(i=0;i<length;i++) chksum=chksum+tmp[i];
tmp[3]=(char)chksum;tmp[4]=(char)(chksum>>8);
if (ModemTx5(tmp, 5,0xfffe ,MODEM_CP_TDSTART,1500)==MODEM_NOK)    return MODEM_NOK;
for(i=0;i<pdiv;i++)
    if (ModemTx5(txbuf+(i*PACKETSIZE), PACKETSIZE,i,MODEM_CP_TDDATA,500)==MODEM_NOK) return MODEM_NOK;
if (ModemTx5(txbuf+(i*PACKETSIZE), pmod,i,MODEM_CP_TDDATA,1500)==MODEM_NOK) return MODEM_NOK;

if (ModemTx5(tmp, 5,0xfffe ,MODEM_CP_TDEND,1500)==MODEM_NOK)      return MODEM_NOK;
return MODEM_OK;
}

char  ModemLink(char *dialnum,int devno,int StationNo)
{
uchar xdata tmp[100]="拨号:\0              ";
_Clr();
//str_display(LCD1,2,0,"MODEM初始化... "); 	
if (strlen(dialnum)>2) {strcat(tmp, dialnum);strcat(tmp, "...\0");_Display(0,0,tmp,strlen(tmp));}
_delay_1ms(800);
if(modemdial(dialnum)==MODEM_OK)   {modem_read(modemhd,1,tmp);}
else   {return MODEM_NOK;}
tmp[0]=(uchar)devno;		tmp[1]=(uchar)(devno>>8);
tmp[2]=(uchar)StationNo;	tmp[3]=(uchar)(StationNo>>8);

⌨️ 快捷键说明

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