43 lines
1.3 KiB
Diff
43 lines
1.3 KiB
Diff
Index: pyserial/serial/serialposix.py
|
|
===================================================================
|
|
--- pyserial/serial/serialposix.py (revision 455)
|
|
+++ pyserial/serial/serialposix.py (working copy)
|
|
@@ -36,26 +36,25 @@
|
|
def device(port):
|
|
return '/dev/ttyS%d' % port
|
|
|
|
- ASYNC_SPD_MASK = 0x1030
|
|
- ASYNC_SPD_CUST = 0x0030
|
|
+ TCGETS2 = 0x802C542A
|
|
+ TCSETS2 = 0x402C542B
|
|
+ BOTHER = 0o010000
|
|
|
|
def set_special_baudrate(port, baudrate):
|
|
+ # right size is 44 on x86_64, allow for some growth
|
|
import array
|
|
- buf = array.array('i', [0] * 32)
|
|
+ buf = array.array('i', [0] * 64)
|
|
|
|
# get serial_struct
|
|
- FCNTL.ioctl(port.fd, TERMIOS.TIOCGSERIAL, buf)
|
|
+ FCNTL.ioctl(port.fd, TCGETS2, buf)
|
|
+ # set custom speed
|
|
+ buf[2] &= ~TERMIOS.CBAUD
|
|
+ buf[2] |= BOTHER
|
|
+ buf[9] = buf[10] = baudrate
|
|
|
|
- # 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)
|
|
+ res = FCNTL.ioctl(port.fd, TCSETS2, buf)
|
|
except IOError:
|
|
raise ValueError('Failed to set custom baud rate: %r' % baudrate)
|
|
|