Python3.4 termios модификация - PullRequest
       18

Python3.4 termios модификация

0 голосов
/ 29 апреля 2018

Я пытаюсь выяснить, как использовать вызовы 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', b '\ x00', b '\ x00', b '\ x00', b '\ x00', 0, 0, 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 ', b' \ x00 ', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00']]

К tcsetattr [0, 0, 2239, 0, 4097, 4097, [b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', 0, 0, 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 ', b' \ x00 ', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00']]

Readback tcgetattr [0, 0, 6321, 0, 4097, 4097, [b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', 0, 0, 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 ', b' \ x00 ', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00', b '\ x00']]

1 Ответ

0 голосов
/ 04 мая 2018

Это, кажется, работает хорошо. Ясно, что 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 ' ]]

...