placa PICDEM y conexión de Linux a través de serie

2

TL; DR : puedo abrir la sesión screen o putty en el terminal al /dev/ttyUSB0 , pero los caracteres transmitidos son invisibles. ¿Cuál podría ser el posible problema?

Tengo una placa PICDEM con microcontroladores PIC18F87J11 y PIC18F8722, conectando la placa a través de un cable serial a USB a mi computadora portátil Ubuntu Linux. El código del microcontrolador debe transmitir a la consola cualquier carácter escrito en el teclado. Esto funciona bien con computadoras con Windows 7 y masilla. Con Ubuntu: hay una conexión establecida en pantalla o en masilla, pero la salida es invisible; solo el cursor se mueve de forma continua en cada pulsación de tecla (que es el mismo comportamiento con Windows 7).

Hacer hexdump revela lo siguiente:

skolodya@ubuntu:$ sudo hexdump -c /dev/ttyUSB0                                 
[sudo] password for xieerqi: 
0000000  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b
*
0001900  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \b  \n  \n
0001910  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n

cat /dev/ttyUSB0 revela que los caracteres están ahí, excepto que aparecen en la notación de caret, ^H , ^E , así.

El código en el microcontrolador no revela ningún indicio de problema. El array de caracteres rxBuffer recibe sus caracteres de RCREG1 como así rxBuffer[rxCount] = RCREG1 .

Información adicional (según se solicite) :

Actualmente, el código está escupiendo "HelloWorld string" ( TXREG1 = txStr[txCount] ).

Salida de hexdump -C /dev/tty | head -n 10

skolodya@ubuntu:$ hexdump -C /dev/ttyUSB0 | head -n 10                         
00000000  0f 01 17 0f 09 0c 0a 08  15 0c 0c 0f 01 17 0f 09  |................|
00000010  0c 0a 08 15 0c 0c 0f 01  17 0f 09 0c 0a 0f 01 17  |................|
00000020  0f 09 0c 0a 08 15 0c 0c  0f 01 17 0f 09 0c 0a 08  |................|
00000030  15 0c 0c 0f 01 17 0f 09  0c 0a 0f 01 17 0f 09 0c  |................|
00000040  0a 08 15 0c 0c 0f 01 17  0f 09 0c 0a 08 15 0c 0c  |................|
00000050  0f 01 17 0f 09 0c 0a 0f  01 17 0f 09 0c 0a 08 15  |................|
00000060  0c 0c 0f 01 17 0f 09 0c  0a 08 15 0c 0c 0f 01 17  |................|
00000070  0f 09 0c 0a 0f 01 17 0f  09 0c 0a 08 15 0c 0c 0f  |................|
00000080  01 17 0f 09 0c 0a 08 15  0c 0c 0f 01 17 0f 09 0c  |................|
00000090  0a 0f 01 17 0f 09 0c 0a  08 15 0c 0c 0f 01 17 0f  |................|

La salida de stty -aF /dev/ttyUSB0

skolodya@ubuntu:$ stty -aF /dev/ttyUSB0                                        
speed 9600 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

Actualización : probar una computadora diferente con Ubuntu 14.04 32 bits tampoco funcionó, el mismo resultado

Actualización 4/20 :

He colocado un código muy simple en el main :

 while (1) {

        while (!PIR1bits.RC1IF);  //Wait for a byte
        sprintf(txStr,"%X",RCREG1);
        LCDWriteLine(txStr,0);
        continue;

Se supone que muestra el valor hexadecimal de RCREG1 en la pantalla LCD. Para a , la letra escrita en las ventanas del teclado produce 61 como se esperaba, pero en Linux obtengo E1 . Curiosamente, los últimos 4 bits son correctos independientemente de lo que escribo. Pero para los 4 primeros, por lo general obtengo valores de D a F . Así que para el valor hexadecimal 62, obtengo E2 .

    

2 respuestas

4

Parece que Ubuntu está configurando bit7 en todos los caracteres que recibe.

Por ejemplo: el envío de 'a' es 0x61 o 0b01100001 y recibe 0xE1 o 0b11100001.

En formato de serie, bit0 se envía primero y bit7 se envía en último lugar, por lo que esto puede suceder si la configuración de su terminal no coincide. Por ejemplo, si el PIC está enviando 7 bits de datos, sin paridad, 1 bit de parada, pero Ubuntu espera 8 bits de datos, sin paridad, 1 parada, entonces Ubuntu se sincronizará en un bit adicional y bit7 siempre será alto.

Así que asegúrese de que la configuración de USB a serie / terminal coincida exactamente con la configuración de PIC UART. Espero que ayude. -Vince

    
respondido por el Vince Patron
2

Sus configuraciones de estado están deshabilitando el eco local (¿es eso lo que se pretendía?)

Intente usar minicom o picocom en lugar de stty.
También puedes probar 'screen / dev / ttyUSB0 9600'

    
respondido por el Quazil

Lea otras preguntas en las etiquetas