How to set 250000 baud rate in pyserial ?

Discussion in 'Python' started by kurabas@gmail.com, Oct 25, 2012.

  1. Guest

    I use Arduino 1280 and Arduino 2560 under Fedora 15.
    1280 creates ttyUSB0 port and can be set at 2500000 successfully.
    2560 creates ttyACM0 port and can be only set at speeds from list (no 250000) in pyserial. How to set 250000 to ttyACM0 port?? Need I patch kernel or python?
    , Oct 25, 2012
    #1
    1. Advertising

  2. On Thu, 25 Oct 2012 04:09:56 -0700 (PDT), declaimed
    the following in gmane.comp.python.general:

    > I use Arduino 1280 and Arduino 2560 under Fedora 15.
    > 1280 creates ttyUSB0 port and can be set at 2500000 successfully.
    > 2560 creates ttyACM0 port and can be only set at speeds from list (no 250000) in pyserial. How to set 250000 to ttyACM0 port?? Need I patch kernel or python?


    You don't say what error you are receiving but looking at the source
    (serialposix.py) implies that it accepts nearly anything on Linux, and
    relies on the OS returning a success/failure if the value is allowed or
    not.

    xxxBSD, SunOS, HPUX, IRIX, and CYGWIN systems don't allow "special"
    baudrates at all.

    .NET, JVM, and Windows don't seem to have explicit call outs for bad
    rates -- just a generic port configured OK test.
    --
    Wulfraed Dennis Lee Bieber AF6VN
    HTTP://wlfraed.home.netcom.com/
    Dennis Lee Bieber, Oct 25, 2012
    #2
    1. Advertising

  3. On 2012-10-25, Dennis Lee Bieber <> wrote:
    > On Thu, 25 Oct 2012 04:09:56 -0700 (PDT), wrote:
    >
    >> I use Arduino 1280 and Arduino 2560 under Fedora 15. 1280 creates
    >> ttyUSB0 port and can be set at 2500000 successfully. 2560 creates
    >> ttyACM0 port and can be only set at speeds from list (no 250000) in
    >> pyserial. How to set 250000 to ttyACM0 port?? Need I patch kernel or
    >> python?

    >
    > You don't say what error you are receiving but looking at the source
    > (serialposix.py) implies that it accepts nearly anything on Linux, and
    > relies on the OS returning a success/failure if the value is allowed or
    > not.


    1) Are you sure it matters? I've never played with an Arduino board,
    but other stuff I've used that implements a "virtual serial port"
    using a ttyUSB or ttyACM device (e.g. oscilloscope, various Atmel
    eval boards, JTAG interfaces, etc.) didn't have actual UARTs in
    them with real baud rate generators. You got the same high-speed
    transfers no matter what baud rate you told the tty driver.

    2) If you want a non-standard baud rate, there is a termios2 API on
    Linux that allows that (assuming the low-level driver and hardwdare
    support it). The last time I looked, it wasn't supported by
    pyserial, but you can ask pyserial for the underlying file
    descriptor and do the ioctl manually. The slightly ugly bit is
    that you'll have to use struct (or maybe ctypes) to handle the
    termios2 "C" structure.

    The behavior of baud rate requests that can't be met exactly is
    probably not very consistent. IIRC, the recommended approach is
    for the low level driver to pick the closest supported baud, and
    then report the actual baud rate back when you subsequently read
    the termios2 structure. However, I do know of some devices that
    will always report the requested baud rate even if the physical
    baud rate that was selected wasn't exactly the same as the request
    rate.

    Here's how you set an arbitrary baud rate in C:

    -------------------------arbitrary-baud.c--------------------------
    #include <stdlib.h>
    #include <stdio.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <string.h>
    #include <linux/termios.h>

    int ioctl(int d, int request, ...);

    int main(int argc, char *argv[])
    {
    struct termios2 t;
    int fd,baud;

    if (argc != 3)
    {
    fprintf(stderr,"usage: %s <device> <baud>\n", argv[0]);
    return 1;
    }

    fd = open(argv[1], O_RDWR | O_NOCTTY | O_NDELAY);

    if (fd == -1)
    {
    fprintf(stderr, "error opening %s: %s", argv[1], strerror(errno));
    return 2;
    }

    baud = atoi(argv[2]);

    if (ioctl(fd, TCGETS2, &t))
    {
    perror("TCGETS2");
    return 3;
    }

    t.c_cflag &= ~CBAUD;
    t.c_cflag |= BOTHER;
    t.c_ispeed = baud;
    t.c_ospeed = baud;

    if (ioctl(fd, TCSETS2, &t))
    {
    perror("TCSETS2");
    return 4;
    }

    if (ioctl(fd, TCGETS2, &t))
    {
    perror("TCGETS2");
    return 5;
    }

    printf("actual speed reported %d\n", t.c_ospeed);
    return 0;
    }

    --------------------------------------------------------------------

    --
    Grant Edwards grant.b.edwards
    at
    gmail.com
    Grant Edwards, Oct 25, 2012
    #3
  4. Guest

    Error is like cannot set special baud rate.
    But as I said pyserial set this speed without problem for ttyUSB0
    So it seems pyserial uses diefferent code depending of port type.
    I tried to simlink ln -s ttyACM0 ttyUSB0 but it does not work


    On Thursday, October 25, 2012 9:11:23 PM UTC+3, Dennis Lee Bieber wrote:
    > On Thu, 25 Oct 2012 04:09:56 -0700 (PDT), declaimed
    >
    > the following in gmane.comp.python.general:
    >
    >
    >
    > > I use Arduino 1280 and Arduino 2560 under Fedora 15.

    >
    > > 1280 creates ttyUSB0 port and can be set at 2500000 successfully.

    >
    > > 2560 creates ttyACM0 port and can be only set at speeds from list (no 250000) in pyserial. How to set 250000 to ttyACM0 port?? Need I patch kernel or python?

    >
    >
    >
    > You don't say what error you are receiving but looking at the source
    >
    > (serialposix.py) implies that it accepts nearly anything on Linux, and
    >
    > relies on the OS returning a success/failure if the value is allowed or
    >
    > not.
    >
    >
    >
    > xxxBSD, SunOS, HPUX, IRIX, and CYGWIN systems don't allow "special"
    >
    > baudrates at all.
    >
    >
    >
    > .NET, JVM, and Windows don't seem to have explicit call outs for bad
    >
    > rates -- just a generic port configured OK test.
    >
    > --
    >
    > Wulfraed Dennis Lee Bieber AF6VN
    >
    > HTTP://wlfraed.home.netcom.com/
    , Oct 26, 2012
    #4
  5. Guest

    Error is like cannot set special baud rate.
    But as I said pyserial set this speed without problem for ttyUSB0
    So it seems pyserial uses diefferent code depending of port type.
    I tried to simlink ln -s ttyACM0 ttyUSB0 but it does not work


    On Thursday, October 25, 2012 9:11:23 PM UTC+3, Dennis Lee Bieber wrote:
    > On Thu, 25 Oct 2012 04:09:56 -0700 (PDT), declaimed
    >
    > the following in gmane.comp.python.general:
    >
    >
    >
    > > I use Arduino 1280 and Arduino 2560 under Fedora 15.

    >
    > > 1280 creates ttyUSB0 port and can be set at 2500000 successfully.

    >
    > > 2560 creates ttyACM0 port and can be only set at speeds from list (no 250000) in pyserial. How to set 250000 to ttyACM0 port?? Need I patch kernel or python?

    >
    >
    >
    > You don't say what error you are receiving but looking at the source
    >
    > (serialposix.py) implies that it accepts nearly anything on Linux, and
    >
    > relies on the OS returning a success/failure if the value is allowed or
    >
    > not.
    >
    >
    >
    > xxxBSD, SunOS, HPUX, IRIX, and CYGWIN systems don't allow "special"
    >
    > baudrates at all.
    >
    >
    >
    > .NET, JVM, and Windows don't seem to have explicit call outs for bad
    >
    > rates -- just a generic port configured OK test.
    >
    > --
    >
    > Wulfraed Dennis Lee Bieber AF6VN
    >
    > HTTP://wlfraed.home.netcom.com/
    , Oct 26, 2012
    #5
  6. On 10/26/2012 04:01 PM, wrote:
    > Error is like cannot set special baud rate. But as I said pyserial
    > set this speed without problem for ttyUSB0 So it seems pyserial uses
    > diefferent code depending of port type. I tried to simlink ln -s
    > ttyACM0 ttyUSB0 but it does not work


    No the difference in how baud rate is set is most likely in the driver.
    pyserial just uses standard kernel apis and ioctls to control the device.
    Michael Torrie, Oct 26, 2012
    #6
  7. On Fri, 26 Oct 2012 15:01:43 -0700 (PDT), declaimed
    the following in gmane.comp.python.general:

    > Error is like cannot set special baud rate.
    > But as I said pyserial set this speed without problem for ttyUSB0
    > So it seems pyserial uses diefferent code depending of port type.


    Did you look at the source file?

    It doesn't know about "port type" -- it only differs by the OS in
    use. Given the OS, the same system calls are invoked regardless of what
    the device port "name" is.

    -=-=-=-=- serialposix.py (extract)
    if plat[:5] == 'linux': # Linux (confirmed)

    def device(port):
    return '/dev/ttyS%d' % port

    ASYNC_SPD_MASK = 0x1030
    ASYNC_SPD_CUST = 0x0030

    def set_special_baudrate(port, baudrate):
    import array
    buf = array.array('i', [0] * 32)

    # get serial_struct
    FCNTL.ioctl(port.fd, TERMIOS.TIOCGSERIAL, buf)

    # set custom divisor
    buf[6] = buf[7] / baudrate

    # update flags
    buf[4] &= ~ASYNC_SPD_MASK
    buf[4] |= ASYNC_SPD_CUST

    # set serial_struct
    try:
    res = FCNTL.ioctl(port.fd, TERMIOS.TIOCSSERIAL, buf)
    except IOError:
    raise ValueError('Failed to set custom baud rate: %r' %
    baudrate)
    -=-=-=-=-=-

    Practically all the other OS options (Mac, Sun, HP, Cygwin, etc.)
    produce

    def set_special_baudrate(port, baudrate):
    raise ValueError("sorry don't know how to handle non standard
    baud rate on this platform")


    Windows has its own module...
    --
    Wulfraed Dennis Lee Bieber AF6VN
    HTTP://wlfraed.home.netcom.com/
    Dennis Lee Bieber, Oct 27, 2012
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. debayan_p

    BAUD rate problem

    debayan_p, Jun 30, 2009, in forum: VHDL
    Replies:
    0
    Views:
    767
    debayan_p
    Jun 30, 2009
  2. oyinbo55

    Pyserial non-standard baud rate

    oyinbo55, Oct 1, 2009, in forum: Python
    Replies:
    3
    Views:
    1,456
    John Nagle
    Oct 2, 2009
  3. rjmccorkle
    Replies:
    5
    Views:
    340
    rjmccorkle
    Apr 25, 2011
  4. Replies:
    2
    Views:
    980
  5. sagar0205

    1200 baud rate generator

    sagar0205, Aug 8, 2012, in forum: VHDL
    Replies:
    0
    Views:
    525
    sagar0205
    Aug 8, 2012
Loading...

Share This Page