-
Notifications
You must be signed in to change notification settings - Fork 0
/
mySerialPort.cpp
124 lines (116 loc) · 2.52 KB
/
mySerialPort.cpp
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
#include "mySerialPort.h"
namespace ctb
{
/** \brief 查看读缓冲区还有多少可读数据
*
* \param
* \param
* \return 串口读缓冲区的字节数
*
*/
DWORD mySerialPort::GetCacheByteNum()
{
ClearCommError(fd,&dwErrorFlags,&ComStat);
return ComStat.cbInQue;
}
void mySerialPort::ClearRecBuff()
{
PurgeComm(fd,PURGE_RXCLEAR);//清空接收缓冲区
}
void mySerialPort::Set_RXCHAR()
{
DWORD Event;
GetCommMask(fd,&Event);
Event|=EV_RXCHAR;
SetCommMask(fd,Event);//设定串口接收事件
}
void mySerialPort::Clean_RXCHAR()
{
DWORD Event;
GetCommMask(fd,&Event);
Event&=~EV_RXCHAR;
SetCommMask(fd,Event);
}
bool mySerialPort::RXCHAR_Init(void)
{
DWORD dwEvtMask;
// PurgeComm(fd,PURGE_RXCLEAR);//清空接收缓冲区
Set_RXCHAR();
if(!WaitCommEvent(fd,&dwEvtMask,&m_ov))//等待事件没有立即发生
{
switch(GetLastError())
{
case ERROR_IO_PENDING: break;
default : return false;
}
}
return true;
}
/** \brief 设定串口监视-接收特定事件字符
设定所用字符
*
* \param eos 要设置的事件字符,当读缓冲区收到此字符会触发事件监视
* \param
* \return
*
*/
void mySerialPort::Set_RXFLAG(const char eos)
{
DCB dcb;
GetCommState(fd,&dcb);
dcb.EvtChar=eos;
SetCommState(fd,&dcb);
DWORD Event;
GetCommMask(fd,&Event);
Event|=EV_RXFLAG;
SetCommMask(fd,Event);//设定串口接收事件
}
/** \brief 取消串口监视事件-接收特定事件字符
* 并没有清除事件字符
* \param
* \param
* \return
*
*/
void mySerialPort::Clean_RXFLAG()
{
DWORD Event;
GetCommMask(fd,&Event);
Event&=~EV_RXFLAG;
SetCommMask(fd,Event);
}
/** \brief 开始监视串口事件-特定字符
*
* \param sof帧头
* \param
* \return //有错误返回false,否则返回true
*
*/
bool mySerialPort::RXFLAG_Init(const char sof)
{
DWORD dwEvtMask;
PurgeComm(fd,PURGE_RXCLEAR);//清空接收缓冲区
Set_RXFLAG(sof);
if(!WaitCommEvent(fd,&dwEvtMask,&m_ov))//等待事件没有立即发生
{
switch(GetLastError())
{
case ERROR_IO_PENDING: break;
default : return false;
}
}
return true;
}
/** \brief 等待事件发生,线程用
*
* \param
* \param
* \return
*/
bool mySerialPort::WaitForEventOccur()//防阻塞。。。
{
ResetEvent(m_ov.hEvent);
if(WaitForSingleObject(m_ov.hEvent,100)==WAIT_OBJECT_0) return true;
else return false;
}
}