caracteres recebidos em comunicação serial somente após pressionar enter

1

Eu tenho um PC simples para embarcar conexão usando serial (9600, sem paridade, 8 bits, sem fluxo de hw) Eu abri terminal simples * com teraterm) no PC e digite chaves no teraterm e na placa, eu apenas faço

 cat /dev/tty05

Eu vejo os caracteres pressionados no escopo, mas eu vejo os personagens no console da placa, só depois de pressionar "enter" no teraterm (como se eles estivessem armazenados em algum driver FIFO no Linux que só entra dispara)

por que os caracteres são recebidos no driver do Linux somente quando se pressiona a tecla enter? Existe alguma maneira de receber os caracteres sem pressionar a tecla enter? (nós usamos algum protocolo de ascii assim não faz sentido enviar isto como manequim) Obrigado por aconselhar Ran

    
por ransh 30.11.2014 / 16:32

2 respostas

1

O programa cat está usando o buffer de linha. É por isso que você não vê os resultados até que a tecla seja pressionada. O driver do terminal está vendo os caracteres quando eles chegam, mas cat não os exibe. Em vez de usar o cat, tente usar um emulador de terminal para ver os personagens chegando.

O terminal provavelmente também está em cooked morde. Você pode desabilitar isso executando o comando stty raw < /dev/tty05 antes de executar o cat. Você pode redefinir a configuração com o comando stty sane < /dev/tty01 , embora possa ser redefinido quando você fechar o terminal.

É comum que os programas que usam o terminal leiam os caracteres à medida que chegam. Os emuladores de terminal são um deles e são mais apropriados para uso no seu caso.

Se você quiser apenas ler os dados, é simples codificar um caractere de bloqueio. anúncio na maioria dos idiomas. Isso pode ser executado em um loop ecoando os caracteres conforme eles chegam.

EDIT: O seguinte script python demonstra a leitura de caracteres de um dispositivo de terminal, um por um. Isso requer que o terminal esteja no modo raw para desativar o buffer no driver do terminal. O comando stty pode ser usado para definir o terminal no modo raw, mas esse programa faz isso.

#!/usr/bin/python
import termios
import tty
with open('/dev/tty', 'rb') as f:
    fd = f.fileno()
    old_settings = termios.tcgetattr(fd)
    print "Enter characters (q to quit)"
    tty.setraw(fd)
    ch = ''
    try:
        while ch != 'q':
            ch = f.read(1)
            if not ch:
                print "End of file"
                break
            print "Read a character:", ch, '\r'
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
    
por 30.11.2014 / 19:14
1

Obrigado Bill, Parece que você me direcionou para a resposta. Está relacionado com o "buffer de linha", também denominado modo canónico / não canónico, isto é, também o código de leitura de uart pode suportar ou não suportar "buffer de linha":

   In canonical mode:
   * Input is made available line by line.  An input line is available
     when one of the line delimiters is typed (NL, EOL, EOL2; or EOF at
     the start of line).  Except in the case of EOF, the line delimiter
     is included in the buffer returned by read(2).

   * Line editing is enabled (ERASE, KILL; and if the IEXTEN flag is
     set: WERASE, REPRINT, LNEXT).  A read(2) returns at most one line
     of input; if the read(2) requested fewer bytes than are available
     in the current line of input, then only as many bytes as requested
     are read, and the remaining characters will be available for a
     future read(2).
    
por 30.11.2014 / 20:59

Tags