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

📄 serial.h

📁 VC网络程序设计实例导航配套代码
💻 H
字号:
// Serial.h

#ifndef _SERIAL__H__
#define _SERIAL__H__


//  CSerial类向主窗口发送的消息
#define WM_COM_RECEIVE	WM_USER	+ 301
#define WM_COM_CTS		WM_USER	+ 302		
#define WM_COM_DSR		WM_USER	+ 303
#define WM_COM_RING		WM_USER	+ 304
#define WM_COM_RLSD		WM_USER	+ 306
#define WM_COM_BREAK	WM_USER	+ 307
#define WM_COM_TXEMPTY	WM_USER	+ 308
#define WM_COM_ERROR	WM_USER	+ 309

#define DEFAULT_COM_MASK_EVENT EV_RXCHAR | EV_ERR  \
				| EV_CTS | EV_DSR | EV_BREAK | EV_TXEMPTY | EV_RING | EV_RLSD

// 串口控制类
class CSerial  
{
public:
// 构造函数和析构函数
	CSerial(BOOL bNeedThread = FALSE);
	virtual ~CSerial();

	// 判断端口是否打开
	BOOL IsOpen() { return m_hCom != INVALID_HANDLE_VALUE; }

	// 使用默认设置打开串口
	BOOL Open(DWORD dwPort, DWORD dwBaudRate = 9600);
	// 关闭端口
	void Close();

	// 设置串口状态
	BOOL SetState(DWORD dwBaudRate, DWORD dwByteSize = 8, 
				DWORD dwPatity = NOPARITY, DWORD dwStopBits = ONESTOPBIT);
	BOOL SetTimeouts(LPCOMMTIMEOUTS lpCO);
	BOOL SetBufferSize(DWORD dwInputSize, DWORD dwOutputSize);
	void SetWnd(HWND hWnd);
	void SetNotifyNum(DWORD dwNum);
	void SetMaskEvent(DWORD dwMask);

	// 读写串口
	DWORD Write(LPVOID Buffer, DWORD dwBufferLen);
	DWORD WriteString(LPTSTR szBuffer);
	DWORD Read(LPVOID Buffer, DWORD dwBufferLen, DWORD dwWaitTime = 20);
	// 读取指定字节的数据
	BOOL  ReadData(LPVOID Buffer, DWORD dwReadLen, DWORD dwWaitTime = 100);
	TCHAR *ReadString(TCHAR *szBuffer, DWORD dwBufferLen, DWORD dwWaitTime = 20);

	BOOL Purge(DWORD dwFlags = PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);

	// 设置电平
	BOOL SetDTR(BOOL OnOrOff);
	BOOL SetRTS(BOOL OnOrOff);
	BOOL SetBreak(BOOL OnOrOff);

protected:		
	BOOL OpenCommPort(DWORD dwPort);

	// 事件处理函数
	virtual void OnCTS();
	virtual void OnDSR();
	virtual void OnRing();
	virtual void OnRLSD();
	virtual void OnBreak();
	virtual void OnError();
	virtual void OnReceive();
	virtual void OnTXEmpty();

	// 线程函数,等待处理串口上发生的事件
	virtual DWORD ThreadProc();	
	static DWORD WINAPI SerialThreadProc(LPVOID lpParam);
protected:
	HANDLE m_hCom;
	OVERLAPPED m_ReadOl;
	OVERLAPPED m_WriteOl;
	OVERLAPPED m_WaitOl;
	BOOL m_bExit;
	HANDLE m_hThread;
	DCB m_dcb;
	DWORD m_dwMaskEvent;
	HWND m_hNotifyWnd;
	DWORD m_dwNotifyNum;
	char m_szComm[16];

	BOOL m_bNeedThread;
};


// 传输协议中的帧头
struct CSerialFrame
{
	BYTE command;		// 命令号
	BYTE reserve1;		// 保留
	USHORT sequence;	// 序列号
	USHORT uChecksum;	// 校验
	USHORT uDataLen;	// 数据长度
};

// 命令号
#define SERIAL_CONNECT		0x01		// 请求连接
#define SERIAL_ACK			0x02		// 确认
#define SERIAL_DATA			0x03		// 数据
#define SERIAL_ERROR		0x04		// 出错  要求重发
#define SERIAL_SIZE			0x05		// 数据大小
#define SERIAL_ABORT		0x06		// 终止
#define SERIAL_EOF			0x07		// 结束
#define SERIAL_TOOBIG		0x08		// 文件太大
#define SERIAL_SYSFAILED	0x09		// 系统出错
#define SERIAL_INIT			0x0a		// 初始化
#define SERIAL_GETSTATUS	0x0b		// 获取当前状态
#define SERIAL_TRANSFAILED  0x0c		// 文件传输失败
#define SERIAL_VERIFYFAILED 0x0d		// 用户验证失败
#define SERIAL_DEVICEFAILED 0x10		// 设备出错


// 帧大小
#define FRAME_SIZE     156

// 状态
#define STATUS_TRANSFERING	0x03		// 正在传输文件
#define STATUS_IDLE			0x04		// 空闲
#define STATUS_CONNECTED	0x05		// 已经连接


// 通讯协议控制类
class CSCSerial
{
public:
	// 构造函数,CSerial应该是一个打开的串口类
	CSCSerial(CSerial *pSerial);

	// 发送命令
	BOOL SendEOF();
	BOOL SendAbort();
	BOOL SendRetry();
	BOOL SendAck();
	BOOL SendInit();	
	BOOL SendCommand(BYTE command);
	// 发送数据
	BOOL SendFileSize(DWORD dwSize);
	BOOL SendFileData(LPVOID Buffer, int nBufferLen);
	BOOL SendData(LPVOID Buffer, int nBufferLen);
	// 读取数据
	CSerialFrame* ReadData();
	CSerialFrame* ReadFrame();


	CSerial *m_pSerial;									// 串口对象						
	char m_DataBuff[FRAME_SIZE + sizeof(CSerialFrame)];	// 内部缓冲区
	USHORT m_sequence;									// 记录当前序列号
	int m_nStatus;										// 记录当前状态
};


#endif // _SERIAL__H__

⌨️ 快捷键说明

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