38 namespace rp{
namespace arch{
namespace net{
41 :
rp::hal::serial_rxtx()
42 , _serial_handle(NULL)
53 CloseHandle(
_ro.hEvent);
54 CloseHandle(
_wo.hEvent);
77 GENERIC_READ | GENERIC_WRITE,
81 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
93 _dcb.BaudRate = baudrate;
95 _dcb.Parity = NOPARITY;
96 _dcb.StopBits = ONESTOPBIT;
97 _dcb.fDtrControl = DTR_CONTROL_ENABLE;
117 if (!PurgeComm(
_serial_handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ))
146 DWORD w_len = 0, o_len = -1;
149 if (data == NULL || size ==0)
return 0;
155 if(GetLastError() != ERROR_IO_PENDING)
169 if(GetLastError() == ERROR_IO_PENDING)
173 if(GetLastError() != ERROR_IO_INCOMPLETE)
186 PurgeComm(
_serial_handle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );
195 if (WaitForSingleObject(
_wo.hEvent, timeout) == WAIT_TIMEOUT)
205 if (returned_size) *returned_size = w_len;
215 if (WaitForSingleObject(
_ro.hEvent, timeout) == WAIT_TIMEOUT)
223 if (returned_size) *returned_size = r_len;
234 if (returned_size==NULL) returned_size=(
size_t *)&dummy_length;
239 if (rxqueue_remaining >= data_count) {
240 *returned_size = rxqueue_remaining;
251 if(GetLastError() == ERROR_IO_PENDING)
253 if (WaitForSingleObject(
_wait_o.hEvent, timeout) == WAIT_TIMEOUT)
265 *returned_size = stat.cbInQue;
277 if(stat.cbInQue >= data_count)
279 *returned_size = stat.cbInQue;
295 if(ClearCommError(
_serial_handle, &error, &com_stat) && error > 0)
300 return com_stat.cbInQue;
323 memset(&
_co, 0,
sizeof(
_co));
324 _co.ReadIntervalTimeout = 0;
325 _co.ReadTotalTimeoutMultiplier = 0;
326 _co.ReadTotalTimeoutConstant = 0;
327 _co.WriteTotalTimeoutMultiplier = 0;
328 _co.WriteTotalTimeoutConstant = 0;
330 memset(&
_ro, 0,
sizeof(
_ro));
331 memset(&
_wo, 0,
sizeof(
_wo));
334 _ro.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
335 _wo.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
336 _wait_o.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
345 namespace rp{
namespace hal{
virtual void flush(_u32 flags)
virtual int waitfordata(size_t data_count, _u32 timeout=-1, size_t *returned_size=NULL)
virtual int waitforsent(_u32 timeout=-1, size_t *returned_size=NULL)
virtual size_t rxqueue_count()
volatile bool _is_serial_opened
virtual bool bind(const char *portname, uint32_t baudrate, uint32_t flags=0)
virtual int senddata(const unsigned char *data, size_t size)
virtual int recvdata(unsigned char *data, size_t size)
typedef _word_size_t(THREAD_PROC *thread_proc_t)(void *)
volatile HANDLE _serial_handle
virtual int waitforrecv(_u32 timeout=-1, size_t *returned_size=NULL)