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

TL; DR : puedo abrir screeno puttyiniciar sesión en la terminal para el /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. Se supone que el código en el microcontrolador transmite cualquier carácter escrito en el teclado a la consola. Esto funciona bien con computadoras con Windows 7 y PuTTY. Con Ubuntu, se establece una conexión en la pantalla o la masilla, pero la salida es invisible; solo el cursor se mueve continuamente con cada pulsación de tecla (que es el mismo comportamiento con Windows 7).

Hacer hexdumprevela 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/ttyUSB0revela que los caracteres están ahí, excepto que aparecen en la notación de intercalación, ^H, ^E, así.

El código en el microcontrolador en sí no revela ningún indicio de problema. La matriz char rxBuffer recibe sus caracteres de RCREG1like so rxBuffer[rxCount] = RCREG1.

Información adicional (según lo solicitado) :

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

Salida dehexdump -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 destty -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 de 32 bits tampoco funcionó, el mismo resultado

Actualización 4/20 :

He colocado un código muy simple en main:

 while (1) {

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

Se supone que debe mostrar el valor hexadecimal RCREG1en la pantalla LCD. Para ala letra escrita en el teclado, Windows produce 61 como se esperaba, pero en Linux obtengo E1. Por extraño que parezca, los últimos 4 bits son correctos independientemente de lo que escriba. Pero para los 4 primeros obtengo valores generalmente de Da F. Entonces, para el valor hexadecimal 62, obtengo E2.

¿Cuál es la salida para hexdump -Ceso es un capital C?
¿ Para qué sirve la salida stty -aF /dev/ttyUSB0?
Esto puede ayudar a solucionar problemas: git.linformatronics.nl/gitweb/?p=cat_usbCable;a=summary Juegue un poco con la configuración en las líneas 31~35. Olvídese del archivo udev en ese archivo, eso resuelve el problema de los propietarios/permisos y nombres. EDITAR: esto no ayuda porque el script perl solo lee desde el puerto serie
Información adicional añadida según lo solicitado
Parece que la velocidad en baudios no está configurada correctamente. ¿Estás seguro de que la placa está configurada para 9600Bd? Debe haber configuraciones como Baudrate, cantidad de bits de datos, cantidad de bits de parada y tipo de paridad. Personalmente, me gusta la versión nativa de PuTTY Linux para jugar con estas configuraciones hasta que las haga bien, no use Wine con la versión de Windows.
Compruebe man sttyel significado de todas las banderas enumeradas.
Sí, 99% positivo, la tasa de baudios está configurada correctamente
Haga clic en Windows hasta que pueda verificar 9600 8N1 para el cual su caja de Linux parece estar configurada. 9600Bd 8 bits Sin paridad y 1 bit de parada. No soy usuario de Windows, pero seguramente ik se puede encontrar en algún lugar de la configuración.
Esa es exactamente la configuración predeterminada de Putty en Windows.
Sonda con un osciloscopio en la entrada y salida en serie, debería ser razonablemente fácil calcular el tiempo de bits. He usado un Arduino para eso en los viejos tiempos, hay un software de analizador lógico para Arduino. Busque en Google "analizador lógico compatible con SUMP para Arduino Andrew Gillham" y lxtreme.nl/ols Eso es ... si tiene uno de repuesto por ahí.
He agregado una actualización, por favor revise

Respuestas (2)

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

Por ejemplo: Enviar 'a' es 0x61 o 0b01100001 y está recibiendo 0xE1 o 0b11100001.

En formato serie, el bit0 se envía primero y el bit7 se envía al final, por lo que esto puede suceder si la configuración de su terminal no coincide. Por ejemplo, si el PIC envía 7 bits de datos, sin paridad, 1 bit de parada, pero Ubuntu espera 8 bits de datos, sin paridad, 1 parada, entonces Ubuntu registrará un bit extra y bit7 siempre estará 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

Su configuración de stty está desactivando el eco local (¿es eso lo que se pretendía?)

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

screen /dev/ttyUSB0 9600es exactamente como me estoy conectando, pero sin resultado. La tasa de baudios es 100% correcta. Lo he comprobado y vuelto a comprobar. Probé minicon pero no picocom, veré si ese funciona. Eco .. . .observación interesante. . . Creo que he intentado configurar el eco local, pero no estoy 100% seguro. Informare si averiguo algo
Hice una pequeña edición a mi pregunta, por favor revise
También creo que la configuración de su terminal no coincide con el objetivo. Está obteniendo datos y sabe que funciona con Windows/puTTY. Al leer todo su proyecto, desea deshabilitar el eco local.