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

📄 serialcommlayer.h

📁 蓝牙通讯软件
💻 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 + -