Это, кажется, работает хорошо. Ясно, что termios содержит скорости передачи, превышающие то, что будет обрабатывать ttyS0, но мой ttyUSB0 может их обработать. После tcsetattr необходимо вызвать tcgetattr, чтобы узнать, изменились ли значения.
Также кажется, что драйвер выполняет переключение CBAUD и CBAUDEX на основе значений скорости и скорости.
import os
import termios
import re
from functools import cmp_to_key
OffsetTermiosFlags = [
'iflag',
'oflag',
'cflag',
'lflag',
'ispeed',
'ospeed'
]
def CompareBaudrateAttributes(b1,b2):
p = re.compile("^B(\d{1,})$")
return int(p.match(b1).group(1))-int(p.match(b2).group(1))
def BuldListOfBaudrateAttributes():
attrs = dir(termios)
bauds = []
for attr in attrs:
if re.search("^B\d{1,}$",attr):
bauds.append(attr)
bauds = list(sorted(bauds,key=cmp_to_key(CompareBaudrateAttributes)))
return bauds
def GetBaudrateAttributeValue(name):
return getattr(termios,name)
def cfsetspeed(tios,speed):
tios[OffsetTermiosFlags.index('ispeed')] = speed
tios[OffsetTermiosFlags.index('ospeed')] = speed
return tios
def TestTTY(tty):
fd = os.open(tty,os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
if fd:
tios = termios.tcgetattr(fd)
print(tios)
bauds = BuldListOfBaudrateAttributes()
for baud in bauds:
if hasattr(termios,'cfsetspeed'):
termios.cfsetspeed(tios,getattr(termios,baud))
else:
cfsetspeed(tios,getattr(termios,baud))
termios.tcsetattr(fd,termios.TCSAFLUSH,tios)
tios = termios.tcgetattr(fd)
print(tios)
os.close(fd)
TestTTY("/dev/ttyUSB0")
[4, 0, 1214, 0, 14, 14, [b '\ x03', b '\ x1c', b '\ x7f', b '\ x15', b '\ x01', 0, 1 , b '\ x00', b '\ x11', b '\ x13', b '\ x1a', b '\ x00', b '\ x12', b '\ x0f', b '\ x17', b '\ x16', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ' ]]
[4, 0, 1215, 0, 15, 15, [b '\ x03', b '\ x1c', b '\ x7f', b '\ x15', b '\ x01', 0, 1 , b '\ x00', b '\ x11', b '\ x13', b '\ x1a', b '\ x00', b '\ x12', b '\ x0f', b '\ x17', b '\ x16', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ' ]]
[4, 0, 5297, 0, 4097, 4097, [b '\ x03', b '\ x1c', b '\ x7f', b '\ x15', b '\ x01', 0, 1 , b '\ x00', b '\ x11', b '\ x13', b '\ x1a', b '\ x00', b '\ x12', b '\ x0f', b '\ x17', b '\ x16', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ' ]]
[4, 0, 5298, 0, 4098, 4098, [b '\ x03', b '\ x1c', b '\ x7f', b '\ x15', b '\ x01', 0, 1 , b '\ x00', b '\ x11', b '\ x13', b '\ x1a', b '\ x00', b '\ x12', b '\ x0f', b '\ x17', b '\ x16', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ' ]]
[4, 0, 5299, 0, 4099, 4099, [b '\ x03', b '\ x1c', b '\ x7f', b '\ x15', b '\ x01', 0, 1 , b '\ x00', b '\ x11', b '\ x13', b '\ x1a', b '\ x00', b '\ x12', b '\ x0f', b '\ x17', b '\ x16', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ' ]]
[4, 0, 5300, 0, 4100, 4100, [b '\ x03', b '\ x1c', b '\ x7f', b '\ x15', b '\ x01', 0, 1 , b '\ x00', b '\ x11', b '\ x13', b '\ x1a', b '\ x00', b '\ x12', b '\ x0f', b '\ x17', b '\ x16', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ', b' \ x00 ' ]]