¿Cómo transmitir ASCII sobre RS-232?

2

quiero mostrar el nivel de voltaje a través de un potenciómetro sobre la línea de comunicación serial (RS-232) en ASCII puro. Estoy tratando de hacer esto utilizando en la Junta: DEMO9S08AW60E . Entonces, si el potenciómetro está en la posición del 50%, en Hterm debería mostrar lo siguiente:

050%

Ahora para esto (6 bytes) necesito poder convertir el decimal a ASCII y transmitir lo mismo a través de RS232. Parece que no puedo encontrar la lógica detrás de la conversión de decimal a ASCII.

preguntas:

  1. lógica para la conversión de decimal a ASCII?

  2. ¿Alguna idea mejor?

  3. si esta pregunta está fuera del alcance de este foro, estoy más que dispuesto a cambiarla al foro apropiado.

Considere el siguiente código:

if(TPM1SC_TOF == 1)
   {

     bob = ADC1RL;               
     dummy = (bob*100)/255;
     if((SCI1S1 & (1<<7)))
      { 
       SCI1D = dummy;  // at this point i would like to send the percentage of the 
                       //potentiometer value!
      }
     TPM1SC_TOF = 0; 
   }

¡Tome nota del diagrama de bloques adjunto!

    
pregunta sheetansh

3 respuestas

2

Esto es parte de una implementación minimalista de printf que he estado usando. Fue escrito originalmente por Georges Menie de www.menie.org, de acuerdo con el aviso de la GPL en la parte superior del archivo. Sin embargo, he estado modificando la implementación en su totalidad y, en realidad, no he estado al tanto de los cambios, por lo que probablemente debería usar el original que parece estar disponible en enlace

La función que se lista a continuación convierte un int en su cadena ascii. Puede intentar seguir el código y eliminar las partes que no necesita. Hay llamadas a impresiones en la función, que se ocupa del relleno y el manejo del ancho de la cadena. También hace el envío real de caracteres a través de putchar. No he incluido esa función aquí para reducir el desorden. Debe implementar su propia función para hacer eso aquí, que básicamente enviaría cada uno de los caracteres a través de su periférico serial / rs232 / uart hasta que encuentre \ 0.

static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase)
{
    char print_buf[PRINT_BUF_LEN];
    register char *s;
    register int t, neg = 0, pc = 0;
    register unsigned int u = i;

    if (i == 0) {
        print_buf[0] = '0';
        print_buf[1] = '
static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase)
{
    char print_buf[PRINT_BUF_LEN];
    register char *s;
    register int t, neg = 0, pc = 0;
    register unsigned int u = i;

    if (i == 0) {
        print_buf[0] = '0';
        print_buf[1] = '%pre%';
        return prints (out, print_buf, width, pad);
    }

    if (sg && b == 10 && i < 0) {
        neg = 1;
        u = -i;
    }

    s = print_buf + PRINT_BUF_LEN-1;
    *s = '%pre%';

    while (u) {
        t = u % b;
        if( t >= 10 )
            t += letbase - '0' - 10;
        *--s = t + '0';
        u /= b;
    }

    if (neg) {
        if( width && (pad & PAD_ZERO) ) {
            printchar (out, '-');
            ++pc;
            --width;
        }
        else {
            *--s = '-';
        }
    return pc + prints (out, s, width, pad);
}
'; return prints (out, print_buf, width, pad); } if (sg && b == 10 && i < 0) { neg = 1; u = -i; } s = print_buf + PRINT_BUF_LEN-1; *s = '%pre%'; while (u) { t = u % b; if( t >= 10 ) t += letbase - '0' - 10; *--s = t + '0'; u /= b; } if (neg) { if( width && (pad & PAD_ZERO) ) { printchar (out, '-'); ++pc; --width; } else { *--s = '-'; } return pc + prints (out, s, width, pad); }
    
respondido por el Chintalagiri Shashank
2

Así que cavé un poco para ti. Eche un vistazo a " Módulo periférico HCS08 de Freescale Referencia rápida ", que está vinculada desde página del producto . Hay una sección titulada" Uso de la Interfaz de Comunicaciones Seriales (SCI) para los microcontroladores de la familia HCS08 ". Y la subsección 2 de esa sección se titula" Ejemplo de código y explicación ". La placa de desarrollo ya tiene los circuitos necesarios para pasar de TTL UART a RS232. También hay ejemplos de código para el ADC. Entonces, solo tendrá que gestionar la conversión de sus lecturas de ADC a ASCII usando " los métodos habituales "como, por ejemplo, sprintf desde stdio.h.

La mitad de la batalla para familiarizarse con un nuevo controlador / procesador es descubrir dónde residen los ejemplos y el ecosistema de soporte. Espero que esto ayude. PD El archivo zip de ejemplos de código al que se hace referencia en la Referencia rápida es aquí (no la cosa más fácil de encontrar).

    
respondido por el vicatcu
1

Si bien es probable que pueda hacer esto con una función de la familia printf en esa plataforma, es informativo considerar cómo puede escribir su propia implementación. Por ejemplo:

  1. Encuentre una potencia de diez más grande que el valor máximo: en este caso, su deseo de ceros iniciales simplificará las cosas.

  2. Divida al disminuir las potencias de diez, para producir cada dígito de salida, reteniendo el resto para alimentar el siguiente cálculo.

  3. Convierta cada dígito de un valor a su representación ascii. Para decimal, esto es fácil ya que solo agrega el código ASCII del carácter '0' (que es 0x30 o 48 en decimal) al valor decimal. (Para los dígitos hexadecimales, debe manejar 0-9 y a-f en cláusulas separadas)

  4. Escriba los bytes resultantes en el puerto serie, generalmente esperando hasta que el búfer de transmisión de UART esté vacío antes de escribir cada uno.

El código del punto de partida que has agregado parece contemplar la conversión dentro de la verificación del búfer de transmisión; Eso no funcionará realmente para el envío de múltiples bytes. En su lugar, el bucle externo que realiza el muestreo de ADC tendría el bucle de conversión de decimal a ascii dentro de él, y dentro de ese punto en el que se genera un solo carácter sería un bucle mientras espera que el puerto serie esté listo para un caracter . (Es decir, asumiendo que no necesita hacer otras cosas mientras tanto, si lo hace, necesitará un búfer de transmisión administrado por software y algo como una rutina de servicio de interrupción para extraer caracteres en espera del búfer y enviarlos). cada vez que el puerto serie sea capaz de aceptar uno).

    
respondido por el Chris Stratton

Lea otras preguntas en las etiquetas