38 namespace rp{
namespace arch{
namespace net{
41 :
rp::hal::serial_rxtx()
42 , _serial_handle(NULL)
49 raw_serial::~raw_serial()
53 CloseHandle(_ro.hEvent);
54 CloseHandle(_wo.hEvent);
55 CloseHandle(_wait_o.hEvent);
58 bool raw_serial::open()
60 return open(_portName, _baudrate, _flags);
63 bool raw_serial::bind(
const char * portname,
_u32 baudrate,
_u32 flags)
65 strncpy(_portName, portname,
sizeof(_portName));
71 bool raw_serial::open(
const char * portname,
_u32 baudrate,
_u32 flags)
74 wchar_t wportname[1024];
75 mbstowcs(wportname, portname,
sizeof(wportname) /
sizeof(
wchar_t));
78 if (isOpened()) close();
80 _serial_handle = CreateFile(
86 GENERIC_READ | GENERIC_WRITE,
90 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
94 if (_serial_handle == INVALID_HANDLE_VALUE)
return false;
96 if (!SetupComm(_serial_handle, SERIAL_RX_BUFFER_SIZE, SERIAL_TX_BUFFER_SIZE))
102 _dcb.BaudRate = baudrate;
104 _dcb.Parity = NOPARITY;
105 _dcb.StopBits = ONESTOPBIT;
106 _dcb.fDtrControl = DTR_CONTROL_ENABLE;
108 if (!SetCommState(_serial_handle, &_dcb))
114 if (!SetCommTimeouts(_serial_handle, &_co))
120 if (!SetCommMask(_serial_handle, EV_RXCHAR | EV_ERR ))
126 if (!PurgeComm(_serial_handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ))
133 _is_serial_opened =
true;
141 void raw_serial::close()
143 SetCommMask(_serial_handle, 0);
144 ResetEvent(_wait_o.hEvent);
146 CloseHandle(_serial_handle);
147 _serial_handle = INVALID_HANDLE_VALUE;
149 _is_serial_opened =
false;
152 int raw_serial::senddata(
const unsigned char *
data,
size_t size)
155 DWORD w_len = 0, o_len = -1;
156 if (!isOpened())
return ANS_DEV_ERR;
158 if (
data == NULL ||
size ==0)
return 0;
160 if(ClearCommError(_serial_handle, &error, NULL) && error > 0)
161 PurgeComm(_serial_handle, PURGE_TXABORT | PURGE_TXCLEAR);
163 if(!WriteFile(_serial_handle,
data, (DWORD)
size, &w_len, &_wo))
164 if(GetLastError() != ERROR_IO_PENDING)
170 int raw_serial::recvdata(
unsigned char *
data,
size_t size)
172 if (!isOpened())
return 0;
176 if(!ReadFile(_serial_handle,
data, (DWORD)
size, &r_len, &_ro))
178 if(GetLastError() == ERROR_IO_PENDING)
180 if(!GetOverlappedResult(_serial_handle, &_ro, &r_len, FALSE))
182 if(GetLastError() != ERROR_IO_INCOMPLETE)
193 void raw_serial::flush(
_u32 flags)
195 PurgeComm(_serial_handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );
198 int raw_serial::waitforsent(
_u32 timeout,
size_t * returned_size)
200 if (!isOpened() )
return ANS_DEV_ERR;
204 if (WaitForSingleObject(_wo.hEvent, timeout) == WAIT_TIMEOUT)
209 if(!GetOverlappedResult(_serial_handle, &_wo, &w_len, FALSE))
214 if (returned_size) *returned_size = w_len;
218 int raw_serial::waitforrecv(
_u32 timeout,
size_t * returned_size)
220 if (!isOpened() )
return -1;
224 if (WaitForSingleObject(_ro.hEvent, timeout) == WAIT_TIMEOUT)
228 if(!GetOverlappedResult(_serial_handle, &_ro, &r_len, FALSE))
232 if (returned_size) *returned_size = r_len;
236 int raw_serial::waitfordata(
size_t data_count,
_u32 timeout,
size_t * returned_size)
243 if (returned_size==NULL) returned_size=(
size_t *)&dummy_length;
247 size_t rxqueue_remaining = rxqueue_count();
248 if (rxqueue_remaining >= data_count) {
249 *returned_size = rxqueue_remaining;
257 SetCommMask(_serial_handle, EV_RXCHAR | EV_ERR );
258 if(!WaitCommEvent(_serial_handle, &msk, &_wait_o))
260 if(GetLastError() == ERROR_IO_PENDING)
262 if (WaitForSingleObject(_wait_o.hEvent, timeout) == WAIT_TIMEOUT)
268 GetOverlappedResult(_serial_handle, &_wait_o, &length, TRUE);
270 ::ResetEvent(_wait_o.hEvent);
273 ClearCommError(_serial_handle, &error, &stat);
274 *returned_size = stat.cbInQue;
281 ClearCommError(_serial_handle, &error, &stat);
285 ClearCommError(_serial_handle, &error, &stat);
286 if(stat.cbInQue >= data_count)
288 *returned_size = stat.cbInQue;
297 size_t raw_serial::rxqueue_count()
299 if ( !isOpened() )
return 0;
304 if(ClearCommError(_serial_handle, &error, &com_stat) && error > 0)
306 PurgeComm(_serial_handle, PURGE_RXABORT | PURGE_RXCLEAR);
309 return com_stat.cbInQue;
312 void raw_serial::setDTR()
314 if ( !isOpened() )
return;
316 EscapeCommFunction(_serial_handle, SETDTR);
319 void raw_serial::clearDTR()
321 if ( !isOpened() )
return;
323 EscapeCommFunction(_serial_handle, CLRDTR);
327 void raw_serial::_init()
329 memset(&_dcb, 0,
sizeof(_dcb));
330 _dcb.DCBlength =
sizeof(_dcb);
331 _serial_handle = INVALID_HANDLE_VALUE;
332 memset(&_co, 0,
sizeof(_co));
333 _co.ReadIntervalTimeout = 0;
334 _co.ReadTotalTimeoutMultiplier = 0;
335 _co.ReadTotalTimeoutConstant = 0;
336 _co.WriteTotalTimeoutMultiplier = 0;
337 _co.WriteTotalTimeoutConstant = 0;
339 memset(&_ro, 0,
sizeof(_ro));
340 memset(&_wo, 0,
sizeof(_wo));
341 memset(&_wait_o, 0,
sizeof(_wait_o));
343 _ro.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
344 _wo.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
345 _wait_o.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
354 namespace rp{
namespace hal{