Diferentes caracteres ASCII en RS 232

Estoy trabajando en la comunicación UART de PIC18F4520. Intenté simular el código en ISIS proteus y luego también verifiqué el resultado en tiempo real. Una cosa que me confunde bastante es que los caracteres que obtengo de los dos, es decir, la simulación y el experimento, no son los mismos. No tengo confirmación de esto, pero aún me pregunto si es posible que para cualquier otra máquina, los caracteres ASCII se interpreten de manera diferente. Es posible..?

void main(void)
{
    unsigned char r;
    TRISB=0;
    // configure USART
    OpenUSART( USART_TX_INT_OFF  &
         USART_RX_INT_OFF  &
         USART_ASYNCH_MODE &
         USART_EIGHT_BIT   &
         USART_CONT_RX     &
         USART_BRGH_HIGH,
         5 );
    r='y';
    while(1)
    {
        putcUSART(r);    
        while (BusyUSART());            
        r=ReadUSART();
        PORTB=r;
    }
    CloseUSART();
}

El resultado se ha mostrado en esta instantánea:

ingrese la descripción de la imagen aquí

¿Puedes compartir tu código y los resultados que obtuviste de la simulación y el experimento? Además, ¿qué software usaste en el experimento?
siguiente es mi código. Estoy enviando una 'y' continuamente mientras espero una entrada de la PC. pero lo que obtengo en la PC es este extraño personaje que se repite.
El código comienza: #include <p18F4520.h> #include <usart.h> void main(void) { unsigned char r; TRIB=0; // configurar USART OpenUSART( USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, 5 ); r='y'; l: while(1) { putcUSART(r); mientras (OcupadoUSART()); r=LeerUSART(); PUERTOB=r; } ir a l; CerrarUSART(); } Finaliza el código.
Yo, puede editar su pregunta;) agregue el código a su pregunta, prefijado con cuatro espacios en cada línea para que se resalte.
el resultado se ha mostrado en esta instantánea; farm9.staticflickr.com/8113/8644316549_b60df31134_s.jpg
¿ Seguro de todo &para OpenUSART? Usualmente uso a |to o bits en un byte, pero no estoy familiarizado con PIC y esta llamada de función.

Respuestas (4)

No, dado que es un estándar de codificación, si se establece en ASCII, los valores hexadecimales en su mayoría deben interpretarse de la misma manera en cualquier máquina. Los caracteres imprimibles AZ, az y numéricos deberían ser confiables, pero como Chris señala en los comentarios, puede haber diferencias con otros códigos y el conjunto extendido.

Si obtiene resultados diferentes entre la simulación y la vida real, es probable que haya configurado las cosas incorrectamente. Verifique sus tasas de baudios, bits de parada/paridad, protocolo de enlace y también que el programa de terminal esté realmente configurado en ASCII (es decir, no se muestra en hexadecimal/octal/binario)

Como referencia, aquí hay una tabla ASCII .

EDITAR: ahora que ha agregado el código, veo otro problema. Establece la variable r = 'y', pero luego lee el UART y almacena el resultado en esta variable, sobrescribiéndola. Esto significa que el código solo enviará un correo electrónico yen el primer bucle. Use una variable separada para leer si no quiere que esto suceda (o reinicie dentro ydel ciclo cada vez)

Algo como esto:

void main(void)
{
    unsigned char r;
    unsigned char t;

    TRISB=0;
    // configure USART
    OpenUSART( USART_TX_INT_OFF  &
         USART_RX_INT_OFF  &
         USART_ASYNCH_MODE &
         USART_EIGHT_BIT   &
         USART_CONT_RX     &
         USART_BRGH_HIGH,
         5 );
    t='y';
    while(1)
    {
        putcUSART(t);      // Changed variable to t to avoid overwriting on read    
        while (BusyUSART());            
        r=ReadUSART();         // Read into r
        PORTB=r;
    }
    CloseUSART();
}
De acuerdo. Gracias por la respuesta. Pero, ¿crees que esto es un error que puede conducir a estos personajes extraterrestres?
Esto no es totalmente preciso. El rango imprimible de ASCII de 7 bits puede ser estándar, pero la respuesta a códigos de control no imprimibles por debajo de 32 y códigos de 8 bits con el conjunto MSB no es completamente estándar. E incluso en el rango imprimible, hay posibles traducciones de terminales y diferentes respuestas en el contexto de los códigos de escape.
@Chris: buen punto, ajustaré un poco la redacción.

En primer lugar, ese código me parece que emite 1 'y', y luego se lee, obtiene no sé qué y genera lo que lee. ¿ReadUSART bloquea la espera de un carácter?

En segundo lugar, ¿está seguro de sus cálculos de velocidad en baudios? No conozco la plataforma, por lo que no puedo verificarlo, pero si su terminal serial está mal configurado en el mundo real, eso podría causar fácilmente este tipo de comportamiento.

Gracias por responder. A continuación se muestra la instantánea tomada de la guía de la biblioteca MPLAB C18. farm9.staticflickr.com/8109/8646371838_d673b83303_m.jpg

El personaje extraño esÇ . Es el código C7 (11000111) en ISO 8851-1. El código para yes 79 (01111001). Si agregamos los bits de inicio y parada, obtenemos 0110001111 y 0011110011. Y, por supuesto, el nivel de inactividad en RS232 corresponde a 1.

Puede ver que hay similitudes en el nivel binario, por lo que si de alguna manera la recepción de los bits de inicio y parada no es confiable o lo que sea, podría explicar cómo se yconvierte en Ç.

Un bistream correcto de espalda con espalda yyyyse parece a:

0011110011001111001100111100110011110011...

¡Ahora debe comprender que en RS-232 puede haber un problema de sincronización! La única información de trama es el bit de inicio 0 y el bit de parada 1. Si el bit de inicio no se recibe correctamente y hay una transmisión continua consecutiva, la única forma en que el receptor puede detectar que está en error es si recibe un 0 en un punto donde se espera el bit de parada. Si se transmite una variedad de caracteres, es de esperar que finalmente se fije en el encuadre correcto. Si hay una pausa en la transmisión, por supuesto, eso también ayuda.

En una secuencia repetitiva de 10 bits, cualquier 0 que esté precedido por un 1 podría ser el bit de inicio. Entonces, en una secuencia repetitiva de y, asumiendo 8 bits, sin paridad y 1 bit de parada, hay dos posibles inicios de trama:

0011110011001111001100111100110011110011...
      ^--------^ 'g'
          ^--------^ 's'     

Entonces, suponiendo un receptor correcto y un enlace confiable (excepto por la falta del bit de inicio), una secuencia de ypodría malinterpretarse como una secuencia de g. No necesitas un hardware malo para conseguir este error.

Ahora gtiene el código 67, que no es C7, pero algún otro problema tal vez pueda explicar ese, y también el hecho de que estaba obteniendo constantemente el carácter C7.

Tengo mi problema resuelto, supongo. Hubo un problema con la placa de desarrollo y cuando cambié la placa, obtuve los datos sin fallas. Gracias a todos.