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

Miguel de Icaza miguel at xamarin.com
Wed Feb 25 02:06:54 UTC 2015


Hello Christian,

This looks fine.  Are you the original author of the patch?

Miguel

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;
>  }
>
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ximian.com/pipermail/mono-devel-list/attachments/20150224/21049a63/attachment.html>


More information about the Mono-devel-list mailing list