15 port_t * serial_open(const char *name, int speed)
18 HANDLE port = CreateFileA(name, GENERIC_READ | GENERIC_WRITE,
19 0, NULL, OPEN_EXISTING, 0, NULL);
21 if (port == INVALID_HANDLE_VALUE) return NULL;
24 memset(&settings, 0, sizeof(settings));
25 settings.DCBlength = sizeof(settings);
28 snprintf(seta, sizeof(seta), "baud=%d data=8 parity=N stop=1 dtr=off rts=off", speed);
29 if (!BuildCommDCBA(seta, &settings)) {
30 loge("Invalid serial port settings");
35 if (!SetCommState(port, &settings)) {
36 loge("Unable to configure serial port");
42 tout.ReadIntervalTimeout = MAXDWORD;
43 tout.ReadTotalTimeoutMultiplier = MAXDWORD;
44 tout.ReadTotalTimeoutConstant = 30000;
45 tout.WriteTotalTimeoutMultiplier = 0;
46 tout.WriteTotalTimeoutConstant = 0;
48 if (!SetCommTimeouts(port, &tout)) {
49 loge("Unable to set serial timeouts");
54 pt = malloc(sizeof(port_t));
61 void serial_close(port_t * pt)
63 if (pt == NULL) return;
64 if (pt->handle == INVALID_HANDLE_VALUE) return;
66 CloseHandle(pt->handle);
67 pt->handle = INVALID_HANDLE_VALUE;
72 int serial_read(port_t * pt, unsigned char * buff, size_t len)
74 if (pt == NULL || pt->handle == INVALID_HANDLE_VALUE) return -1;
76 unsigned char * p = buff;
79 /* read will block if no chars, will return whats there otherwise,
80 * and will timeout after 30 seconds */
82 if (!ReadFile(pt->handle, p, len-done, (LPDWORD)&count, NULL))
91 int serial_write(port_t * pt, unsigned char * buff, size_t len)
93 if (pt == NULL || pt->handle == INVALID_HANDLE_VALUE) return -1;
97 if (WriteFile(pt->handle, buff, len, (LPDWORD)&n, NULL))
103 int serial_break(port_t * pt, int set)
105 if (pt == NULL || pt->handle == INVALID_HANDLE_VALUE) return -1;
108 SetCommBreak(pt->handle);
110 ClearCommBreak(pt->handle);