📄 busmodem.c
字号:
// 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 + -