首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3.4termios修改

Python3.4termios修改
EN

Stack Overflow用户
提问于 2018-04-29 08:37:08
回答 1查看 358关注 0票数 1

我正在尝试弄清楚如何使用termios调用来配置tty。下面我在玩波特率。我可以调用tcgetattr,更改值,在发送它们之前在打印中查看它们是否已更改。但是,tcsetattr和tcgetattr表明硬件没有获得它们。

我尝试更改为su,以防是权限问题,但这并没有什么不同。我看到可以通过编写一个特殊的termios结构来锁定和解锁termios结构。如何测试它以查看它是否已锁定,如果已锁定,如何解锁?

代码语言:javascript
复制
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']

EN

回答 1

Stack Overflow用户

发布于 2018-05-05 03:17:41

这似乎工作得很好。很明显,termios包含的波特率超出了ttyS0可以处理的范围,但是我的ttyUSB0可以处理它们。必须在tcsetattr之后调用tcgetattr,以查看值是否发生了更改。

似乎驱动程序还根据ispeed和ospeed值执行CBAUD和CBAUDEX旋转。

代码语言:javascript
复制
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']

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50082324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档