-
Notifications
You must be signed in to change notification settings - Fork 32
/
Copy pathSerialPort.h
160 lines (138 loc) · 3.66 KB
/
SerialPort.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
//////////////////////////////////////////////////////////////////////////
/// COPYRIGHT NOTICE
/// Copyright (c) 2009, 华中科技大学tickTick Group (版权声明)
/// All rights reserved.
///
/// @file SerialPort.h
/// @brief 串口通信类头文件
///
/// 本文件完成串口通信类的声明
///
/// @version 1.0
/// @author 卢俊
/// @E-mail:[email protected]
/// @date 2010/03/19
///
/// 修订说明:
//////////////////////////////////////////////////////////////////////////
#ifndef SERIALPORT_H_
#define SERIALPORT_H_
#include <Windows.h>
/** 串口通信类
*
* 本类实现了对串口的基本操作
* 例如监听发到指定串口的数据、发送指定数据到串口
*/
class CSerialPort
{
public:
CSerialPort(void);
~CSerialPort(void);
public:
/** 初始化串口函数
*
* @param: UINT portNo 串口编号,默认值为1,即COM1,注意,尽量不要大于9
* @param: UINT baud 波特率,默认为9600
* @param: char parity 是否进行奇偶校验,'Y'表示需要奇偶校验,'N'表示不需要奇偶校验
* @param: UINT databits 数据位的个数,默认值为8个数据位
* @param: UINT stopsbits 停止位使用格式,默认值为1
* @param: DWORD dwCommEvents 默认为EV_RXCHAR,即只要收发任意一个字符,则产生一个事件
* @return: bool 初始化是否成功
* @note: 在使用其他本类提供的函数前,请先调用本函数进行串口的初始化
* \n本函数提供了一些常用的串口参数设置,若需要自行设置详细的DCB参数,可使用重载函数
* \n本串口类析构时会自动关闭串口,无需额外执行关闭串口
* @see:
*/
bool InitPort( UINT portNo = 1,UINT baud = CBR_9600,char parity = 'N',UINT databits = 8,
UINT stopsbits = 1,DWORD dwCommEvents = EV_RXCHAR);
/** 串口初始化函数
*
* 本函数提供直接根据DCB参数设置串口参数
* @param: UINT portNo
* @param: const LPDCB & plDCB
* @return: bool 初始化是否成功
* @note: 本函数提供用户自定义地串口初始化参数
* @see:
*/
bool InitPort( UINT portNo ,const LPDCB& plDCB );
/** 开启监听线程
*
* 本监听线程完成对串口数据的监听,并将接收到的数据打印到屏幕输出
* @return: bool 操作是否成功
* @note: 当线程已经处于开启状态时,返回flase
* @see:
*/
bool OpenListenThread();
/** 关闭监听线程
*
*
* @return: bool 操作是否成功
* @note: 调用本函数后,监听串口的线程将会被关闭
* @see:
*/
bool CloseListenTread();
/** 向串口写数据
*
* 将缓冲区中的数据写入到串口
* @param: unsigned char * pData 指向需要写入串口的数据缓冲区
* @param: unsigned int length 需要写入的数据长度
* @return: bool 操作是否成功
* @note: length不要大于pData所指向缓冲区的大小
* @see:
*/
bool WriteData(unsigned char* pData, unsigned int length);
/** 获取串口缓冲区中的字节数
*
*
* @return: UINT 操作是否成功
* @note: 当串口缓冲区中无数据时,返回0
* @see:
*/
UINT GetBytesInCOM();
/** 读取串口接收缓冲区中一个字节的数据
*
*
* @param: char & cRecved 存放读取数据的字符变量
* @return: bool 读取是否成功
* @note:
* @see:
*/
bool ReadChar(char &cRecved);
private:
/** 打开串口
*
*
* @param: UINT portNo 串口设备号
* @return: bool 打开是否成功
* @note:
* @see:
*/
bool openPort( UINT portNo );
/** 关闭串口
*
*
* @return: void 操作是否成功
* @note:
* @see:
*/
void ClosePort();
/** 串口监听线程
*
* 监听来自串口的数据和信息
* @param: void * pParam 线程参数
* @return: UINT WINAPI 线程返回值
* @note:
* @see:
*/
static UINT WINAPI ListenThread(void* pParam);
private:
/** 串口句柄 */
HANDLE m_hComm;
/** 线程退出标志变量 */
static bool s_bExit;
/** 线程句柄 */
volatile HANDLE m_hListenThread;
/** 同步互斥,临界区保护 */
CRITICAL_SECTION m_csCommunicationSync; //!< 互斥操作串口
};
#endif //SERIALPORT_H_