我正在尝试弄清楚如何使用termios调用来配置tty。下面我在玩波特率。我可以调用tcgetattr,更改值,在发送它们之前在打印中查看它们是否已更改。但是,tcsetattr和tcgetattr表明硬件没有获得它们。
我尝试更改为su,以防是权限问题,但这并没有什么不同。我看到可以通过编写一个特殊的termios结构来锁定和解锁termios结构。如何测试它以查看它是否已锁定,如果已锁定,如何解锁?
import os
import termios
def TestTTY(tty):
fd = os.open(tty,os.O_RDWR | os.O_NONBLOCK)
if fd:
if os.isatty(fd):
tios = termios.tcgetattr(fd)
print("From tcgetattr")
print(tios)
#try to set the baud to B38400
tios[2] &= ~termios.CBAUD
tios[2] |= termios.B38400
print("To tcsetattr")
print(tios)
termios.tcsetattr(fd,termios.TCSANOW,tios)
print("Readback tcgetattr")
print(termios.tcgetattr(fd))
os.close(fd)
TestTTY("/dev/ttyS0")从tcgetattr [0,0,6321,0,4097,4097,b'\x00',0,0,b'\x00',b'\x00',b'\x00',b'\x00']
tcsetattr [0,0,2239,0,4097,4097,b'\x00',0,0,b'\x00',b'\x00',b'\x00',b'\x00']
回读tcgetattr [0,0,6321,0,4097,4097,b'\x00',0,0,b'\x00',b'\x00',b'\x00',b'\x00']
发布于 2018-05-05 03:17:41
这似乎工作得很好。很明显,termios包含的波特率超出了ttyS0可以处理的范围,但是我的ttyUSB0可以处理它们。必须在tcsetattr之后调用tcgetattr,以查看值是否发生了更改。
似乎驱动程序还根据ispeed和ospeed值执行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']
[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']
[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']
[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']
[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']
[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']
https://stackoverflow.com/questions/50082324
复制相似问题