2 * @file serial_windows.c
3 * @author Shinichiro Nakamura
4 * @brief シリアルポートドライバの実装。(Windowsプラットフォーム用)
8 * ===============================================================
9 * Serial interface library
11 * ===============================================================
12 * Copyright (c) 2010-2012 Shinichiro Nakamura
14 * Permission is hereby granted, free of charge, to any person
15 * obtaining a copy of this software and associated documentation
16 * files (the "Software"), to deal in the Software without
17 * restriction, including without limitation the rights to use,
18 * copy, modify, merge, publish, distribute, sublicense, and/or
19 * sell copies of the Software, and to permit persons to whom the
20 * Software is furnished to do so, subject to the following
23 * The above copyright notice and this permission notice shall be
24 * included in all copies or substantial portions of the Software.
26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
28 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
30 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
31 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
32 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
33 * OTHER DEALINGS IN THE SOFTWARE.
34 * ===============================================================
50 * @param devfile シリアルポートのデバイスファイル名.
56 SERIAL *serial_open(const char *devfile, const enum SerialBaud baud)
62 * シリアルデスクリプタの管理領域を確保する.
64 SERIAL *s = (SERIAL *) malloc(sizeof(SERIAL));
72 if (strstr(devfile, "\\\\.\\") == NULL) {
73 strcpy(s->devfile, "\\\\.\\");
75 strcpy(s->devfile, "");
77 strcat(s->devfile, devfile);
82 s->handle = CreateFile(
84 GENERIC_READ | GENERIC_WRITE,
90 if (s->handle == INVALID_HANDLE_VALUE) {
98 if (!GetCommState(s->handle, ¶m)) {
104 param.BaudRate = CBR_2400;
107 param.BaudRate = CBR_4800;
110 param.BaudRate = CBR_9600;
112 case SerialBaud19200:
113 param.BaudRate = CBR_19200;
115 case SerialBaud38400:
116 param.BaudRate = CBR_38400;
119 param.BaudRate = CBR_9600;
123 param.StopBits = ONESTOPBIT;
124 param.Parity = NOPARITY;
125 if(!SetCommState(s->handle, ¶m)){
133 PurgeComm(s->handle, PURGE_RXCLEAR);
134 PurgeComm(s->handle, PURGE_TXCLEAR);
135 PurgeComm(s->handle, PURGE_RXABORT);
136 PurgeComm(s->handle, PURGE_TXABORT);
144 * @param s シリアルデスクリプタへのポインタ.
148 int serial_close(SERIAL * s)
154 PurgeComm(s->handle, PURGE_RXCLEAR);
155 PurgeComm(s->handle, PURGE_TXCLEAR);
156 PurgeComm(s->handle, PURGE_RXABORT);
157 PurgeComm(s->handle, PURGE_TXABORT);
162 CloseHandle(s->handle);
165 * シリアルデスクリプタの管理領域を破棄する.
173 * シリアルポートから指定バイト数の読み込みを実行する.
175 * @param s シリアルデスクリプタへのポインタ.
176 * @param buf バッファへのポインタ.
177 * @param size 読み込みバイト数.
181 int serial_read(SERIAL * s, unsigned char *buf, const size_t size)
189 if(!ReadFile(s->handle, buf, size, &cnt, NULL)){
197 * シリアルポートから指定バイト数の読み込みを実行する.
199 * @param s シリアルデスクリプタへのポインタ.
200 * @param buf バッファへのポインタ.
201 * @param size 読み込みバイト数.
202 * @param ms ミリ秒単位のタイムアウト時間.
206 int serial_read_with_timeout(SERIAL * s,
207 unsigned char *buf, const size_t size, const int ms)
213 * タイムアウトを設定して読み込みを実行する.
216 cto.ReadIntervalTimeout = MAXDWORD;
217 cto.ReadTotalTimeoutConstant = ms;
218 cto.ReadTotalTimeoutMultiplier = MAXDWORD;
219 if(SetCommTimeouts(s->handle, &cto)){
223 while (total < size) {
225 ReadFile(s->handle, buf + total, 1, &cnt, NULL);
243 * シリアルポートへ指定バイト数の書き込みを実行する.
245 * @param s シリアルデスクリプタへのポインタ.
246 * @param buf バッファへのポインタ.
247 * @param size 書き込みバイト数.
251 int serial_write(SERIAL * s,
252 const unsigned char *buf, const size_t size)
260 if(!WriteFile(s->handle, buf, size, &cnt, NULL)){