printrun-src/printrun/serialWrapper.py

changeset 15
0bbb006204fc
equal deleted inserted replaced
14:51bf56ba3c10 15:0bbb006204fc
1 # Serial wrapper around pyserial that adds support for custom baudrates (250000)
2 # on linux, when pyserial is < 2.7
3
4 # This code was copied from the pyserial 2.7 base code.
5 # Therefore, it follows the license used by pyserial which is the '3-clause BSD license'
6
7 from serial import *
8 import sys
9
10 if sys.platform.startswith('linux'):
11 import serial.serialposix
12
13 try:
14 import pkg_resources
15
16 old_version = float(pkg_resources.get_distribution("pyserial").version) < 2.7
17 except:
18 old_version = True
19
20 if old_version and not hasattr(serial.serialposix, "TCGETS2") and \
21 hasattr(serial.serialposix, "set_special_baudrate"):
22 # Detected pyserial < 2.7 which doesn't support custom baudrates
23 # Replacing set_special_baudrate with updated function from pyserial 2.7
24
25 TCGETS2 = 0x802C542A
26 TCSETS2 = 0x402C542B
27 BOTHER = 0o010000
28
29 def set_special_baudrate(port, baudrate):
30 # right size is 44 on x86_64, allow for some growth
31 import array
32 buf = array.array('i', [0] * 64)
33
34 try:
35 # get serial_struct
36 FCNTL.ioctl(port.fd, TCGETS2, buf)
37 # set custom speed
38 buf[2] &= ~TERMIOS.CBAUD
39 buf[2] |= BOTHER
40 buf[9] = buf[10] = baudrate
41
42 # set serial_struct
43 res = FCNTL.ioctl(port.fd, TCSETS2, buf)
44 except IOError, e:
45 raise ValueError('Failed to set custom baud rate (%s): %s' % (baudrate, e))
46
47 # We need to change the function inside the serialposix module otherwise, it won't
48 # be called by the code within that module
49 serial.serialposix.set_special_baudrate = set_special_baudrate

mercurial