Como posso definir os bits de paridade ao usar a tela para acessar uma porta serial

5

Eu normalmente uso a tela (1) para abrir uma porta serial com o comando:

sudo screen /dev/ttyUSB2 115200

Eu tentei configurar o parenb (e várias outras coisas) usando o seguinte comando:

sudo screen /dev/ttyUSB2 115200,cs8,parenb,-parodd,-cstopb

No entanto, o sistema não parece respeitar isso. Aqui estão as configurações conforme relatadas por stty enquanto estou na tela com o comando acima:

$ sudo stty -F /dev/ttyUSB2 -a
speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^H; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 100; time = 2;
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

Observe o -parenb apesar do fato de que eu o habilitei na linha de comando.

Se eu fizer a alteração manualmente para ttyUSB2, ela não será respeitada após (nem enquanto) executar a tela .

Definir parênteses:

$ sudo stty -F /dev/ttyUSB2 parenb

Verifique seu valor:

$ sudo stty -F /dev/ttyUSB2 -a
speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^H; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 100; time = 2;
parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

Você pode ver que a parenb está definida corretamente.

Executar tela :

$ sudo screen /dev/ttyUSB2 115200,cs8,parenb,-parodd,-cstopb

Verifique novamente a parenb:

$ sudo stty -F /dev/ttyUSB2 -a
speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^H; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 100; time = 2;
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

Oops, voltou a ser -parenb .

O que está acontecendo?

Como eu modificaria esse comando para usar paridade par (especificamente 8e1 em vez do padrão 8n1)?

OS é o Ubuntu 12.04.5 LTS com o mais recente HWE.

    
por Tom Hennen 12.09.2014 / 19:40

2 respostas

3

Para encurtar a história, parece que screen não suporta a configuração desses sinalizadores. A alternativa seria executar stty para definir as flags enquanto a tela estiver conectada à porta, como você fez. Alternativamente, você poderia executar kermit ou outro programa de emulador de terminal dentro de uma sessão de linha de comando de tela convencional, em vez de ter conexão de tela diretamente para a porta serial.

O código-fonte screen está no link . Parece que o arquivo de interesse é tty.sh . Este é o shell script que é executado durante o processo de compilação para produzir "tty.c". tty.c contém o código para acessar portas seriais.

A função SttyMode() parece ser o que analisa as opções tty e define o modo tty. Parece-me que lida com um conjunto pequeno e fixo de opções. "parenb" e "parodd" não estão entre eles.

Parece que seria fácil para um desenvolvedor experiente com C adicionar suporte a essas opções, se isso for uma opção para você.

    
por 12.09.2014 / 21:51
5

Experimente sudo screen /dev/ttyUSB2 115200,cs8,parenb,-parodd,-cstopb

De a página man do stty :

  • csN - define o tamanho do caractere como N bits, N em [5..8]
  • [-] parenb - gera bit de paridade na saída e espera bit de paridade na entrada
  • [-] parodd - define paridade ímpar (mesmo com '-')
  • [-] cstopb - usa dois bits de parada por caractere (um com '-')
por 12.09.2014 / 19:55