📄 serial.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 + -