📄 busmodem.c
字号:
if (ModemTx(tmp, 4,rand()*rand() ,MODEM_CP_LINK,2500)==MODEM_OK) {
return MODEM_OK;
}
else if (ModemTx(tmp, 4,rand()*rand() ,MODEM_CP_LINK,2500)==MODEM_OK) {
return MODEM_OK;
}
else ;
return MODEM_NOK;
}
char ModemLogin(char username[10],char password[10],char opsnr[4])
{
uchar xdata tmp[100],i;
srand(255);
for(i=0;i<10;i++) {tmp[i]=username[i];tmp[10+i]=password[i];}
for(i=0;i<4;i++) tmp[20+i]=opsnr[i];
for(i=0;i<16;i++) {tmp[24+i]=rand();tmp[40+i]=tmp[24+i];}
if (ModemTx(tmp, 56,11 ,MODEM_CP_LOGIN,2500)==MODEM_OK)
{
// _Display(0,1,"登陆成功 ",16); //get_key();
return MODEM_OK;
}
else if (ModemTx(tmp, 56,11 ,MODEM_CP_LOGIN,2500)==MODEM_OK)
{
// _Display(0,1,"登陆成功 ",16); //get_key();
return MODEM_OK;
}
//else str_display(LCD1,1,0,"登陆失败 "); //get_key();
return MODEM_NOK;
}
/*
char ModemCheckTime(unsigned char *rbuf)
{
unsigned int sum=0;
uchar xdata buf[32],crc16[2];//,tmp[16];
int ret,i;
buf[0]=0xa9; buf[1]=0x6e;
buf[2]=0; buf[3]=0;
buf[4]=0; buf[5]=0;
buf[6]=MODEM_CP_CHECKTIME; buf[7]=MODEM_CP_CHECKTIME^0xff;
for(i=0;i<8;i++) sum=sum+(unsigned int)buf[i];
buf[8] =(unsigned char) sum;
buf[9] =(unsigned char)(sum>>8);
_Calc_crc(CRC16, 10, buf, buf+8+2);
_delay_1ms(2);ret=modem_write(modemhd,12,buf);
if ( ret <= 0 ) {return MODEM_NOK; }
i=modem_rec(1500,26,rbuf);
if(i!=26) {return MODEM_NOK;}
if ((rbuf[0]!=0xa9) || (rbuf[1]!=0x6e) ) return MODEM_NOK;
if ((rbuf[2]!=0x00) || (rbuf[3]!=0x00) || (rbuf[4]!=14) || (rbuf[5]!=0x00) || (rbuf[6]!=MODEM_CP_CHECKTIME) ) return MODEM_NOK;
sum=0;
for(i=0;i<22;i++) sum=sum+(int)rbuf[i];
if(rbuf[22]!=(unsigned char)(sum) ) return MODEM_NOK;
if(rbuf[23]!=(unsigned char)(sum>>8) ) return MODEM_NOK;
_ Calc_crc(CRC16, 24,rbuf,crc16);
if(rbuf[24] !=crc16[0] ) return MODEM_NOK;
if(rbuf[25] !=crc16[1] ) return MODEM_NOK;
return MODEM_OK;
}
/*
unsigned char ModemInit()
{
int ret,len,i;
char buf[40];
uchar hd1;
beep(2,1);
hd1 = modem_open("MODEM1");
if ( hd1 == 0 )
{
modem_close(modemhd);
delay(1000);
hd1 = modem_open("MODEM1");
if ( hd1 == 0 ) {return MODEM_NOK;}
}
beep(1,1);
modemhd=hd1;
strcpy(buf,"ATE1H0\r");
len = strlen(buf);
ret = modem_write(modemhd, len, buf );
if ( ret <= 0 ) { modem_close(modemhd); return MODEM_NOK; }
for(i=0;i<4;i++) {
ret = modem_retcode(modemhd, buf, 40);
if(ret==RE_NONE) { delay (1000); continue; }
else if(ret==RE_OK) {return MODEM_OK; }
}
return MODEM_NOK;
}
*/
/*
void ModemOffline()
{
modem_close(modemhd);
}
char ModemOnline()
{
if (ModemTx(NULL, 0,0 ,0,1300)==MODEM_OK) return MODEM_OK;
delay(1000);
if (ModemTx(NULL, 0,0 ,0,1300)==MODEM_OK) return MODEM_OK;
return MODEM_NOK;
}
*/
char ModemTx5(unsigned char *txbuf, int length,unsigned int sno ,unsigned char funno,int waittm)
{
if(ModemTx(txbuf, length,sno ,funno,waittm)==MODEM_OK) return MODEM_OK; _delay_1ms(100);
if(ModemTx(txbuf, length,sno ,funno,waittm)==MODEM_OK) return MODEM_OK; _delay_1ms(200);
if(ModemTx(txbuf, length,sno ,funno,waittm)==MODEM_OK) return MODEM_OK; _delay_1ms(200);
if(ModemTx(txbuf, length,sno ,funno,waittm)==MODEM_OK) return MODEM_OK; _delay_1ms(500);
if(ModemTx(txbuf, length,sno ,funno,waittm)==MODEM_OK) return MODEM_OK;
return MODEM_NOK;
}
/*
int ModemReq(unsigned char *rbuf, int length, unsigned char funno, int dl)
{
return ModemTx(rbuf, length,0 ,funno,dl);
}
char ModemSendFunno(unsigned char *txbuf, int length,unsigned int sno ,unsigned char funno)
{
unsigned char xdata buf[1024];//,tmp[16];
unsigned int sum=0;
int i,ret;
if(length>1000) return MODEM_NOK;
buf[0]=0xa9; buf[1]=0x6e;
buf[2]=(unsigned char)sno; buf[3]=sno>>8;
buf[4]=(unsigned char)length; buf[5]=length>>8;
buf[6]=funno; buf[7]=funno^0xff;
for(i=0;i<length;i++) buf[8+i]=txbuf[i];
for(i=0;i<(length+8);i++) sum=sum+(unsigned int)buf[i];
buf[8+length] =(unsigned char) sum;
buf[9+length] =(unsigned char)(sum>>8);
_Calc_crc(CRC16, length+10, buf, buf+8+length+2);
_delay_1ms(2);ret=modem_write(modemhd,length+12,buf);
if ( ret <= 0 ) {return MODEM_NOK; }
return MODEM_OK;
}
unsigned char ModemFunno(unsigned char *rbuf,int length,unsigned char funno, int waittm)
{
uchar crc[2],tmp[16];
int i;
unsigned sum;
i=modem_rec(waittm,length,rbuf);
if(i!=length) {return MODEM_NOK;}
if ((rbuf[0]!=0xa9) || (rbuf[1]!=0x6e) ) return MODEM_NOK;
if ((rbuf[2]!=0x00) || (rbuf[3]!=0x00) || (rbuf[4]!=length-12) || (rbuf[5]!=0x00) || (rbuf[6]!=funno) ) return MODEM_NOK;
sum=0;
for(i=0;i<length-4;i++) sum=sum+(int)rbuf[i];
if(rbuf[length-4]!=(unsigned char)(sum) ) return MODEM_NOK;
if(rbuf[length-3]!=(unsigned char)(sum>>8) ) return MODEM_NOK;
_Calc_crc(CRC16,length-2,rbuf,crc);
if(rbuf[length-2] !=crc[0] ) return MODEM_NOK;
if(rbuf[length-1] !=crc[1] ) return MODEM_NOK;
return MODEM_OK;
}
*/
//test uart1 operation
char ModemTx(unsigned char *txbuf, int length,unsigned int sno ,unsigned char funno,int waittm)
{
unsigned char xdata buf[1024],rbuf[100],crc16[2];//,tmp[16];
unsigned int sum=0;
int i,ret;
if(length>1000) return MODEM_NOK;
buf[0]=0xa9; buf[1]=0x6e;
buf[2]=(unsigned char)sno; buf[3]=sno>>8;
buf[4]=(unsigned char)length; buf[5]=length>>8;
buf[6]=funno; buf[7]=funno^0xff;
for(i=0;i<length;i++) buf[8+i]=txbuf[i];
for(i=0;i<(length+8);i++) sum=sum+(unsigned int)buf[i];
buf[8+length] =(unsigned char) sum;
buf[9+length] =(unsigned char)(sum>>8);
_Calc_crc(CRC16, length+10, buf, buf+8+length+2);
_delay_1ms(2);ret=modem_write(modemhd,length+12,buf);
if ( ret <= 0 ) {return MODEM_NOK; }
memset(rbuf,0,sizeof(rbuf));
i=modem_rec(waittm,17,rbuf);
if(i!=17) {return MODEM_NOK;}
if ((rbuf[0]!=0xa9) || (rbuf[1]!=0x6e) ) return MODEM_NOK;
if ((rbuf[2]!=0x00) || (rbuf[3]!=0x00) || (rbuf[4]!=0x05) || (rbuf[5]!=0x00) || (rbuf[6]!=0x00) ) return MODEM_NOK;
if (memcmp(buf+2,rbuf+8,5)!=0) return MODEM_NOK;
sum=0;
for(i=0;i<13;i++) sum=sum+(int)rbuf[i];
if(rbuf[13]!=(unsigned char)(sum) ) return MODEM_NOK;
if(rbuf[14]!=(unsigned char)(sum>>8) ) return MODEM_NOK;
_Calc_crc(CRC16, 15,rbuf,crc16);
if(rbuf[15] !=crc16[0] ) return MODEM_NOK;
if(rbuf[16] !=crc16[1] ) return MODEM_NOK;
return MODEM_OK;
}
/*int ModemRx(unsigned char *rbuf, int length,int dl)
{
//datformat: 0xa9,0x6e,sno[0], sno[1], length[0],length[1],txbuf[0], txbuf[1], data[0...length-1],sum[0],sum[1],crc[0],crc[1]
//datformat: 0xa9,0x6e,sno[0], sno[1], length[0],length[1],sum[0],sum[1],crc[0],crc[1]
unsigned char xdata buf[1024];
unsigned int sum=0;
int i,r_ret,t_ret;
_delay_1ms(dl);
r_ret=modem_rec(10,length,buf);
if(r_ret<12) {return 0;}
if ((rbuf[0]!=0xa9) || (rbuf[1]!=0x6e) ) return 0;
if (rbuf[6]!=(rbuf[7]^0xff) ) return 0;
buf[0]=0xa9; buf[1]=0x6e;
buf[2]=rbuf[2]; buf[3]=rbuf[3];
buf[4]=5; buf[5]=0;
buf[6]=buf[6]; buf[7]=rbuf[7];
for(i=0;i<5;i++) buf[8+i]=rbuf[i];
for(i=0;i<(5+8);i++) sum=sum+(unsigned int)buf[i];
buf[8+5] =(unsigned char) sum;
buf[9+5] =(unsigned char)(sum>>8);
_Calc_crc(CRC16, 5+10, buf, buf+8+5+2);
t_ret=modem_write(modemhd,5+12,buf);
if ( t_ret <= 0 ) {return 0; }
return r_ret;
}
int Calc_crc(uchar mode, uchar len, uchar *in, uchar *out)//CRC
{
int i, j, stat;
uint crc;
stat=MI_CRC_ZERO;
if (mode==CRC8) {
*out=0xC7; // bit-swapped 0xE3
for (j=0; j<len; j++){
*out=*out^in[j];
for(i=0;i<8;i++) {if (*out&0x80) *out=(*out<<1)^0x1D; else *out = *out<<1; }
}
if (*out) stat=MI_CRC_NOTZERO;
}
else { // CRC16 // crc = 0xC78C; // bit-swapped 0x31E3
crc = 0x0000; // bit-swapped 0x31E3
for (j=0;j<len; j++){
crc=crc^((uint)in[j]<<8);
for (i=0;i<8;i++) {if (crc&0x8000) crc=(crc<<1)^0x1021; else crc=crc<<1; }
}
out[0]=(uchar)(crc>>8); out[1]=(uchar)crc;
if (crc) stat=MI_CRC_NOTZERO;
}
return (stat);
}
*/
int modem_rec(int dltm,int recnum,uchar *buf)
{
unsigned char xdata buff[300];
int reclen=0,n,i,dlcnt=0;
while(1)
{
// if (reclen>=recnum) return reclen;
if (dlcnt>=(dltm/100)) return MODEM_NOK; //over time
_delay_1ms(100);dlcnt++;
memset(buff,0,sizeof(buff));
n=modem_read(modemhd,100,buff);
if (n==0) continue;
else if(n<0) return MODEM_NOK;
else if(n>0)
{
for(i=0;i<n;i++) {reclen++;buf[i]=buff[i];if (i>=256) return reclen;}
while(1)
{
if (reclen>=recnum) return reclen;
if (dlcnt>=(dltm/100)) return reclen;
_delay_1ms(100);dlcnt++;
memset(buff,0,sizeof(buff));
n=modem_read(modemhd,100,buff);
if (n==0) return reclen;
else if(n<0) return MODEM_NOK;
else if(n>0)
for(i=0;i<n;i++) {buf[reclen]=buff[i];reclen++;if (i>=256) return reclen;}
}
}
}
}
/*
int modem_retcode(int modemhd, char *buf, int len)
{
int i, ret;
uchar state=Leading_CR;
uchar xdata *p;
uchar xdata str[32];
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;
}
if(ret>0){_Display(0,0,_R232Buf,16);
_Display(0,1,buf,16);
sprintf(str,"ret=%02x ",(uint)ret);_Display(0,2,str,16);}
switch(state)
{
case Leading_CR:
if(*p=='\r') state = Leading_LF;
break;
case Leading_LF:
if(*p=='\n') state = Message;
else if(*p!='\r') state = Leading_CR;
break;
case Message:
if(*p=='\r') {
*p = 0;
state = Trailing_LF;
} else p++;
break;
case Trailing_LF:
if(*p=='\n') {
//get ret code
for(i=0;i<11;i++) {
if(strncmp(buf, RetInfo[i], strlen(RetInfo[i]))==0)
break;
}
return (i+1);
} else return (-3);//retcode invalid
}
}
return (-4);//retcode too long
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -