Rev 270 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed
| Rev 270 | Rev 800 | ||
|---|---|---|---|
| 1 | // Serial.h - Definition of the CSerial class |
1 | // Serial.h - Definition of the CSerial class |
| 2 | // |
2 | // |
| 3 | // Copyright (C) 1999-2003 Ramon de Klein (Ramon.de.Klein@ict.nl) |
3 | // Copyright (C) 1999-2003 Ramon de Klein (Ramon.de.Klein@ict.nl) |
| 4 | // |
4 | // |
| 5 | // This library is free software; you can redistribute it and/or |
5 | // This library is free software; you can redistribute it and/or |
| 6 | // modify it under the terms of the GNU Lesser General Public |
6 | // modify it under the terms of the GNU Lesser General Public |
| 7 | // License as published by the Free Software Foundation; either |
7 | // License as published by the Free Software Foundation; either |
| 8 | // version 2.1 of the License, or (at your option) any later version. |
8 | // version 2.1 of the License, or (at your option) any later version. |
| 9 | // |
9 | // |
| 10 | // This library is distributed in the hope that it will be useful, |
10 | // This library is distributed in the hope that it will be useful, |
| 11 | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
12 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 13 | // Lesser General Public License for more details. |
13 | // Lesser General Public License for more details. |
| 14 | // |
14 | // |
| 15 | // You should have received a copy of the GNU Lesser General Public |
15 | // You should have received a copy of the GNU Lesser General Public |
| 16 | // License along with this library; if not, write to the Free Software |
16 | // License along with this library; if not, write to the Free Software |
| 17 | // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
17 | // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 18 | 18 | ||
| 19 | 19 | ||
| 20 | #ifndef __SERIAL_H |
20 | #ifndef __SERIAL_H |
| 21 | #define __SERIAL_H |
21 | #define __SERIAL_H |
| 22 | 22 | ||
| 23 | 23 | ||
| 24 | ////////////////////////////////////////////////////////////////////// |
24 | ////////////////////////////////////////////////////////////////////// |
| 25 | // The SERIAL_DEFAULT_OVERLAPPED defines if the default open mode uses |
25 | // The SERIAL_DEFAULT_OVERLAPPED defines if the default open mode uses |
| 26 | // overlapped I/O. When overlapped I/O is available (normal Win32 |
26 | // overlapped I/O. When overlapped I/O is available (normal Win32 |
| 27 | // platforms) it uses overlapped I/O. Windows CE doesn't allow the use |
27 | // platforms) it uses overlapped I/O. Windows CE doesn't allow the use |
| 28 | // of overlapped I/O, so it is disabled there by default. |
28 | // of overlapped I/O, so it is disabled there by default. |
| 29 | 29 | ||
| 30 | #ifndef SERIAL_DEFAULT_OVERLAPPED |
30 | #ifndef SERIAL_DEFAULT_OVERLAPPED |
| 31 | #ifndef SERIAL_NO_OVERLAPPED |
31 | #ifndef SERIAL_NO_OVERLAPPED |
| 32 | #define SERIAL_DEFAULT_OVERLAPPED true |
32 | #define SERIAL_DEFAULT_OVERLAPPED true |
| 33 | #else |
33 | #else |
| 34 | #define SERIAL_DEFAULT_OVERLAPPED false |
34 | #define SERIAL_DEFAULT_OVERLAPPED false |
| 35 | #endif |
35 | #endif |
| 36 | #endif |
36 | #endif |
| 37 | 37 | ||
| 38 | 38 | ||
| 39 | ////////////////////////////////////////////////////////////////////// |
39 | ////////////////////////////////////////////////////////////////////// |
| 40 | // |
40 | // |
| 41 | // CSerial - Win32 wrapper for serial communications |
41 | // CSerial - Win32 wrapper for serial communications |
| 42 | // |
42 | // |
| 43 | // Serial communication often causes a lot of problems. This class |
43 | // Serial communication often causes a lot of problems. This class |
| 44 | // tries to supply an easy to use interface to deal with serial |
44 | // tries to supply an easy to use interface to deal with serial |
| 45 | // devices. |
45 | // devices. |
| 46 | // |
46 | // |
| 47 | // The class is actually pretty ease to use. You only need to open |
47 | // The class is actually pretty ease to use. You only need to open |
| 48 | // the COM-port, where you need to specify the basic serial |
48 | // the COM-port, where you need to specify the basic serial |
| 49 | // communication parameters. You can also choose to setup handshaking |
49 | // communication parameters. You can also choose to setup handshaking |
| 50 | // and read timeout behaviour. |
50 | // and read timeout behaviour. |
| 51 | // |
51 | // |
| 52 | // The following serial classes are available: |
52 | // The following serial classes are available: |
| 53 | // |
53 | // |
| 54 | // CSerial - Serial communication support. |
54 | // CSerial - Serial communication support. |
| 55 | // CSerialEx - Serial communication with listener thread for events |
55 | // CSerialEx - Serial communication with listener thread for events |
| 56 | // CSerialSync - Serial communication with synchronized event handler |
56 | // CSerialSync - Serial communication with synchronized event handler |
| 57 | // CSerialWnd - Asynchronous serial support, which uses the Win32 |
57 | // CSerialWnd - Asynchronous serial support, which uses the Win32 |
| 58 | // message queue for event notification. |
58 | // message queue for event notification. |
| 59 | // CSerialMFC - Preferred class to use in MFC-based GUI windows. |
59 | // CSerialMFC - Preferred class to use in MFC-based GUI windows. |
| 60 | // |
60 | // |
| 61 | // |
61 | // |
| 62 | // Pros: |
62 | // Pros: |
| 63 | // ----- |
63 | // ----- |
| 64 | // - Easy to use (hides a lot of nasty Win32 stuff) |
64 | // - Easy to use (hides a lot of nasty Win32 stuff) |
| 65 | // - Fully ANSI and Unicode aware |
65 | // - Fully ANSI and Unicode aware |
| 66 | // |
66 | // |
| 67 | // Cons: |
67 | // Cons: |
| 68 | // ----- |
68 | // ----- |
| 69 | // - Little less flexibility then native Win32 API, however you can |
69 | // - Little less flexibility then native Win32 API, however you can |
| 70 | // use this API at the same time for features which are missing |
70 | // use this API at the same time for features which are missing |
| 71 | // from this class. |
71 | // from this class. |
| 72 | // - Incompatible with Windows 95 or Windows NT v3.51 (or earlier), |
72 | // - Incompatible with Windows 95 or Windows NT v3.51 (or earlier), |
| 73 | // because CancelIo isn't support on these platforms. Define the |
73 | // because CancelIo isn't support on these platforms. Define the |
| 74 | // SERIAL_NO_CANCELIO macro for support of these platforms as |
74 | // SERIAL_NO_CANCELIO macro for support of these platforms as |
| 75 | // well. When this macro is defined, then only time-out values of |
75 | // well. When this macro is defined, then only time-out values of |
| 76 | // 0 or INFINITE are valid. |
76 | // 0 or INFINITE are valid. |
| 77 | // |
77 | // |
| 78 | // |
78 | // |
| 79 | // Copyright (C) 1999-2003 Ramon de Klein |
79 | // Copyright (C) 1999-2003 Ramon de Klein |
| 80 | // (Ramon.de.Klein@ict.nl) |
80 | // (Ramon.de.Klein@ict.nl) |
| 81 | 81 | ||
| 82 | class CSerial |
82 | class CSerial |
| 83 | { |
83 | { |
| 84 | // Class enumerations |
84 | // Class enumerations |
| 85 | public: |
85 | public: |
| 86 | // Communication event |
86 | // Communication event |
| 87 | typedef enum |
87 | typedef enum |
| 88 | { |
88 | { |
| 89 | EEventUnknown = -1, // Unknown event |
89 | EEventUnknown = -1, // Unknown event |
| 90 | EEventNone = 0, // Event trigged without cause |
90 | EEventNone = 0, // Event trigged without cause |
| 91 | EEventBreak = EV_BREAK, // A break was detected on input |
91 | EEventBreak = EV_BREAK, // A break was detected on input |
| 92 | EEventCTS = EV_CTS, // The CTS signal changed state |
92 | EEventCTS = EV_CTS, // The CTS signal changed state |
| 93 | EEventDSR = EV_DSR, // The DSR signal changed state |
93 | EEventDSR = EV_DSR, // The DSR signal changed state |
| 94 | EEventError = EV_ERR, // A line-status error occurred |
94 | EEventError = EV_ERR, // A line-status error occurred |
| 95 | EEventRing = EV_RING, // A ring indicator was detected |
95 | EEventRing = EV_RING, // A ring indicator was detected |
| 96 | EEventRLSD = EV_RLSD, // The RLSD signal changed state |
96 | EEventRLSD = EV_RLSD, // The RLSD signal changed state |
| 97 | EEventRecv = EV_RXCHAR, // Data is received on input |
97 | EEventRecv = EV_RXCHAR, // Data is received on input |
| 98 | EEventRcvEv = EV_RXFLAG, // Event character was received on input |
98 | EEventRcvEv = EV_RXFLAG, // Event character was received on input |
| 99 | EEventSend = EV_TXEMPTY, // Last character on output was sent |
99 | EEventSend = EV_TXEMPTY, // Last character on output was sent |
| 100 | EEventPrinterError = EV_PERR, // Printer error occured |
100 | EEventPrinterError = EV_PERR, // Printer error occured |
| 101 | EEventRx80Full = EV_RX80FULL, // Receive buffer is 80 percent full |
101 | EEventRx80Full = EV_RX80FULL, // Receive buffer is 80 percent full |
| 102 | EEventProviderEvt1 = EV_EVENT1, // Provider specific event 1 |
102 | EEventProviderEvt1 = EV_EVENT1, // Provider specific event 1 |
| 103 | EEventProviderEvt2 = EV_EVENT2, // Provider specific event 2 |
103 | EEventProviderEvt2 = EV_EVENT2, // Provider specific event 2 |
| 104 | } |
104 | } |
| 105 | EEvent; |
105 | EEvent; |
| 106 | 106 | ||
| 107 | // Baudrate |
107 | // Baudrate |
| 108 | typedef enum |
108 | typedef enum |
| 109 | { |
109 | { |
| 110 | EBaudUnknown = -1, // Unknown |
110 | EBaudUnknown = -1, // Unknown |
| 111 | EBaud110 = CBR_110, // 110 bits/sec |
111 | EBaud110 = CBR_110, // 110 bits/sec |
| 112 | EBaud300 = CBR_300, // 300 bits/sec |
112 | EBaud300 = CBR_300, // 300 bits/sec |
| 113 | EBaud600 = CBR_600, // 600 bits/sec |
113 | EBaud600 = CBR_600, // 600 bits/sec |
| 114 | EBaud1200 = CBR_1200, // 1200 bits/sec |
114 | EBaud1200 = CBR_1200, // 1200 bits/sec |
| 115 | EBaud2400 = CBR_2400, // 2400 bits/sec |
115 | EBaud2400 = CBR_2400, // 2400 bits/sec |
| 116 | EBaud4800 = CBR_4800, // 4800 bits/sec |
116 | EBaud4800 = CBR_4800, // 4800 bits/sec |
| 117 | EBaud9600 = CBR_9600, // 9600 bits/sec |
117 | EBaud9600 = CBR_9600, // 9600 bits/sec |
| 118 | EBaud14400 = CBR_14400, // 14400 bits/sec |
118 | EBaud14400 = CBR_14400, // 14400 bits/sec |
| 119 | EBaud19200 = CBR_19200, // 19200 bits/sec (default) |
119 | EBaud19200 = CBR_19200, // 19200 bits/sec (default) |
| 120 | EBaud38400 = CBR_38400, // 38400 bits/sec |
120 | EBaud38400 = CBR_38400, // 38400 bits/sec |
| 121 | EBaud56000 = CBR_56000, // 56000 bits/sec |
121 | EBaud56000 = CBR_56000, // 56000 bits/sec |
| 122 | EBaud57600 = CBR_57600, // 57600 bits/sec |
122 | EBaud57600 = CBR_57600, // 57600 bits/sec |
| 123 | EBaud115200 = CBR_115200, // 115200 bits/sec |
123 | EBaud115200 = CBR_115200, // 115200 bits/sec |
| 124 | EBaud128000 = CBR_128000, // 128000 bits/sec |
124 | EBaud128000 = CBR_128000, // 128000 bits/sec |
| 125 | EBaud256000 = CBR_256000, // 256000 bits/sec |
125 | EBaud256000 = CBR_256000, // 256000 bits/sec |
| 126 | } |
126 | } |
| 127 | EBaudrate; |
127 | EBaudrate; |
| 128 | 128 | ||
| 129 | // Data bits (5-8) |
129 | // Data bits (5-8) |
| 130 | typedef enum |
130 | typedef enum |
| 131 | { |
131 | { |
| 132 | EDataUnknown = -1, // Unknown |
132 | EDataUnknown = -1, // Unknown |
| 133 | EData5 = 5, // 5 bits per byte |
133 | EData5 = 5, // 5 bits per byte |
| 134 | EData6 = 6, // 6 bits per byte |
134 | EData6 = 6, // 6 bits per byte |
| 135 | EData7 = 7, // 7 bits per byte |
135 | EData7 = 7, // 7 bits per byte |
| 136 | EData8 = 8 // 8 bits per byte (default) |
136 | EData8 = 8 // 8 bits per byte (default) |
| 137 | } |
137 | } |
| 138 | EDataBits; |
138 | EDataBits; |
| 139 | 139 | ||
| 140 | // Parity scheme |
140 | // Parity scheme |
| 141 | typedef enum |
141 | typedef enum |
| 142 | { |
142 | { |
| 143 | EParUnknown = -1, // Unknown |
143 | EParUnknown = -1, // Unknown |
| 144 | EParNone = NOPARITY, // No parity (default) |
144 | EParNone = NOPARITY, // No parity (default) |
| 145 | EParOdd = ODDPARITY, // Odd parity |
145 | EParOdd = ODDPARITY, // Odd parity |
| 146 | EParEven = EVENPARITY, // Even parity |
146 | EParEven = EVENPARITY, // Even parity |
| 147 | EParMark = MARKPARITY, // Mark parity |
147 | EParMark = MARKPARITY, // Mark parity |
| 148 | EParSpace = SPACEPARITY // Space parity |
148 | EParSpace = SPACEPARITY // Space parity |
| 149 | } |
149 | } |
| 150 | EParity; |
150 | EParity; |
| 151 | 151 | ||
| 152 | // Stop bits |
152 | // Stop bits |
| 153 | typedef enum |
153 | typedef enum |
| 154 | { |
154 | { |
| 155 | EStopUnknown = -1, // Unknown |
155 | EStopUnknown = -1, // Unknown |
| 156 | EStop1 = ONESTOPBIT, // 1 stopbit (default) |
156 | EStop1 = ONESTOPBIT, // 1 stopbit (default) |
| 157 | EStop1_5 = ONE5STOPBITS,// 1.5 stopbit |
157 | EStop1_5 = ONE5STOPBITS,// 1.5 stopbit |
| 158 | EStop2 = TWOSTOPBITS // 2 stopbits |
158 | EStop2 = TWOSTOPBITS // 2 stopbits |
| 159 | } |
159 | } |
| 160 | EStopBits; |
160 | EStopBits; |
| 161 | 161 | ||
| 162 | // Handshaking |
162 | // Handshaking |
| 163 | typedef enum |
163 | typedef enum |
| 164 | { |
164 | { |
| 165 | EHandshakeUnknown = -1, // Unknown |
165 | EHandshakeUnknown = -1, // Unknown |
| 166 | EHandshakeOff = 0, // No handshaking |
166 | EHandshakeOff = 0, // No handshaking |
| 167 | EHandshakeHardware = 1, // Hardware handshaking (RTS/CTS) |
167 | EHandshakeHardware = 1, // Hardware handshaking (RTS/CTS) |
| 168 | EHandshakeSoftware = 2 // Software handshaking (XON/XOFF) |
168 | EHandshakeSoftware = 2 // Software handshaking (XON/XOFF) |
| 169 | } |
169 | } |
| 170 | EHandshake; |
170 | EHandshake; |
| 171 | 171 | ||
| 172 | // Timeout settings |
172 | // Timeout settings |
| 173 | typedef enum |
173 | typedef enum |
| 174 | { |
174 | { |
| 175 | EReadTimeoutUnknown = -1, // Unknown |
175 | EReadTimeoutUnknown = -1, // Unknown |
| 176 | EReadTimeoutNonblocking = 0, // Always return immediately |
176 | EReadTimeoutNonblocking = 0, // Always return immediately |
| 177 | EReadTimeoutBlocking = 1 // Block until everything is retrieved |
177 | EReadTimeoutBlocking = 1 // Block until everything is retrieved |
| 178 | } |
178 | } |
| 179 | EReadTimeout; |
179 | EReadTimeout; |
| 180 | 180 | ||
| 181 | // Communication errors |
181 | // Communication errors |
| 182 | typedef enum |
182 | typedef enum |
| 183 | { |
183 | { |
| 184 | EErrorUnknown = 0, // Unknown |
184 | EErrorUnknown = 0, // Unknown |
| 185 | EErrorBreak = CE_BREAK, // Break condition detected |
185 | EErrorBreak = CE_BREAK, // Break condition detected |
| 186 | EErrorFrame = CE_FRAME, // Framing error |
186 | EErrorFrame = CE_FRAME, // Framing error |
| 187 | EErrorIOE = CE_IOE, // I/O device error |
187 | EErrorIOE = CE_IOE, // I/O device error |
| 188 | EErrorMode = CE_MODE, // Unsupported mode |
188 | EErrorMode = CE_MODE, // Unsupported mode |
| 189 | EErrorOverrun = CE_OVERRUN, // Character buffer overrun, next byte is lost |
189 | EErrorOverrun = CE_OVERRUN, // Character buffer overrun, next byte is lost |
| 190 | EErrorRxOver = CE_RXOVER, // Input buffer overflow, byte lost |
190 | EErrorRxOver = CE_RXOVER, // Input buffer overflow, byte lost |
| 191 | EErrorParity = CE_RXPARITY,// Input parity error |
191 | EErrorParity = CE_RXPARITY,// Input parity error |
| 192 | EErrorTxFull = CE_TXFULL // Output buffer full |
192 | EErrorTxFull = CE_TXFULL // Output buffer full |
| 193 | } |
193 | } |
| 194 | EError; |
194 | EError; |
| 195 | 195 | ||
| 196 | // Port availability |
196 | // Port availability |
| 197 | typedef enum |
197 | typedef enum |
| 198 | { |
198 | { |
| 199 | EPortUnknownError = -1, // Unknown error occurred |
199 | EPortUnknownError = -1, // Unknown error occurred |
| 200 | EPortAvailable = 0, // Port is available |
200 | EPortAvailable = 0, // Port is available |
| 201 | EPortNotAvailable = 1, // Port is not present |
201 | EPortNotAvailable = 1, // Port is not present |
| 202 | EPortInUse = 2 // Port is in use |
202 | EPortInUse = 2 // Port is in use |
| 203 | 203 | ||
| 204 | } |
204 | } |
| 205 | EPort; |
205 | EPort; |
| 206 | 206 | ||
| 207 | // Construction |
207 | // Construction |
| 208 | public: |
208 | public: |
| 209 | CSerial(); |
209 | CSerial(); |
| 210 | virtual ~CSerial(); |
210 | virtual ~CSerial(); |
| 211 | 211 | ||
| 212 | // Operations |
212 | // Operations |
| 213 | public: |
213 | public: |
| 214 | // Check if particular COM-port is available (static method). |
214 | // Check if particular COM-port is available (static method). |
| 215 | static EPort CheckPort (LPCTSTR lpszDevice); |
215 | static EPort CheckPort (LPCTSTR lpszDevice); |
| 216 | 216 | ||
| 217 | // Open the serial communications for a particular COM port. You |
217 | // Open the serial communications for a particular COM port. You |
| 218 | // need to use the full devicename (i.e. "COM1") to open the port. |
218 | // need to use the full devicename (i.e. "COM1") to open the port. |
| 219 | // It's possible to specify the size of the input/output queues. |
219 | // It's possible to specify the size of the input/output queues. |
| 220 | virtual LONG Open (LPCTSTR lpszDevice, DWORD dwInQueue = 0, DWORD dwOutQueue = 0, bool fOverlapped = SERIAL_DEFAULT_OVERLAPPED); |
220 | virtual LONG Open (LPCTSTR lpszDevice, DWORD dwInQueue = 0, DWORD dwOutQueue = 0, bool fOverlapped = SERIAL_DEFAULT_OVERLAPPED); |
| 221 | 221 | ||
| 222 | // Close the serial port. |
222 | // Close the serial port. |
| 223 | virtual LONG Close (void); |
223 | virtual LONG Close (void); |
| 224 | 224 | ||
| 225 | // Setup the communication settings such as baudrate, databits, |
225 | // Setup the communication settings such as baudrate, databits, |
| 226 | // parity and stopbits. The default settings are applied when the |
226 | // parity and stopbits. The default settings are applied when the |
| 227 | // device has been opened. Call this function if these settings do |
227 | // device has been opened. Call this function if these settings do |
| 228 | // not apply for your application. If you prefer to use integers |
228 | // not apply for your application. If you prefer to use integers |
| 229 | // instead of the enumerated types then just cast the integer to |
229 | // instead of the enumerated types then just cast the integer to |
| 230 | // the required type. So the following two initializations are |
230 | // the required type. So the following two initializations are |
| 231 | // equivalent: |
231 | // equivalent: |
| 232 | // |
232 | // |
| 233 | // Setup(EBaud9600,EData8,EParNone,EStop1) |
233 | // Setup(EBaud9600,EData8,EParNone,EStop1) |
| 234 | // |
234 | // |
| 235 | // or |
235 | // or |
| 236 | // |
236 | // |
| 237 | // Setup(EBaudrate(9600),EDataBits(8),EParity(NOPARITY),EStopBits(ONESTOPBIT)) |
237 | // Setup(EBaudrate(9600),EDataBits(8),EParity(NOPARITY),EStopBits(ONESTOPBIT)) |
| 238 | // |
238 | // |
| 239 | // In the latter case, the types are not validated. So make sure |
239 | // In the latter case, the types are not validated. So make sure |
| 240 | // that you specify the appropriate values. |
240 | // that you specify the appropriate values. |
| 241 | virtual LONG Setup (EBaudrate eBaudrate = EBaud9600, |
241 | virtual LONG Setup (EBaudrate eBaudrate = EBaud9600, |
| 242 | EDataBits eDataBits = EData8, |
242 | EDataBits eDataBits = EData8, |
| 243 | EParity eParity = EParNone, |
243 | EParity eParity = EParNone, |
| 244 | EStopBits eStopBits = EStop1); |
244 | EStopBits eStopBits = EStop1); |
| 245 | 245 | ||
| 246 | // Set/clear the event character. When this byte is being received |
246 | // Set/clear the event character. When this byte is being received |
| 247 | // on the serial port then the EEventRcvEv event is signalled, |
247 | // on the serial port then the EEventRcvEv event is signalled, |
| 248 | // when the mask has been set appropriately. If the fAdjustMask flag |
248 | // when the mask has been set appropriately. If the fAdjustMask flag |
| 249 | // has been set, then the event mask is automatically adjusted. |
249 | // has been set, then the event mask is automatically adjusted. |
| 250 | virtual LONG SetEventChar (BYTE bEventChar, bool fAdjustMask = true); |
250 | virtual LONG SetEventChar (BYTE bEventChar, bool fAdjustMask = true); |
| 251 | 251 | ||
| 252 | // Set the event mask, which indicates what events should be |
252 | // Set the event mask, which indicates what events should be |
| 253 | // monitored. The WaitEvent method can only monitor events that |
253 | // monitored. The WaitEvent method can only monitor events that |
| 254 | // have been enabled. The default setting only monitors the |
254 | // have been enabled. The default setting only monitors the |
| 255 | // error events and data events. An application may choose to |
255 | // error events and data events. An application may choose to |
| 256 | // monitor CTS. DSR, RLSD, etc as well. |
256 | // monitor CTS. DSR, RLSD, etc as well. |
| 257 | virtual LONG SetMask (DWORD dwMask = EEventBreak|EEventError|EEventRecv); |
257 | virtual LONG SetMask (DWORD dwMask = EEventBreak|EEventError|EEventRecv); |
| 258 | 258 | ||
| 259 | // The WaitEvent method waits for one of the events that are |
259 | // The WaitEvent method waits for one of the events that are |
| 260 | // enabled (see SetMask). |
260 | // enabled (see SetMask). |
| 261 | virtual LONG WaitEvent (LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE); |
261 | virtual LONG WaitEvent (LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE); |
| 262 | 262 | ||
| 263 | // Setup the handshaking protocol. There are three forms of |
263 | // Setup the handshaking protocol. There are three forms of |
| 264 | // handshaking: |
264 | // handshaking: |
| 265 | // |
265 | // |
| 266 | // 1) No handshaking, so data is always send even if the receiver |
266 | // 1) No handshaking, so data is always send even if the receiver |
| 267 | // cannot handle the data anymore. This can lead to data loss, |
267 | // cannot handle the data anymore. This can lead to data loss, |
| 268 | // when the sender is able to transmit data faster then the |
268 | // when the sender is able to transmit data faster then the |
| 269 | // receiver can handle. |
269 | // receiver can handle. |
| 270 | // 2) Hardware handshaking, where the RTS/CTS lines are used to |
270 | // 2) Hardware handshaking, where the RTS/CTS lines are used to |
| 271 | // indicate if data can be sent. This mode requires that both |
271 | // indicate if data can be sent. This mode requires that both |
| 272 | // ports and the cable support hardware handshaking. Hardware |
272 | // ports and the cable support hardware handshaking. Hardware |
| 273 | // handshaking is the most reliable and efficient form of |
273 | // handshaking is the most reliable and efficient form of |
| 274 | // handshaking available, but is hardware dependant. |
274 | // handshaking available, but is hardware dependant. |
| 275 | // 3) Software handshaking, where the XON/XOFF characters are used |
275 | // 3) Software handshaking, where the XON/XOFF characters are used |
| 276 | // to throttle the data. A major drawback of this method is that |
276 | // to throttle the data. A major drawback of this method is that |
| 277 | // these characters cannot be used for data anymore. |
277 | // these characters cannot be used for data anymore. |
| 278 | virtual LONG SetupHandshaking (EHandshake eHandshake); |
278 | virtual LONG SetupHandshaking (EHandshake eHandshake); |
| 279 | 279 | ||
| 280 | // Read operations can be blocking or non-blocking. You can use |
280 | // Read operations can be blocking or non-blocking. You can use |
| 281 | // this method to setup wether to use blocking or non-blocking |
281 | // this method to setup wether to use blocking or non-blocking |
| 282 | // reads. Non-blocking reads is the default, which is required |
282 | // reads. Non-blocking reads is the default, which is required |
| 283 | // for most applications. |
283 | // for most applications. |
| 284 | // |
284 | // |
| 285 | // 1) Blocking reads, which will cause the 'Read' method to block |
285 | // 1) Blocking reads, which will cause the 'Read' method to block |
| 286 | // until the requested number of bytes have been read. This is |
286 | // until the requested number of bytes have been read. This is |
| 287 | // useful if you know how many data you will receive. |
287 | // useful if you know how many data you will receive. |
| 288 | // 2) Non-blocking reads, which will read as many bytes into your |
288 | // 2) Non-blocking reads, which will read as many bytes into your |
| 289 | // buffer and returns almost immediately. This is often the |
289 | // buffer and returns almost immediately. This is often the |
| 290 | // preferred setting. |
290 | // preferred setting. |
| 291 | virtual LONG SetupReadTimeouts (EReadTimeout eReadTimeout); |
291 | virtual LONG SetupReadTimeouts (EReadTimeout eReadTimeout); |
| 292 | 292 | ||
| 293 | // Obtain communication settings |
293 | // Obtain communication settings |
| 294 | virtual EBaudrate GetBaudrate (void); |
294 | virtual EBaudrate GetBaudrate (void); |
| 295 | virtual EDataBits GetDataBits (void); |
295 | virtual EDataBits GetDataBits (void); |
| 296 | virtual EParity GetParity (void); |
296 | virtual EParity GetParity (void); |
| 297 | virtual EStopBits GetStopBits (void); |
297 | virtual EStopBits GetStopBits (void); |
| 298 | virtual EHandshake GetHandshaking (void); |
298 | virtual EHandshake GetHandshaking (void); |
| 299 | virtual DWORD GetEventMask (void); |
299 | virtual DWORD GetEventMask (void); |
| 300 | virtual BYTE GetEventChar (void); |
300 | virtual BYTE GetEventChar (void); |
| 301 | 301 | ||
| 302 | // Write data to the serial port. Note that we are only able to |
302 | // Write data to the serial port. Note that we are only able to |
| 303 | // send ANSI strings, because it probably doesn't make sense to |
303 | // send ANSI strings, because it probably doesn't make sense to |
| 304 | // transmit Unicode strings to an application. |
304 | // transmit Unicode strings to an application. |
| 305 | virtual LONG Write (const void* pData, size_t iLen, DWORD* pdwWritten = 0, LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE); |
305 | virtual LONG Write (const void* pData, size_t iLen, DWORD* pdwWritten = 0, LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE); |
| 306 | virtual LONG Write (LPCSTR pString, DWORD* pdwWritten = 0, LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE); |
306 | virtual LONG Write (LPCSTR pString, DWORD* pdwWritten = 0, LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE); |
| 307 | 307 | ||
| 308 | // Read data from the serial port. Refer to the description of |
308 | // Read data from the serial port. Refer to the description of |
| 309 | // the 'SetupReadTimeouts' for an explanation about (non) blocking |
309 | // the 'SetupReadTimeouts' for an explanation about (non) blocking |
| 310 | // reads and how to use this. |
310 | // reads and how to use this. |
| 311 | virtual LONG Read (void* pData, size_t iLen, DWORD* pdwRead = 0, LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE); |
311 | virtual LONG Read (void* pData, size_t iLen, DWORD* pdwRead = 0, LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE); |
| 312 | 312 | ||
| 313 | // Send a break |
313 | // Send a break |
| 314 | LONG Break (void); |
314 | LONG Break (void); |
| 315 | 315 | ||
| 316 | // Determine what caused the event to trigger |
316 | // Determine what caused the event to trigger |
| 317 | EEvent GetEventType (void); |
317 | EEvent GetEventType (void); |
| 318 | 318 | ||
| 319 | // Obtain the error |
319 | // Obtain the error |
| 320 | EError GetError (void); |
320 | EError GetError (void); |
| 321 | 321 | ||
| 322 | // Obtain the COMM and event handle |
322 | // Obtain the COMM and event handle |
| 323 | HANDLE GetCommHandle (void) { return m_hFile; } |
323 | HANDLE GetCommHandle (void) { return m_hFile; } |
| 324 | 324 | ||
| 325 | // Check if com-port is opened |
325 | // Check if com-port is opened |
| 326 | bool IsOpen (void) const { return (m_hFile != 0); } |
326 | bool IsOpen (void) const { return (m_hFile != 0); } |
| 327 | 327 | ||
| 328 | // Obtain last error status |
328 | // Obtain last error status |
| 329 | LONG GetLastError (void) const { return m_lLastError; } |
329 | LONG GetLastError (void) const { return m_lLastError; } |
| 330 | 330 | ||
| 331 | // Obtain CTS/DSR/RING/RLSD settings |
331 | // Obtain CTS/DSR/RING/RLSD settings |
| 332 | bool GetCTS (void); |
332 | bool GetCTS (void); |
| 333 | bool GetDSR (void); |
333 | bool GetDSR (void); |
| 334 | bool GetRing (void); |
334 | bool GetRing (void); |
| 335 | bool GetRLSD (void); |
335 | bool GetRLSD (void); |
| 336 | 336 | ||
| 337 | // Purge all buffers |
337 | // Purge all buffers |
| 338 | LONG Purge (void); |
338 | LONG Purge (void); |
| 339 | 339 | ||
| 340 | protected: |
340 | protected: |
| 341 | // Internal helper class which wraps DCB structure |
341 | // Internal helper class which wraps DCB structure |
| 342 | class CDCB : public DCB |
342 | class CDCB : public DCB |
| 343 | { |
343 | { |
| 344 | public: |
344 | public: |
| 345 | CDCB() { DCBlength = sizeof(DCB); } |
345 | CDCB() { DCBlength = sizeof(DCB); } |
| 346 | }; |
346 | }; |
| 347 | 347 | ||
| 348 | // Attributes |
348 | // Attributes |
| 349 | protected: |
349 | protected: |
| 350 | LONG m_lLastError; // Last serial error |
350 | LONG m_lLastError; // Last serial error |
| 351 | HANDLE m_hFile; // File handle |
351 | HANDLE m_hFile; // File handle |
| 352 | EEvent m_eEvent; // Event type |
352 | EEvent m_eEvent; // Event type |
| 353 | DWORD m_dwEventMask; // Event mask |
353 | DWORD m_dwEventMask; // Event mask |
| 354 | 354 | ||
| 355 | #ifndef SERIAL_NO_OVERLAPPED |
355 | #ifndef SERIAL_NO_OVERLAPPED |
| 356 | HANDLE m_hevtOverlapped; // Event handle for internal overlapped operations |
356 | HANDLE m_hevtOverlapped; // Event handle for internal overlapped operations |
| 357 | #endif |
357 | #endif |
| 358 | 358 | ||
| 359 | protected: |
359 | protected: |
| 360 | // Check the requirements |
360 | // Check the requirements |
| 361 | void CheckRequirements (LPOVERLAPPED lpOverlapped, DWORD dwTimeout) const; |
361 | void CheckRequirements (LPOVERLAPPED lpOverlapped, DWORD dwTimeout) const; |
| 362 | 362 | ||
| 363 | // CancelIo wrapper (for Win95 compatibility) |
363 | // CancelIo wrapper (for Win95 compatibility) |
| 364 | BOOL CancelCommIo (void); |
364 | BOOL CancelCommIo (void); |
| 365 | }; |
365 | }; |
| 366 | 366 | ||
| 367 | #endif // __SERIAL_H |
367 | #endif // __SERIAL_H |
| 368 | 368 | ||