-
Notifications
You must be signed in to change notification settings - Fork 2
/
usbserial_win32.c
111 lines (95 loc) · 3.26 KB
/
usbserial_win32.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/* usbserial_win32.c - Arduino communications on a USB to serial converter.
*
* Copyright (C) 2015 Borislav Sapundzhiev <bsapundjiev_AT_gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include "usbserial_win32.h"
#include "usbserial.h"
static void win32_serial_port_close(struct serial_opt *serial);
static int win32_serial_port_open(struct serial_opt *serial);
static int win32_serial_port_read(int fd, char *read_buffer, size_t max_chars_to_read);
static int win32_serial_port_write(int fd, const char *write_buffer);
static int win32_serial_port_bytes_available(struct serial_opt *serial);
usbserial_ops win32_opts = {
win32_serial_port_close,
win32_serial_port_open,
win32_serial_port_read,
win32_serial_port_write,
win32_serial_port_bytes_available,
};
usbserial_ops * serial_initialize(struct serial_opt * options)
{
return &win32_opts;
}
static void win32_serial_port_close(struct serial_opt *serial)
{
_close( serial->handler );
}
static int win32_serial_port_open(struct serial_opt *serial)
{
static DCB dcb = {0};
HANDLE hComm = CreateFile(
serial->name,
GENERIC_WRITE | GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hComm == INVALID_HANDLE_VALUE) {
printf("CreateFile() failed with error %d\n", GetLastError());
}
if (GetCommState(hComm, &dcb))
{
dcb.BaudRate = serial->baud;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
}
else {
printf("Failed to get the comm state - Error: %d\n", GetLastError());
CloseHandle(hComm);
}
if ( !SetCommState( hComm, &dcb ) ) {
printf("Failed to set the comm state - Error: %d", GetLastError());
CloseHandle(hComm);
}
serial->handler = _open_osfhandle((intptr_t)hComm, O_TEXT);
if(serial->handler == -1) {
printf("Error in _open_osfhandle\n");
CloseHandle(hComm);
}
return serial->handler;
}
static int win32_serial_port_read(int fd, char *read_buffer, size_t max_chars_to_read)
{
int chars_read = _read(fd, read_buffer, max_chars_to_read);
return chars_read;
}
static int win32_serial_port_write(int fd, const char *write_buffer)
{
size_t len = strlen(write_buffer);
size_t bytes_written = _write(fd, write_buffer, len);
return (bytes_written == len);
}
static int win32_serial_port_bytes_available(struct serial_opt *serial)
{
return 1;
}