Index: /trunk/ntripclient/makefile
===================================================================
--- /trunk/ntripclient/makefile	(revision 833)
+++ /trunk/ntripclient/makefile	(revision 834)
@@ -1,3 +1,3 @@
-# $Id: makefile,v 1.5 2007/12/12 09:45:23 stoecker Exp $
+# $Id: makefile,v 1.6 2007/12/14 14:52:16 stuerze Exp $
 # probably works not with all compilers. Thought this should be easy
 # fixable. There is nothing special at this source.
@@ -11,6 +11,6 @@
 endif
 
-ntripclient: ntripclient.c
-	$(CC) $(OPTS) $? -o $@ $(LIBS)
+ntripclient: ntripclient.c serial.c
+	$(CC) $(OPTS) ntripclient.c -o $@ $(LIBS)
 
 clean:
Index: /trunk/ntripclient/ntripclient.c
===================================================================
--- /trunk/ntripclient/ntripclient.c	(revision 833)
+++ /trunk/ntripclient/ntripclient.c	(revision 834)
@@ -1,7 +1,7 @@
 /*
-  Easy example NTRIP client for POSIX.
-  $Id: ntripclient.c,v 1.41 2008/04/04 13:02:06 stuerze Exp $
-  Copyright (C) 2003-2005 by Dirk Stoecker <soft@dstoecker.de>
-    
+  NTRIP client for POSIX.
+  $Id: ntripclient.c,v 1.42 2008/04/07 11:49:13 stoecker Exp $
+  Copyright (C) 2003-2008 by Dirk Stöcker <soft@dstoecker.de>
+
   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
@@ -27,4 +27,6 @@
 #include <string.h>
 #include <time.h>
+
+#include "serial.c"
 
 #ifdef WINDOWSVERSION
@@ -57,6 +59,6 @@
 
 /* CVS revision and version */
-static char revisionstr[] = "$Revision: 1.41 $";
-static char datestr[]     = "$Date: 2008/04/04 13:02:06 $";
+static char revisionstr[] = "$Revision: 1.42 $";
+static char datestr[]     = "$Date: 2008/04/07 11:49:13 $";
 
 enum MODE { HTTP = 1, RTSP = 2, NTRIP1 = 3, AUTO = 4, END };
@@ -77,4 +79,10 @@
   int         udpport;
   int         initudp;
+  enum SerialBaud baud;
+  enum SerialDatabits databits;
+  enum SerialStopbits stopbits;
+  enum SerialParity parity;
+  enum SerialProtocol protocol;
+  const char *serdevice;
 };
 
@@ -98,8 +106,14 @@
 { "nmea",       required_argument, 0, 'n'},
 { "mode",       required_argument, 0, 'M'},
+{ "serdevice",  required_argument, 0, 'D'},
+{ "baud",       required_argument, 0, 'B'},
+{ "stopbits",   required_argument, 0, 'T'},
+{ "protocol",   required_argument, 0, 'C'},
+{ "parity",     required_argument, 0, 'Y'},
+{ "databits",   required_argument, 0, 'A'},
 { "help",       no_argument,       0, 'h'},
 {0,0,0,0}};
 #endif
-#define ARGOPT "-d:m:bhp:r:s:u:n:S:R:M:IP:"
+#define ARGOPT "-d:m:bhp:r:s:u:n:S:R:M:IP:D:B:T:C:Y:A:"
 
 int stop = 0;
@@ -183,5 +197,5 @@
             *Buffer++ = h[*url & 0x0f];
             url++;
-          }      
+          }
        }
     }
@@ -300,4 +314,10 @@
   args->initudp = 0;
   args->udpport = 0;
+  args->protocol = SPAPROTOCOL_NONE;
+  args->parity = SPAPARITY_NONE;
+  args->stopbits = SPASTOPBITS_1;
+  args->databits = SPADATABITS_8;
+  args->baud = SPABAUD_9600;
+  args->serdevice = 0;
   help = 0;
 
@@ -320,4 +340,72 @@
         args->data = optarg; 
       break;
+    case 'B':
+      {
+        int i = strtol(optarg, 0, 10);
+
+        switch(i)
+        {
+        case 50: args->baud = SPABAUD_50; break;
+        case 110: args->baud = SPABAUD_110; break;
+        case 300: args->baud = SPABAUD_300; break;
+        case 600: args->baud = SPABAUD_600; break;
+        case 1200: args->baud = SPABAUD_1200; break;
+        case 2400: args->baud = SPABAUD_2400; break;
+        case 4800: args->baud = SPABAUD_4800; break;
+        case 9600: args->baud = SPABAUD_9600; break;
+        case 19200: args->baud = SPABAUD_19200; break;
+        case 38400: args->baud = SPABAUD_38400; break;
+        case 57600: args->baud = SPABAUD_57600; break;
+        case 115200: args->baud = SPABAUD_115200; break;
+        default:
+          fprintf(stderr, "Baudrate '%s' unknown\n", optarg);
+          res = 0;
+          break;
+        }
+      }
+      break;
+    case 'T':
+      if(!strcmp(optarg, "1")) args->stopbits = SPASTOPBITS_1;
+      else if(!strcmp(optarg, "2")) args->stopbits = SPASTOPBITS_2;
+      else
+      {
+        fprintf(stderr, "Stopbits '%s' unknown\n", optarg);
+        res = 0;
+      }
+      break;
+    case 'A':
+      if(!strcmp(optarg, "5")) args->databits = SPADATABITS_5;
+      else if(!strcmp(optarg, "6")) args->databits = SPADATABITS_6;
+      else if(!strcmp(optarg, "7")) args->databits = SPADATABITS_7;
+      else if(!strcmp(optarg, "8")) args->databits = SPADATABITS_8;
+      else
+      {
+        fprintf(stderr, "Databits '%s' unknown\n", optarg);
+        res = 0;
+      }
+      break;
+    case 'C':
+      {
+        int i = 0;
+        args->protocol = SerialGetProtocol(optarg, &i);
+        if(i)
+        {
+          fprintf(stderr, "Protocol '%s' unknown\n", optarg);
+          res = 0;
+        }
+      }
+      break;
+    case 'Y':
+      {
+        int i = 0;
+        args->parity = SerialGetParity(optarg, &i);
+        if(i)
+        {
+          fprintf(stderr, "Parity '%s' unknown\n", optarg);
+          res = 0;
+        }
+      }
+      break;
+    case 'D': args->serdevice = optarg; break;
     case 'I': args->initudp = 1; break;
     case 'P': args->udpport = strtol(optarg, 0, 10); break;
@@ -383,6 +471,14 @@
     " -n " LONG_OPT("--nmea       ") "NMEA string for sending to server\n"
     " -b " LONG_OPT("--bitrate    ") "output bitrate\n"
+    " -I " LONG_OPT("--initudp    ") "send initial UDP packet for firewall handling\n"
+    " -P " LONG_OPT("--udpport    ") "set the local UDP port\n"
     " -S " LONG_OPT("--proxyhost  ") "proxy name or address\n"
     " -R " LONG_OPT("--proxyport  ") "proxy port, optional (default 2101)\n"
+    " -D " LONG_OPT("--serdevice  ") "serial device for output\n"
+    " -B " LONG_OPT("--baud       ") "baudrate for serial device\n"
+    " -T " LONG_OPT("--stopbits   ") "stopbits for serial device\n"
+    " -C " LONG_OPT("--protocol   ") "protocol for serial device\n"
+    " -Y " LONG_OPT("--parity     ") "parity for serial device\n"
+    " -A " LONG_OPT("--databits   ") "databits for serial device\n"
     " -M " LONG_OPT("--mode       ") "mode for data request\n"
     "     Valid modes are:\n"
@@ -469,5 +565,19 @@
   if(getargs(argc, argv, &args))
   {
+    struct serial sx;
+    char nmeabuffer[200] = "$GPGGA,"; /* our start string */
+    size_t nmeabufpos = 0;
+    size_t nmeastarpos = 0;
     int sleeptime = 0;
+    if(args.serdevice)
+    {
+      const char *e = SerialInit(&sx, args.serdevice, args.baud,
+      args.stopbits, args.protocol, args.parity, args.databits, 1);
+      if(e)
+      {
+        fprintf(stderr, "%s\n", e);
+        return 20;
+      }
+    }
     do
     {
@@ -546,5 +656,5 @@
       their_addr.sin_family = AF_INET;
       their_addr.sin_addr = *((struct in_addr *)he->h_addr);
-      
+
       if(args.data && *args.data != '%' && args.mode == RTSP)
       {
@@ -630,5 +740,5 @@
         {
           if(numbytes >= 17 && !strncmp(buf, "RTSP/1.0 200 OK\r\n", 17))
-	  {
+          {
             int serverport = 0, session = 0;
             const char *portcheck = "server_port=";
@@ -696,8 +806,9 @@
               rtpbuffer[6] = 0;
               rtpbuffer[7] = 0;
-              rtpbuffer[8] = 0;
-              rtpbuffer[9] = 0;
-              rtpbuffer[10] = 0;
-              rtpbuffer[11] = 0;
+              /* sequence and timestamp are empty */
+              rtpbuffer[8] = (session>>24)&0xFF;
+              rtpbuffer[9] = (session>>16)&0xFF;
+              rtpbuffer[10] = (session>>8)&0xFF;
+              rtpbuffer[11] = (session)&0xFF;
               /* fill structure with caster address information for UDP */
               memset(&casterRTP, 0, sizeof(casterRTP));
@@ -926,5 +1037,5 @@
                 if(i < numbytes-l)
                   chunkymode = 1;
-	      }
+              }
               else if(!strstr(buf, "ICY 200 OK"))
               {
@@ -976,5 +1087,21 @@
                     i = numbytes-pos;
                     if(i > chunksize) i = chunksize;
-                    fwrite(buf+pos, (size_t)i, 1, stdout);
+                    if(args.serdevice)
+                    {
+                      int ofs = 0;
+                      while(i > ofs && !stop)
+                      {
+                        int j = SerialWrite(&sx, buf+pos+ofs, i-ofs);
+                        if(j < 0)
+                        {
+                          fprintf(stderr, "Could not access serial device\n");
+                          stop = 1;
+                        }
+                        else
+                          ofs += j;
+                      }
+                    }
+                    else
+                      fwrite(buf+pos, (size_t)i, 1, stdout);
                     totalbytes += i;
                     chunksize -= i;
@@ -997,5 +1124,21 @@
               {
                 totalbytes += numbytes;
-                fwrite(buf, (size_t)numbytes, 1, stdout);
+                if(args.serdevice)
+                {
+                  int ofs = 0;
+                  while(numbytes > ofs && !stop)
+                  {
+                    int i = SerialWrite(&sx, buf+ofs, numbytes-ofs);
+                    if(i < 0)
+                    {
+                      fprintf(stderr, "Could not access serial device\n");
+                      stop = 1;
+                    }
+                    else
+                      ofs += i;
+                  }
+                }
+                else
+                  fwrite(buf, (size_t)numbytes, 1, stdout);
               }
               fflush(stdout);
@@ -1005,4 +1148,61 @@
                 starttime = time(0);
                 lastout = starttime;
+              }
+              if(args.serdevice && !stop)
+              {
+                int doloop = 1;
+                while(doloop && !stop)
+                {
+                  int i = SerialRead(&sx, buf, 200);
+                  if(i < 0)
+                  {
+                    fprintf(stderr, "Could not access serial device\n");
+                    stop = 1;
+                  }
+                  else
+                  {
+                    int j = 0;
+                    if(i < 200) doloop = 0;
+                    fwrite(buf, i, 1, stdout);
+                    while(j < i)
+                    {
+                      if(nmeabufpos < 6)
+                      {
+                        if(nmeabuffer[nmeabufpos] != buf[j])
+                        {
+                          if(nmeabufpos) nmeabufpos = 0;
+                          else ++j;
+                        }
+                        else
+                        {
+                          nmeastarpos = 0;
+                          ++j; ++nmeabufpos;
+                        }
+                      }
+                      else if((nmeastarpos && nmeabufpos == nmeastarpos + 3)
+                      || buf[j] == '\r' || buf[j] == '\n')
+                      {
+                        doloop = 0;
+                        nmeabuffer[nmeabufpos++] = '\r';
+                        nmeabuffer[nmeabufpos++] = '\n';
+                        if(send(sockfd, nmeabuffer, nmeabufpos, 0)
+                        != (int)nmeabufpos)
+                        {
+                          fprintf(stderr, "Could not send NMEA\n");
+                          stop = 1;
+                        }
+                        nmeabufpos = 0;
+                      }
+                      else if(nmeabufpos > sizeof(nmeabuffer)-10 ||
+                      buf[j] == '$')
+                        nmeabufpos = 0;
+                      else
+                      {
+                        if(buf[j] == '*') nmeastarpos = nmeabufpos;
+                        nmeabuffer[nmeabufpos++] = buf[j++];
+                      }
+                    }
+                  }
+                }
               }
               if(args.bitrate)
@@ -1033,4 +1233,8 @@
       }
     } while(args.data && *args.data != '%' && !stop);
+    if(args.serdevice)
+    {
+      SerialFree(&sx);
+    }
   }
   return 0;
Index: /trunk/ntripclient/serial.c
===================================================================
--- /trunk/ntripclient/serial.c	(revision 834)
+++ /trunk/ntripclient/serial.c	(revision 834)
@@ -0,0 +1,285 @@
+/*
+  Serial port access for NTRIP client for POSIX.
+  $Id$
+  Copyright (C) 2008 by Dirk Stöcker <soft@dstoecker.de>
+
+  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 2 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, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+  or read http://www.gnu.org/licenses/gpl.txt
+*/
+
+/* system includes */
+#include <stdio.h>
+#include <string.h>
+
+#ifndef WINDOWSVERSION
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <termios.h>
+#include <unistd.h>
+#define SERIALDEFAULTDEVICE "/dev/ttyS0"
+enum SerialBaud {
+  SPABAUD_50 = B50, SPABAUD_110 = B110, SPABAUD_300 = B300, SPABAUD_600 = B600,
+  SPABAUD_1200 = B1200, SPABAUD_2400 = B2400, SPABAUD_4800 = B4800,
+  SPABAUD_9600 = B9600, SPABAUD_19200 = B19200,
+  SPABAUD_38400 = B38400, SPABAUD_57600 = B57600, SPABAUD_115200 = B115200 };
+enum SerialDatabits {
+  SPADATABITS_5 = CS5, SPADATABITS_6 = CS6, SPADATABITS_7 = CS7, SPADATABITS_8 = CS8 };
+enum SerialStopbits {
+  SPASTOPBITS_1 = 0, SPASTOPBITS_2 = CSTOPB };
+enum SerialParity {
+  SPAPARITY_NONE = 0, SPAPARITY_ODD = PARODD | PARENB, SPAPARITY_EVEN = PARENB };
+enum SerialProtocol {
+  SPAPROTOCOL_NONE = 0, SPAPROTOCOL_RTS_CTS = 9999,
+  SPAPROTOCOL_XON_XOFF = IXOFF | IXON };
+
+struct serial
+{
+  struct termios Termios;
+  int            Stream;
+};
+#else /* WINDOWSVERSION */
+#include <windows.h>
+#define SERIALDEFAULTDEVICE "COM1"
+enum SerialBaud {
+  SPABAUD_50 = 50, SPABAUD_110 = 110, SPABAUD_300 = 300, SPABAUD_600 = 600,
+  SPABAUD_1200 = 1200, SPABAUD_2400 = 2400, SPABAUD_4800 = 4800,
+  SPABAUD_9600 = 9600, SPABAUD_19200 = 19200,
+  SPABAUD_38400 = 38400, SPABAUD_57600 = 57600, SPABAUD_115200 = 115200 };
+enum SerialDatabits {
+  SPADATABITS_5 = 5, SPADATABITS_6 = 6, SPADATABITS_7 = 7, SPADATABITS_8 = 8 };
+enum SerialStopbits {
+  SPASTOPBITS_1 = 1, SPASTOPBITS_2 = 2 };
+enum SerialParity {
+  SPAPARITY_NONE = 'N', SPAPARITY_ODD = 'O', SPAPARITY_EVEN = 'E'};
+enum SerialProtocol {
+  SPAPROTOCOL_NONE, SPAPROTOCOL_RTS_CTS, SPAPROTOCOL_XON_XOFF};
+
+struct serial
+{
+  DCB    Termios;
+  HANDLE Stream;
+};
+#if !defined(__GNUC__)
+int strncasecmp(const char *a, const char *b, int len)
+{
+  while(len-- && *a && tolower(*a) == tolower(*b))
+  {
+    ++a; ++b;
+  }
+  return len ? (tolower(*a) - tolower(*b)) : 0;
+}
+#endif /* !__GNUC__ */
+
+#endif /* WINDOWSVERSION */
+
+static enum SerialParity SerialGetParity(const char *buf, int *ressize)
+{
+  int r = 0;
+  enum SerialParity p = SPAPARITY_NONE;
+  if(!strncasecmp(buf, "none", 4))
+  { r = 4; p = SPAPARITY_NONE; }
+  else if(!strncasecmp(buf, "no", 2))
+  { r = 2; p = SPAPARITY_NONE; }
+  else if(!strncasecmp(buf, "odd", 3))
+  { r = 3; p = SPAPARITY_ODD; }
+  else if(!strncasecmp(buf, "even", 4))
+  { r = 4; p = SPAPARITY_EVEN; }
+  else if(*buf == 'N' || *buf == 'n')
+  { r = 1; p = SPAPARITY_NONE; }
+  else if(*buf == 'O' || *buf == 'o')
+  { r = 1; p = SPAPARITY_ODD; }
+  else if(*buf == 'E' || *buf == 'e')
+  { r = 1; p = SPAPARITY_EVEN; }
+  if(ressize) *ressize = r;
+  return p;
+}
+
+static enum SerialProtocol SerialGetProtocol(const char *buf, int *ressize)
+{
+  int r = 0;
+  enum SerialProtocol Protocol = SPAPROTOCOL_NONE;
+  /* try some possible forms for input, be as gentle as possible */
+  if(!strncasecmp("xonxoff",buf,7)){r = 7; Protocol=SPAPROTOCOL_XON_XOFF;}
+  else if(!strncasecmp("xon_xoff",buf,8)){r = 8; Protocol=SPAPROTOCOL_XON_XOFF;}
+  else if(!strncasecmp("xon-xoff",buf,8)){r = 8; Protocol=SPAPROTOCOL_XON_XOFF;}
+  else if(!strncasecmp("xon xoff",buf,8)){r = 8; Protocol=SPAPROTOCOL_XON_XOFF;}
+  else if(!strncasecmp("xoff",buf,4)){r = 4; Protocol=SPAPROTOCOL_XON_XOFF;}
+  else if(!strncasecmp("xon",buf,3)){r = 3; Protocol=SPAPROTOCOL_XON_XOFF;}
+  else if(*buf == 'x' || *buf == 'X'){r = 1; Protocol=SPAPROTOCOL_XON_XOFF;}
+  else if(!strncasecmp("rtscts",buf,6)){r = 6; Protocol=SPAPROTOCOL_RTS_CTS;}
+  else if(!strncasecmp("rts_cts",buf,7)){r = 7; Protocol=SPAPROTOCOL_RTS_CTS;}
+  else if(!strncasecmp("rts-cts",buf,7)){r = 7; Protocol=SPAPROTOCOL_RTS_CTS;}
+  else if(!strncasecmp("rts cts",buf,7)){r = 7; Protocol=SPAPROTOCOL_RTS_CTS;}
+  else if(!strncasecmp("rts",buf,3)){r = 3; Protocol=SPAPROTOCOL_RTS_CTS;}
+  else if(!strncasecmp("cts",buf,3)){r = 3; Protocol=SPAPROTOCOL_RTS_CTS;}
+  else if(*buf == 'r' || *buf == 'R' || *buf == 'c' || *buf == 'C')
+  {r = 1; Protocol=SPAPROTOCOL_RTS_CTS;}
+  else if(!strncasecmp("none",buf,4)){r = 4; Protocol=SPAPROTOCOL_NONE;}
+  else if(!strncasecmp("no",buf,2)){r = 2; Protocol=SPAPROTOCOL_NONE;}
+  else if(*buf == 'n' || *buf == 'N'){r = 1; Protocol=SPAPROTOCOL_NONE;}
+  if(ressize) *ressize = r;
+  return Protocol;
+}
+
+#ifndef WINDOWSVERSION
+static void SerialFree(struct serial *sn)
+{
+  if(sn->Stream)
+  {
+    /* reset old settings */
+    tcsetattr(sn->Stream, TCSANOW, &sn->Termios);
+    close(sn->Stream);
+    sn->Stream = 0;
+  }
+}
+
+static const char * SerialInit(struct serial *sn,
+const char *Device, enum SerialBaud Baud, enum SerialStopbits StopBits,
+enum SerialProtocol Protocol, enum SerialParity Parity,
+enum SerialDatabits DataBits, int dowrite
+#ifdef __GNUC__
+__attribute__((__unused__))
+#endif /* __GNUC__ */
+)
+{
+  struct termios newtermios;
+
+  if((sn->Stream = open(Device, O_RDWR | O_NOCTTY | O_NONBLOCK)) <= 0)
+    return "could not open serial port";
+  tcgetattr(sn->Stream, &sn->Termios);
+
+  memset(&newtermios, 0, sizeof(struct termios));
+  newtermios.c_cflag = Baud | StopBits | Parity | DataBits
+  | CLOCAL | CREAD;
+  if(Protocol == SPAPROTOCOL_RTS_CTS)
+    newtermios.c_cflag |= CRTSCTS;
+  else
+    newtermios.c_cflag |= Protocol;
+  newtermios.c_cc[VMIN] = 1;
+  tcflush(sn->Stream, TCIOFLUSH);
+  tcsetattr(sn->Stream, TCSANOW, &newtermios);
+  tcflush(sn->Stream, TCIOFLUSH);
+  fcntl(sn->Stream, F_SETFL, O_NONBLOCK);
+  return 0;
+}
+
+static int SerialRead(struct serial *sn, char *buffer, size_t size)
+{
+  int j = read(sn->Stream, buffer, size);
+  if(j < 0)
+  {
+    if(errno == EAGAIN)
+      return 0;
+    else
+      return j;
+  }
+  return j;
+}
+
+static int SerialWrite(struct serial *sn, const char *buffer, size_t size)
+{
+  int j = write(sn->Stream, buffer, size);
+  if(j < 0)
+  {
+    if(errno == EAGAIN)
+      return 0;
+    else
+      return j;
+  }
+  return j;
+}
+
+#else /* WINDOWSVERSION */
+static void SerialFree(struct serial *sn)
+{
+  if(sn->Stream)
+  {
+    SetCommState(sn->Stream, &sn->Termios);
+    /* reset old settings */
+    CloseHandle(sn->Stream);
+    sn->Stream = 0;
+  }
+}
+
+static const char * SerialInit(struct serial *sn, const char *Device,
+enum SerialBaud Baud, enum SerialStopbits StopBits,
+enum SerialProtocol Protocol, enum SerialParity Parity,
+enum SerialDatabits DataBits, int dowrite)
+{
+  char mydevice[50];
+  if(Device[0] != '\\')
+    snprintf(mydevice, sizeof(mydevice), "\\\\.\\%s", Device);
+  else
+    mydevice[0] = 0;
+
+  if((sn->Stream = CreateFile(mydevice[0] ? mydevice : Device,
+  dowrite ? GENERIC_WRITE|GENERIC_READ : GENERIC_READ, 0, 0, OPEN_EXISTING,
+  0, 0)) == INVALID_HANDLE_VALUE)
+    return "could not create file";
+
+  memset(&sn->Termios, 0, sizeof(sn->Termios));
+  GetCommState(sn->Stream, &sn->Termios);
+
+  DCB dcb;
+  memset(&dcb, 0, sizeof(dcb));
+  char str[100];
+  snprintf(str,sizeof(str),
+  "baud=%d parity=%c data=%d stop=%d xon=%s octs=%s rts=%s",
+  Baud, Parity, DataBits, StopBits,
+  Protocol == SPAPROTOCOL_XON_XOFF ? "on" : "off",
+  Protocol == SPAPROTOCOL_RTS_CTS ? "on" : "off",
+  Protocol == SPAPROTOCOL_RTS_CTS ? "on" : "off");
+#ifdef DEBUG
+  fprintf(stderr, "COM Settings: %s\n", str);
+#endif
+
+  COMMTIMEOUTS ct = {MAXDWORD, 0, 0, 0, 0};
+
+  if(!BuildCommDCB(str, &dcb))
+  {
+    CloseHandle(sn->Stream);
+    return "creating device parameters failed";
+  }
+  else if(!SetCommState(sn->Stream, &dcb))
+  {
+    CloseHandle(sn->Stream);
+    return "setting device parameters failed";
+  }
+  else if(!SetCommTimeouts(sn->Stream, &ct))
+  {
+    CloseHandle(sn->Stream);
+    return "setting timeouts failed";
+  }
+
+  return 0;
+}
+
+static int SerialRead(struct serial *sn, char *buffer, size_t size)
+{
+  DWORD j = 0;
+  if(!ReadFile(sn->Stream, buffer, size, &j, 0))
+    return -1;
+  return j;
+}
+
+static int SerialWrite(struct serial *sn, const char *buffer, size_t size)
+{
+  DWORD j = 0;
+  if(!WriteFile(sn->Stream, buffer, size, &j, 0))
+    return -1;
+  return j;
+}
+#endif /* WINDOWSVERSION */
