Ticket #332: serial_io.c

File serial_io.c, 2.0 KB (added by Stressedpiper, 11 years ago)
Line 
1#include <stdio.h>
2#include <windows.h>
3#include "serial_io.h"
4#include "debug.h"
5
6int serial_io_init( const char* port, const char* strsettings )
7{
8    HANDLE hCom = NULL;
9
10        char strport[16];
11        snprintf( strport, sizeof( strport ), "\\\\.\\%s", port );
12
13        hCom = CreateFile(
14                        strport,
15                        GENERIC_WRITE | GENERIC_READ,
16                        0,
17                        0,
18                        OPEN_EXISTING,
19                        0,
20                        NULL);
21
22        if (hCom == INVALID_HANDLE_VALUE)
23        {
24                LPVOID lpMsgBuf;
25
26                FormatMessage(
27                        FORMAT_MESSAGE_ALLOCATE_BUFFER |
28                        FORMAT_MESSAGE_FROM_SYSTEM |
29                        FORMAT_MESSAGE_IGNORE_INSERTS,
30                        NULL,
31                        GetLastError(),
32                        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
33                        (LPTSTR) &lpMsgBuf,
34                        0,
35                        NULL
36                );
37                // g_strSerialError = strPort + wxT(": ") + (LPTSTR) lpMsgBuf;
38
39                // Free the buffer.
40                LocalFree( lpMsgBuf );
41                return -1;
42        }
43
44        DCB dcb;
45
46        ZeroMemory(&dcb, sizeof(DCB));
47
48        GetCommState(hCom, &dcb);
49
50//    char strsettings[255];
51//    snprintf( strsettings, sizeof( strsettings ), "baud=%d parity=N data=8 stop=1", baudrate );
52        BuildCommDCB( strsettings, &dcb);
53
54        SetupComm(hCom, 4096, 4096);
55
56        SetCommState(hCom, &dcb);
57
58        COMMTIMEOUTS sCT;
59
60        memset(&sCT, 0, sizeof(sCT));
61        sCT.ReadTotalTimeoutConstant = 10;
62
63        SetCommTimeouts(hCom, &sCT);
64
65    return (int)hCom;
66}
67
68int serial_io_read( int fd, char * buffer, int buffer_size )
69{
70        DWORD dwBytesIn = 0;
71
72        if (fd <= 0)
73        {
74                // Sleep(1000);
75                *buffer = 0;
76                return 0;
77        }
78
79        ReadFile( (HANDLE)fd, buffer, buffer_size - 1, &dwBytesIn, NULL);
80
81        if (dwBytesIn > 0)
82        {
83            dbg(1,"GPS < %s\n",buffer );
84        }
85        if (dwBytesIn >= 0)
86        {
87                buffer[dwBytesIn] = 0;
88        }
89        else{
90        buffer[0] = 0;
91        }
92                buffer[buffer_size - 1] = 0;
93
94
95        if (dwBytesIn <= 0)
96        {
97                Sleep(50);
98                dwBytesIn = 0;
99        }
100
101        return dwBytesIn;
102}
103
104int serial_io_write(int fd, const char * buffer)
105{
106        DWORD dwBytesOut = 0;
107
108        WriteFile((HANDLE)fd, buffer, strlen(buffer), &dwBytesOut, NULL);
109
110        return dwBytesOut;
111}
112
113void serial_io_shutdown(int fd )
114{
115        if (fd > 0)
116        {
117                CloseHandle((HANDLE)fd);
118        }
119}