123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- #pragma once
- #pragma warning(disable : 4530)
- #pragma warning(disable : 4786)
- #pragma warning(disable : 4800)
- #pragma warning(disable: 4996)
- #include <assert.h>
- #include <stdio.h>
- #include <windows.h>
- //送到窗口的消息 WPARAM 端口号
- #define ON_COM_RECEIVE WM_USER + 618
- #define ON_COM_CTS WM_USER + 619 //LPARAM 1 valid
- #define ON_COM_DSR WM_USER + 621 //LPARAM 1 valid
- #define ON_COM_RING WM_USER + 623
- #define ON_COM_RLSD WM_USER + 624
- #define ON_COM_BREAK WM_USER + 625
- #define ON_COM_TXEMPTY WM_USER + 626
- #define ON_COM_ERROR WM_USER + 627 //LPARAM save Error ID
- #define DEFAULT_COM_MASK_EVENT EV_RXCHAR | EV_ERR | EV_CTS | EV_DSR | EV_BREAK | EV_TXEMPTY | EV_RING | EV_RLSD
- class CBaseSerial
- {
- public:
- // 参数为IO方式 阻塞方式(0)/ 异步重叠方式(默认)
- CBaseSerial(DWORD dwIOMode = FILE_FLAG_OVERLAPPED) : _dwIOMode(dwIOMode)
- {
- Init();
- }
-
- virtual ~CBaseSerial()
- {
- Close();
- UnInit();
- }
-
- public:
- // 判断串口是否打开
- inline bool IsOpen() { return _hCommHandle != INVALID_HANDLE_VALUE; }
- // 判断串口是否打开
- operator bool() { return _hCommHandle != INVALID_HANDLE_VALUE; }
- // 获得串口句炳
- inline HANDLE GetHandle() { return _hCommHandle; }
- // 获得串口句炳
- operator HANDLE() { return _hCommHandle; }
-
- // 获得串口参数 DCB
- DCB *GetState();
- // 设置串口参数 DCB
- bool SetState(DCB *pdcb = NULL);
- // 设置串口参数:波特率,停止位,等 支持设置字符串 "9600, 8, n, 1"
- bool SetState(TCHAR *lpszSetStr = _T("baud=115200 parity=N data=8 stop=1"));
- // 设置串口参数:波特率,停止位,等
- bool SetState(DWORD dwBaudRate, DWORD dwByteSize = 8, DWORD dwParity = NOPARITY, DWORD dwStopBits = ONESTOPBIT);
-
- // 获得超时结构
- LPCOMMTIMEOUTS GetTimeouts(void);
- // 设置超时
- bool SetTimeouts(
- DWORD ReadIntervalTimeout = 5,
- DWORD ReadTotalTimeoutMultiplier = 10,
- DWORD ReadTotalTimeoutConstant = 1500,
- DWORD WriteTotalTimeoutMultiplier = 10,
- DWORD WriteTotalTimeoutConstant = 1500);
- bool SetTimeouts(LPCOMMTIMEOUTS lpCO);
- // 设置串口的I/O缓冲区大小
- bool SetBufferSize(DWORD dwInputSize, DWORD dwOutputSize);
- // 关联消息的窗口句柄
- inline void SetWnd(HWND hWnd)
- {
- assert(::IsWindow(hWnd));
- _hNotifyWnd = hWnd;
- }
-
- // 设定发送通知, 接受字符最小值
- inline void SetNotifyNum(DWORD dwNum) { _dwNotifyNum = dwNum; }
-
- // 设置要监视的事件, 打开前设置有效
- void SetMaskEvent(DWORD dwEvent = DEFAULT_COM_MASK_EVENT);
- // 获得读缓冲区的字符数
- int GetInputSize();
-
- // 打开串口 缺省 9600, 8, n, 1
- bool Open(DWORD dwPort);
- // 打开串口 缺省 baud_rate, 8, n, 1
- bool Open(DWORD dwPort, DWORD dwBaudRate);
- // 打开串口, 使用类似"9600, 8, n, 1"的设置字符串设置串口
- bool Open(DWORD dwPort, TCHAR *lpszSetStr = _T("baud=115200 parity=N data=8 stop=1") );
-
- // 读取串口 dwBufferLength个字符到 Buffer 返回实际读到的字符数 可读任意数据
- DWORD Read(LPVOID Buffer, DWORD dwBufferLength, DWORD dwWaitTime = 100);
- // 读取串口 dwBufferLength - 1 个字符到 szBuffer 返回ANSI C 模式字符串指针 适合一般字符通讯
- char *ReadString(char *szBuffer, DWORD dwBufferLength, DWORD dwWaitTime = 20);
- // 写串口 可写任意数据 "abcd" or "\x0\x1\x2"
- DWORD Write(LPVOID Buffer, DWORD dwBufferLength);
- // 写串口 写ANSI C 模式字符串指针
- DWORD Write(const TCHAR *szBuffer);
- // 读串口 同步应用
- DWORD ReadSync(LPVOID Buffer, DWORD dwBufferLength);
- // 写串口 同步应用
- DWORD WriteSync(LPVOID Buffer, DWORD dwBufferLength);
- // 写串口 szBuffer 可以输出格式字符串 包含缓冲区长度
- DWORD Write(TCHAR *szBuffer, DWORD dwBufferLength, TCHAR *szFormat, ...);
- // 写串口 szBuffer 可以输出格式字符串 不检查缓冲区长度 小心溢出
- DWORD Write(TCHAR *szBuffer, TCHAR *szFormat, ...);
- // 关闭串口 同时也关闭关联线程
- virtual void Close();
- // DTR 电平控制
- bool SetDTR(bool OnOrOff);
- // RTS 电平控制
- bool SetRTS(bool OnOrOff);
- // 设置信号状态为中断;
- bool SetBreak(bool OnOrOff);
- // 清除缓存;
- void ClearCommBuffer() {
- ClearCommError(_hCommHandle, NULL, NULL);
- ::PurgeComm(_hCommHandle, PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);
- }
- protected:
- volatile DWORD _dwPort; // 串口号
- volatile HANDLE _hCommHandle; // 串口句柄
- TCHAR _szCommStr[20]; // 保存COM1类似的字符串
- DCB _DCB; // 波特率,停止位,等
- COMMTIMEOUTS _CO; // 超时结构
- DWORD _dwIOMode; // 0 同步 默认 FILE_FLAG_OVERLAPPED重叠I/O异步
- OVERLAPPED _ReadOverlapped, _WriteOverlapped; // 重叠I/O
- volatile HWND _hNotifyWnd; // 通知窗口
- volatile DWORD _dwNotifyNum; // 接受多少字节(>=_dwNotifyNum)发送通知消息
- volatile DWORD _dwMaskEvent; // 监视的事件
- OVERLAPPED _WaitOverlapped; // WaitCommEvent use
- // 初始化
- void Init();
- // 析构
- void UnInit();
- // 绑定串口
- void BindCommPort(DWORD dwPort);
- // 打开串口
- virtual bool OpenCommPort();
- // 设置串口
- virtual bool SetupPort();
- private:
- CBaseSerial(const CBaseSerial &);
- CBaseSerial &operator=(const CBaseSerial &);
- };
|