caracteres recebidos na comunicação serial somente depois de pressionar enter


1

Eu tenho um PC simples para conectar a conexão usando serial (9600, sem paridade, 8 bits, sem fluxo hw) Abri o terminal simples * com teraterm) no PC e digite as chaves no teraterm e na placa, basta

 cat /dev/tty05

Eu vejo os caracteres pressionados no escopo, mas vejo os caracteres no console do quadro, somente depois de pressionar "enter" no teraterm (como se eles estivessem armazenados em algum driver FIFO no Linux que apenas entra em gatilhos)

por que os caracteres são recebidos no driver Linux apenas ao pressionar a tecla Enter? Existe alguma maneira de receber os caracteres sem pressionar a tecla Enter? (usamos algum protocolo de ascii para que não faça sentido enviá-lo como fictício) Obrigado por aconselhar, Ran

Respostas:


1

O catprograma está usando 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 catnão os está exibindo. Em vez de usar o gato, tente usar um emulador de terminal para ver os caracteres chegando.

O terminal provavelmente também está na cookedmoda. Você pode desativar isso executando o comando stty raw < /dev/tty05antes de executar o gato. Você pode redefinir a configuração com o comando stty sane < /dev/tty01, embora possa ser redefinida quando você fechar o terminal.

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

Se você deseja apenas ler os dados, é simples codificar um caractere de bloqueio re. anúncio na maioria dos idiomas. Isso pode ser executado em loop repetindo os caracteres à medida que eles chegam.

EDIT: O script python a seguir demonstra a leitura de caracteres de um dispositivo terminal, um por um. Isso requer que o terminal esteja no modo bruto para desativar o buffer no driver do terminal. O sttycomando pode ser usado para definir o terminal no modo bruto, mas este 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)

Obrigado, mas também recebo o mesmo resultado no código (vejo impressão somente depois de entrar), por quê? char myarray não assinado [10] = {0}; int fd; int n = 0; int rc = 0; sinalizadores int; fd = aberto (FPGA_SERIAL, O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) {perror ("Não foi possível abrir o serial"); } else {flags = fcntl (fd, F_GETFL); sinalizadores = 0; fcntl (fd, F_SETFL, sinalizadores); } tcflush (fd, TCIFLUSH); while (1) {n = leitura (fd, myarray, 1); {printf ("0x% x \ n", minha matriz [0]); } continuar; } rc = fechado (fd); return NULL;
ransh

@ransh Adicionei um programa python que lê caracteres de um terminal. Está configurado para ser executado a partir do terminal. Se quebrar, pode deixar o terminal no modo bruto, que pode ser desfeito pelo comando reset.
BillThor

1

Obrigado Bill, parece que você me indicou a resposta. Está relacionado ao "buffer de linha", também denominado modo canônico / não canônico, ou seja, também o código de leitura do uart pode suportar ou não o "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).
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.