📄 serialcommlayer.h
字号:
#if !defined(AFX_SERIALCOMMLAYER_H__D0FCB705_304D_11D3_87BE_0080C88C95DA__INCLUDED_)
#define AFX_SERIALCOMMLAYER_H__D0FCB705_304D_11D3_87BE_0080C88C95DA__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#define SUCCESS 0
// SerialCommLayer.h : header file
//
#include "CommConst.h"
#include "lzh.h"
#define PWM_GOTCOMMDATA WM_USER + 1
#define PWM_RECEIVEERROR WM_USER + 2
#define PWM_REQUESTHANGUP WM_USER + 3
#define PWM_MODEMSTATECHANGE WM_USER + 4
#define PWM_SENDDATAEMPTY WM_USER + 5
// This is the message posted to the WriteThread
// When we have something to write.
#define PWM_COMMWRITE WM_USER+1
// Default size of the Input Buffer used by this code.
#define INPUTBUFFERSIZE 2048
//
// Modem Event Constant
//
#define ME_CTS 1
#define ME_DSR 2
#define ME_RING 4
#define ME_RLSD 8
/////////////////////////////////////////////////////////////////////////////
// CCommReadThread thread
class CCommReadThread : public CWinThread
{
DECLARE_DYNCREATE(CCommReadThread)
protected:
// Attributes
public:
HANDLE hCommFile; //通讯文件
HANDLE hCloseEvent; //线程关闭事件
HWND hComm32Window; //消息通知窗口
// Operations
public:
BOOL SetupCommEvent(LPOVERLAPPED lpOverlappedCommEvent,LPDWORD lpfdwEvtMask);
BOOL SetupReadEvent(LPOVERLAPPED lpOverlappedRead,LPSTR lpszInputBuffer,
DWORD dwSizeOfBuffer,LPDWORD lpnNumberOfBytesRead);
BOOL HandleCommEvent(LPOVERLAPPED lpOverlappedCommEvent,
LPDWORD lpfdwEvtMask,BOOL fRetrieveEvent);
BOOL HandleReadEvent(LPOVERLAPPED lpOverlappedRead,LPSTR lpszInputBuffer,
DWORD dwSizeOfBuffer,LPDWORD lpnNumberOfBytesRead);
BOOL HandleReadData(LPCSTR lpszInputBuffer,DWORD dwSizeOfBuffer);
BOOL ReceiveData(LPSTR lpNewString,DWORD dwSizeOfNewString);
BOOL ReceiveError(DWORD EvtMask);
BOOL ModemStateChange(DWORD ModemEvent);
void PostHangupCall(void);
CCommReadThread(); // protected constructor used by dynamic creation
virtual ~CCommReadThread();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CCommReadThread)
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
virtual int Run();
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CCommReadThread)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CCommWriteThread thread
class CCommWriteThread : public CWinThread
{
DECLARE_DYNCREATE(CCommWriteThread)
protected:
// Attributes
public:
HANDLE hCommFile;
HANDLE hCloseEvent;
HWND hComm32Window;
BOOL SendDataEmpty;
// Operations
public:
BOOL HandleWriteData(LPOVERLAPPED lpOverlappedWrite,LPSTR pDataToWrite,
DWORD dwNumberOfBytesToWrite);
void PostHangupCall(void);
CCommWriteThread(); // protected constructor used by dynamic creation
virtual ~CCommWriteThread();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CCommWriteThread)
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
virtual int Run();
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CCommWriteThread)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CRCCComm window
class CRCCComm : public CWnd
{
private:
CCommReadThread *ReadThread; //读串口线程
CCommWriteThread *WriteThread; //写串口线程
HANDLE hCommFile; //串口句柄
HANDLE hCloseEvent; //串口线程关闭事件
HWND AppWindow; //应用程序窗口句柄,可以假设为自已
BOOL SendDataEmpty; //如果为真表示发送缓冲区为空
int CommNo; //串行口号
int RCCMode; //通讯模式,有RS232方式和MODEM方式,目前先用MODEM方式
protected:
DWORD BaudRate; //通讯波特率
int RCCStatus; //RCC当前状态
char SendBuffer[16*1024]; //发送数据缓冲区
int SendBufferLength; //发送数据缓冲区长度
int BytesPerBlock; //每块多少字节
char ReceiveBuffer[16*1024]; //接收数据缓冲区
int ReceiveBufferLength; //接收数据缓冲区长度
int ReceiveCurPos; //接收缓冲区当前的偏移
char DataBuffer[16*1024]; //去掉帧头的缓冲区(即面向应用程序的缓冲区)
int DataBufferLength; //面向应用程序缓冲区长度
char DataCurPos; //当前接收到的偏移
int PrevReceFrameNo; //上一次接收数据的帧号,接收包号(从1-255)
int PrevSendFrameNo; //上一次发送数据的帧号,发送包号(从1-255)
int LastError; //最后错误号
FrameAnalysisBuffer FameBuffer; //帧分析缓冲区,用于接收时进行帧分析
RCCDataFrame DataFrame; //最后一次发送的数据帧
RCCMsgFrame MsgFrame; //最后一次发送的消息帧
int LastFrameClass; //最后一次发送的帧类别(用于重发处理)
int frmErrorNums; //错误帧数
char MDMProtocol[20]; //MODEM通讯协议
char MDMCompress[20]; //MODEM压缩算法
int MDMCarrier; //MODEM载波速度
int MDMConnect; //MODEM的最终连接速度
int MDMResult; //MODEM的命令返回结果
char ZippedBuf[MaxBytesPerBlock*3/2];
public:
BOOL StartComm(void); //启动COMM口
BOOL StopComm(void); //关闭COMM口
BOOL SetCommState(LPDCB lpDCB); //设置串口状态
BOOL GetCommState(LPDCB lpDCB); //得到串口的当前设置状态
// Construction
public:
CRCCComm();
CRCCComm(int PortNo);
// Attributes
public:
// Operations
public:
int Send(char *Buffer,int BufLen); //发送数据,返回-1表示发送失败,其它则表示发送字节数
int Receive(char *Buffer,int BufLen); //接收数据,返回-1 表示接收失败,其它则表示接收的字节数。
int Connect(char *PhoneNo); //链接服务器,在MODEM方式下,PhoneNo为电话号码,最长40Bytes;返回-1表示失败,其它表示正常。在RS232方式下,PhoneNo为NULL;
int Close(void); //关闭链接
int Listen(void); //服务器侦听,在MODEM方式下,将MODEM置成自动侦听状态ATS0=1
int WriteCommand(char *CmdStr,BOOL Direct = FALSE); //向MODEM写入命令字符串,对于RS232无效
void SetBaudRate(DWORD Rate);
void SetPortNo(int PortNo);
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CRCCComm)
protected:
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CRCCComm();
// Generated message map functions
protected:
DWORD WriteTime;
void Timer(void);
int WaitForCommandResult(DWORD TimeOut);
int ParseAnswer(LPSTR AnswerString,DWORD dwLength);
virtual void OnStringState(DWORD State);
virtual void OnBinaryState(DWORD State);
virtual void OnError(void);
virtual void OnClose(void);
virtual void OnReceive(void);
virtual void OnSend(void);
virtual void OnConnect(void);
virtual int OnRawReceive(LPSTR lpNewString,DWORD dwSizeOfNewString);
virtual int GetFrame(void); //在帧缓冲区内进行帧分析,根据返回的错误进行相应的处理
private:
void Init(void); //初始化
int SearchHead(void);
BOOL CheckSum(RCCFrameHead Header);
BYTE GetCheckSum(RCCFrameHead *Header);
//将SendBuffer之中的数据生成一个帧,准备发送出去,这将是在被告知EV_EMPTY时发生。
//0成功,其它返回失败
int GenOneFrame(void);
#define RESEND 1
//将生成的数据帧(DataFrame)通过串口写线程发送出去。
int SendDataFrame(void);
int SendMsgFrame(BYTE frmType,int NewFrameOrReSend=0); //将生成的消息帧通过串口写线程发送出去。
int DelDealtData(char *Buffer,int &Length,int DelNum); //删除缓冲区中已经处理过的数据
void CloseReadThread(void); //关闭读线程
void CloseWriteThread(void); //关闭写线程
int PostRCCMessage(int Msg,int Notify);
int SendRCCMessage(int Msg,int Notify);
//{{AFX_MSG(CRCCComm)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_SERIALCOMMLAYER_H__D0FCB705_304D_11D3_87BE_0080C88C95DA__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -