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@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to