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

📄 modem.h

📁 Modem 通信的完整例子
💻 H
字号:
#if !defined(ZYFMODEM)
#define ZYFMODEM


#undef STRICT


#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fstream.h>
#include <ctype.h>


//enum {M_COMMAND,M_ONLINE,M_TRANSFILE};

#define WM_BREAK WM_USER+200
#define WM_SHOWMESSAGE WM_USER+201
#define WM_CHARSARRIVE WM_USER+202
#define MODEM_TIMER 16


#define SEND(m) ::SendMessage(hwindow,WM_SHOWMESSAGE,0,(LPARAM)m)
#define CLEAR() ::SendMessage(hwindow,WM_SHOWMESSAGE,0,(LPARAM)" ")


//#define WM_BREAK 10000
#define IN_QUEUE_SIZE 1100
#define OUT_QUEUE_SIZE 1100

//err code
#define USER_BREAK -1
#define NO_DCD -2
#define TIME_OUT  -3




//use in ReceAnsStr
#define LEADING_CR 0
#define LEADING_LF 1
#define IN_MSG 2
#define TRAILING_LF 3
#define EXIT 4
#define CR 0x0d
#define LF 0x0a


#define  MESSAGE_NUM      12
//the id of return message of modem
enum modemanswer  {
M_OK          ,
M_NODCD       ,
M_ERROR       ,
M_NOTONE      ,
M_BUSY        ,
M_NOANSWER    ,
M_RING        ,
M_CONNECT     ,
M_PROTOCOL    ,
M_COMPRESS    ,
M_CARRIER     ,
M_RELIABLE
};
#define  M_UNKNOW         -1

//MODEM Type
#define MULTI 0
#define HAYES 1
#define OTHER 2



//USE FOR TRANSPORTING  FILE
#define PAKBUFSIZE 1024

//USE FOR EXCEPT
#define E_USRCAN 0
#define E_NODCD  1
enum except {
//SEND EXPECT
E_FILEMTY=2,
E_NOACK,
E_RCVCAN,
E_BADPAK,
E_EOF,
E_SNDOK,
E_DSKREAD,
E_LASTACK,

//RECEIVE EXPECT
E_NOSOH,
E_BADCKV,
E_SNDCAN,
E_NODATA,
E_BADSOH,
E_PAKNUM,
E_SNDACK,
E_PAKSEQ,
E_DSKWRITE,
E_RCVOK
};
#define CONTINUE 1
#define BREAK 0
#define MAXCOUNT 20
#define ACKRETRY 30
#define MAXNOSOH 200


//USE FOR MODEM PROTOCOL
#define XSOH 1
#define YSOH 2
#define SUM 0
#define CRC 1

#define CAN 0X18
#define NAK 0X15
#define EOT 4
#define ACK 6


//------------------------------------------------------------------------
class MTIMER{
  DWORD settime;
public:
  void set(DWORD);
  BOOL ifzero();
  void delay(DWORD);
};

//----------------------------------------------------------------------
class MODEM{
public:
struct ANSINFO{
  char * message;
  BOOL terminal;
  int id;
};
struct CONFIGBUFF{
  char *base;
  char *protocol;
};
  MODEM();
  ~MODEM();
  virtual void IdleAction();
  int Dial(char *);
  int Answer();
  int ConfigModem(char *);
  void HangUp();
  void Stop();
  int SendAFile(fstream &f);
  int ReceAFile(fstream &f);
  BOOL DetectDcd();
  BOOL DetectCts();
  BOOL DetectRx();
  BOOL DetectTx();
  void ChangeBaud(char *);
  BOOL operator!() {return err;}
  
  int IniCom(HINSTANCE,HWND,char *);
   
  void Readn(BYTE*,int,DWORD=1000,DWORD=1000,BOOL=FALSE);
  void Writen(BYTE*,int);
  void ReadAChar(BYTE &,DWORD=1000,BOOL=FALSE);
  void WriteAChar(BYTE );
  void OnTimer();
  

  HWND hwindow;
  int nCid;
  BOOL IfTransFile;
  BOOL IfCom;
  BOOL IfModem;
  BOOL IfCommand;
  BOOL IfRx;
  BOOL IfTx;
  

protected:
 // HINSTANCE hInstance;
  int err;
  int nbyte;

  DCB dcb;
  COMSTAT comstat;
  MSG msg;

struct PACKET{
  BYTE soh;
  BYTE pnum1;
  BYTE pnum2;
  UINT ckval;
  UINT pointr;
  UINT pointw;
  int  bottom;
  BYTE * data;
  DWORD paknum;
  UINT paklong;
  DWORD total;
  PACKET(){
	 data=new BYTE[PAKBUFSIZE];
	 pointr=0;
     bottom=0;
	 pointw=0;
	 paknum=1;
	 total=0;
	 paklong=128;
	 pnum1=(BYTE)(paknum&0x00ff);
	 pnum2=(BYTE)(~pnum1);
  }
  ~PACKET(){delete data;}
};

  PACKET * packet;
  MTIMER timer;
  ANSINFO * ansinfo;
  CONFIGBUFF *configbuff;
  int id;
  UINT dtebaud;
  BOOL protocollink;
  char cmdbuff[40];
  char ansbuff[80];
  char dispbuf[40];

//  static void FAR PASCAL __export ModemTimerProc(HWND,UINT,WORD,LPARAM);
  void SendCmd(char*);
  void ReceAnsStr(char *,DWORD);
  void ReceAns(DWORD);
  void Command(char *, DWORD=4000);
  int  ReadPacket(BYTE soh,fstream &f);
  int  WritePacket(int flag,fstream &f);
  void ClearReceBuf(DWORD=1000);
  void SendCkSum();
  BOOL ReceCkSum();
  int  Except(int exceptnum, int &count,int maxcount);
};




#endif

⌨️ 快捷键说明

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