📄 ysatmodem.h
字号:
// ATModem.h: interface for the CYsATModem class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_ATMODEM_H__1494C7E1_C927_11D5_971D_0050BADA81C3__INCLUDED_)
#define AFX_ATMODEM_H__1494C7E1_C927_11D5_971D_0050BADA81C3__INCLUDED_
#include "YsComm.h"
#include "YsQueue.h"
/****************************************************************
名称: Modem的AT命令操作类
作者: 广州暨南大学97计算机 姚舜
EMAIL: ycatx@ycatx.net
创建时间: 2001
最近修改时间: 2003.8.6
功能: 对Modem的AT命令操作进行全面的封装
等级: ☆☆☆
****************************************************************/
#define CMD_ATE "ATE" //关闭本地modem回显
#define CMD_ATE1 "ATE1"//打开地modem回显
#define CMD_ATD "ATDT"//拨号
#define CMD_AT "AT"//初始化
#define CMD_ATA "ATA"//回答Ring
#define CMD_ATH0 "ATH0"//挂断连接,进入命令状态
#define CMD_ATZ0 "ATZ0"//复位命令
#define CMD_ATS0 "ATS0=0"//手工应答
//#define CMD_+++ "+++"//使modem切换到命令模式
#define WM_CONNECTED WM_USER+2000
//下面三排宏有对应关系,修改要小心
#define ECHO_OK "OK" //0
#define ECHO_CONNECT "CONNECT"//1
#define ECHO_RING "RING"//2
#define ECHO_NOCARRIER "NO CARRIER"//断线//3
#define ECHO_ERROR "ERROR"//4
#define ECHO_CONNECT1200 "CONNECT 1200"//5 无用
#define ECHO_NODIALTONE "NO DIALTONE"//6//五秒内检测不到拨号音
#define ECHO_BUSY "BUSY"//7
#define ECHO_NOANSWER "NO ANSWER"//30
#define CODE_CANNTFIND -1//与AT命令无关
#define CODE_OK 0
#define CODE_CONNECT 1
#define CODE_RING 2
#define CODE_NOCARRIER 3
#define CODE_ERROR 4
#define CODE_CONNECT1200 5
#define CODE_NODIALTONE 6
#define CODE_BUSY 7
#define CODE_NOANSWER 30
#define WM_MODEM_CHANGE WM_USER+1000
//#define ECHO_CONNECT2400 "CONNECT 2400"
#define ECHO_COUNT 9
#define MODE_UNINITIALIZE 1//未初始化状态
#define MODE_UNMODEM 5
#define MODE_COMMAND 10
#define MODE_CONNECTING 25
#define MODE_DATA 30
#define PURGE_ALL PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR
//超过这个长度怎么办???
#define QUEUE_SIZE 1024*2 //缓冲区的长度
#define DIALTIME_START 45000 //等待连接字符串的超时
#define DIALTIME_INTER 3000 //等待连接字符串的超时
#define WAITTIME 800 //SendAT()后等待返回的时间
#define WAITADDADDADDTIME 2000 //发送+++后的等待时间 >1000
#define WAITATHTIME 2000 //发送ath后的等待时间
///////////// YCAT 2001 /////////////////
#define USER_ANSWER//send ata应答和自动应答两种方式问切换
class CYsATModem : public CYsComm
{
BOOL m_bCD;
BOOL m_bInit;
CString m_sLastError;
int m_nMode;
HWND m_hWnd;//用来接收消息
int m_nRingCount;//表示振铃多少次才回应
CWinThread* m_Thread;//收数线程
//用来存放AT的返回字符串
// static CString pstrCmdString[ECHO_COUNT];
CString pstrCmdString[ECHO_COUNT];
private:
void ChangeMode(int newMode);
static UINT WaitThread(LPVOID lpvoid);
/////////处理错误函数////////////////
inline virtual void ResetError(){m_sLastError=_TEXT("Operation success");}
virtual void SetLastError(CString sError){m_sLastError=sError;}
BOOL HangUp2();//用关闭串口的方法来挂断modem
BOOL SendAT(LPCSTR strCmd,BOOL AddReturn=TRUE);//发送AT命令
//是否发送消息
int CheckString(LPCTSTR str,BOOL bSendMessage=TRUE);//检查字符串,所含的AT命令字符串
CYsQueue<BYTE>* m_pQueue;//存放串口数据的缓冲区
///////////线程/////////////
// 把串口读入缓冲区的字符,写到自己维护的缓冲区中,并判断断线
static UINT ReadCommThread(LPVOID pParam);
// 把串口读入缓冲区的字符,写到自己维护的缓冲区中,并判Ring字符
// 只用在等待拨号的时候,拨号结束则结束
//检测modem是否就续
static UINT DetectModemThread(LPVOID pParam);
int DetectConnect();
public:
HANDLE m_hConnected;
BOOL m_bTestMode;//表示用串口通讯,即不通过modem,当这个变量为TRUE时,功能等于CYsComm
CString GetLastError(){return m_sLastError;}
//开始和结束函数
CYsATModem();
virtual ~CYsATModem();
BOOL InitModem(UINT nPort,UINT uBaud,int iRingCount=2,HWND hWnd=NULL);//初始化modem
//////////////AT命令操作////////////////
BOOL DialUp(LPCTSTR strDialNumber);//拨号
BOOL HangUp();//挂断
////////////读写操作//////////////
int Write(LPCSTR lpstrWrite,DWORD dwCount);
int Read(LPTSTR lpstrRead,DWORD dwCount,
DWORD* dwHaveReaded,DWORD nTimeOut);
BOOL Clear(DWORD dwType);
////////////状态//////////////
int GetState();//返回当前状态/
//返回当前状态的描述
CString GetStateDesc();
//返回写缓冲区内有多少个字符
DWORD GetReadBufferCount();
};
#endif // !defined(AFX_ATMODEM_H__1494C7E1_C927_11D5_971D_0050BADA81C3__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -