[Mono-dev] Patch for Bug 8207: Can't set 1000000 baud with System.IO.Ports.SerialPort.BaudRate

Christian Hofstaedtler ch---mono-devel at zeha.at
Wed Feb 25 08:53:32 UTC 2015


Hi Miguel,

* Miguel de Icaza <miguel at xamarin.com> [150225 03:07]:
> Hello Christian,
> 
> This looks fine.  Are you the original author of the patch?

Yes, I'm the original author of this patch (as posted to Bugzilla in
2013).

Christian

> 
> On Tue, Feb 24, 2015 at 3:45 PM, Christian Hofstaedtler <
> ch---mono-devel at zeha.at> wrote:
> 
> > This patch (against mono-2.10.8.1 from Debian) allows setting
> > custom baud rates, and very likely would support a baudrate of
> > 1000000.
> >
> > I release this patch under the MIT license.
> >
> >
> > --- serial.c.orig       2013-01-30 12:06:52.379691461 +0100
> > +++ serial.c.orig       2013-01-30 13:05:50.383390154 +0100
> > @@ -17,6 +17,11 @@
> >  #endif
> >  #include <sys/ioctl.h>
> >
> > +/* This is for ASYNC_*, serial_struct on linux */
> > +#if defined(__linux__)
> > +#include <linux/serial.h>
> > +#endif
> > +
> >  #include <glib.h>
> >
> >  /* This is for FIONREAD on solaris */
> > @@ -151,6 +156,7 @@
> >  set_attributes (int fd, int baud_rate, MonoParity parity, int dataBits,
> > MonoStopBits stopBits, MonoHandshake handshake)
> >  {
> >         struct termios newtio;
> > +       gboolean custom_baud_rate = FALSE;
> >
> >         if (tcgetattr (fd, &newtio) == -1)
> >                 return FALSE;
> > @@ -227,8 +233,10 @@
> >             break;
> >         case 50:
> >         case 0:
> > -       default:
> >             baud_rate = B9600;
> > +           break;
> > +       default:
> > +           custom_baud_rate = TRUE;
> >                 break;
> >         }
> >
> > @@ -319,16 +327,54 @@
> >             newtio.c_iflag |= IXOFF | IXON;
> >                 break;
> >         }
> > -
> > -       if (cfsetospeed (&newtio, baud_rate) < 0 || cfsetispeed (&newtio,
> > baud_rate) < 0 ||
> > -           tcsetattr (fd, TCSANOW, &newtio) < 0)
> > +
> > +       if (custom_baud_rate == FALSE)
> >         {
> > -               return FALSE;
> > +               if (cfsetospeed (&newtio, baud_rate) < 0 || cfsetispeed
> > (&newtio, baud_rate) < 0)
> > +               {
> > +                       return FALSE;
> > +               }
> >         }
> >         else
> >         {
> > -       return TRUE;
> > +               /* On Linux, to set a custom baud rate, we must set the
> > "standard" baud_rate
> > +                * to 38400. */
> > +               if (cfsetospeed (&newtio, B38400) < 0 || cfsetispeed
> > (&newtio, B38400) < 0)
> > +               {
> > +                       return FALSE;
> > +               }
> > +       }
> > +
> > +       if (tcsetattr (fd, TCSANOW, &newtio) < 0)
> > +       {
> > +               return FALSE;
> > +       }
> > +
> > +       if (custom_baud_rate == TRUE)
> > +       {
> > +#if defined(__linux__)
> > +               struct serial_struct ser;
> > +
> > +               if (ioctl (fd, TIOCGSERIAL, &ser) < 0)
> > +               {
> > +                       return FALSE;
> > +               }
> > +
> > +               ser.custom_divisor = ser.baud_base / baud_rate;
> > +               ser.flags &= ~ASYNC_SPD_MASK;
> > +               ser.flags |= ASYNC_SPD_CUST;
> > +
> > +               if (ioctl (fd, TIOCSSERIAL, &ser) < 0)
> > +               {
> > +                       return FALSE;
> > +               }
> > +#else
> > +               /* Don't know how to set custom baud rate on this
> > platform. */
> > +               return FALSE;
> > +#endif
> >         }
> > +
> > +       return TRUE;
> >  }



More information about the Mono-devel-list mailing list