UART: ¿Valor hexadecimal de salida sin máscaras de bits y turnos? [cerrado]

-3

Pregunta fácil:

Estoy trabajando en la depuración de una matriz de algunos valores hexadecimales. ¿Existe una forma conveniente de generar un valor hexadecimal a través de una línea UART, sin recorrer cada valor hexadecimal y usar máscaras de bits y desplazamientos para transmitir cada bit?

Estoy tratando de evitar tener que escribir la rutina de bucle, si hay alguna otra forma que no conozca. Tal vez hay algo de magia C que no sé? ¿Algún truco aquí?

Ejemplo de matriz:

char MyArray[5];

MyArray[0] = 0x55;
MyArray[1] = 0x55;
MyArray[2] = 0x55;
MyArray[3] = 0x55;
MyArray[4] = 0x55;

Mi resultado deseado es solo UartSend (MyArray [0]), en lugar de cambiar cada bit y enviar un bit a la vez. ¿Hay algún truco para hacer esto?

Intentando ahorrarme una hora de codificación en el bucle para enmascarar esto.

    
pregunta Leroy105

2 respuestas

0

Usa printf ()

  

printf ("OutBuf =% 02X% 02X% 02X% 02X% 02X% 02X \ n \ r", outbuf [0],   outbuf [1], outbuf [2], outbuf [3], outbuf [4],   outbuf [5]);

uchar outbuf [6]; // es un arrray

    
respondido por el Marko Buršič
1
  

¿Existe una manera conveniente de generar un valor hexadecimal sobre una línea UART, sin recorrer cada valor hexadecimal y usar máscaras de bits y desplazamientos para transmitir cada bit?

A UART no le importa el formato de los datos. Solo envialo. ¿Qué está preguntando realmente aquí, cómo hacer que una salida UART aparezca como ASCII en un programa de terminal?

Eso es bastante trivial, solo usa una tabla de búsqueda en base a nibble. Ejemplo:

const char HEX [16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
uint8_t array [5] = {0x11,0x22,0x33,0xAB,0xFF};

for(size_t i=0; i<sizeof array/sizeof *array; i++)
{
  uart_send(HEX[(array[i] >> 4) & 0x0F]);
  uart_send(HEX[array[i] & 0x0F]);
}
  

char MyArray[5]; ... MyArray[0] = 0x55;

Debería nunca usar el tipo char para almacenar otra cosa que no sean letras de caracteres. La razón es porque tiene una firma definida por la implementación, por lo que no se puede saber de compilador a compilador si está firmado o no. Si está firmado, los valores hexadecimales de 0x80 o superiores causarán todo tipo de errores desagradables.

Los programas de sistemas integrados profesionales siempre usan los tipos de stdint.h , en este caso sería uint8_t

    
respondido por el Lundin

Lea otras preguntas en las etiquetas