30 } serial_port_windows;
33 uart_open (
const char *pcPortName)
36 serial_port_windows *sp = malloc (
sizeof (serial_port_windows));
39 sprintf (acPortName,
"\\\\.\\%s", pcPortName);
43 sp->hPort = CreateFileA (acPortName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
44 if (sp->hPort == INVALID_HANDLE_VALUE) {
46 return INVALID_SERIAL_PORT;
49 memset (&sp->dcb, 0, sizeof (DCB));
50 sp->dcb.DCBlength =
sizeof (DCB);
51 if (!BuildCommDCBA (
"baud=9600 data=8 parity=N stop=1", &sp->dcb)) {
53 return INVALID_SERIAL_PORT;
56 if (!SetCommState (sp->hPort, &sp->dcb)) {
58 return INVALID_SERIAL_PORT;
61 sp->ct.ReadIntervalTimeout = 30;
62 sp->ct.ReadTotalTimeoutMultiplier = 0;
63 sp->ct.ReadTotalTimeoutConstant = 30;
64 sp->ct.WriteTotalTimeoutMultiplier = 30;
65 sp->ct.WriteTotalTimeoutConstant = 0;
67 if (!SetCommTimeouts (sp->hPort, &sp->ct)) {
69 return INVALID_SERIAL_PORT;
72 PurgeComm (sp->hPort, PURGE_RXABORT | PURGE_RXCLEAR);
78 uart_close (
const serial_port sp)
80 if (((serial_port_windows *) sp)->hPort != INVALID_HANDLE_VALUE) {
81 CloseHandle (((serial_port_windows *) sp)->hPort);
88 uart_set_speed (serial_port sp,
const uint32_t uiPortSpeed)
90 serial_port_windows *spw;
92 DBG (
"Serial port speed requested to be set to %d bauds.", uiPortSpeed);
94 switch (uiPortSpeed) {
104 ERR(
"Unable to set serial port speed to %d bauds. Speed value must be one of these constants: 9600 (default), 19200, 38400, 57600, 115200, 230400 or 460800.", uiPortSpeed);
107 spw = (serial_port_windows *) sp;
112 spw->ct.ReadIntervalTimeout = 2;
113 spw->ct.ReadTotalTimeoutMultiplier = 0;
114 spw->ct.ReadTotalTimeoutConstant = iTimeout;
115 spw->ct.WriteTotalTimeoutMultiplier = iTimeout;
116 spw->ct.WriteTotalTimeoutConstant = 0;
118 if (!SetCommTimeouts (spw->hPort, &spw->ct)) {
119 ERR (
"Unable to apply new timeout settings.");
124 spw->dcb.BaudRate = uiPortSpeed;
125 if (!SetCommState (spw->hPort, &spw->dcb)) {
126 ERR (
"Unable to apply new speed settings.");
129 PurgeComm (spw->hPort, PURGE_RXABORT | PURGE_RXCLEAR);
133 uart_get_speed (
const serial_port sp)
135 const serial_port_windows *spw = (serial_port_windows *) sp;
136 if (!GetCommState (spw->hPort, (serial_port) & spw->dcb))
137 return spw->dcb.BaudRate;
143 uart_receive (serial_port sp, byte_t * pbtRx,
size_t * pszRx)
145 if (!ReadFile (((serial_port_windows *) sp)->hPort, pbtRx, (DWORD)(*pszRx), (LPDWORD) pszRx, NULL)) {
154 uart_send (serial_port sp,
const byte_t * pbtTx,
const size_t szTx)
157 if (!WriteFile (((serial_port_windows *) sp)->hPort, pbtTx, szTx, &dwTxLen, NULL)) {