On 2012-10-25, Dennis Lee Bieber <wlfr...@ix.netcom.com> wrote: > On Thu, 25 Oct 2012 04:09:56 -0700 (PDT), kura...@gmail.com 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 -- http://mail.python.org/mailman/listinfo/python-list