Si envía un solo valor de 8 bits de un UART a otra computadora, solo será un valor binario. Digamos que tienes un número como 52.
char data = 52; // or char data = 0x34;
y envió los datos a través del UART;
TXREG = data;
while(PIR1.TXIF==0);
Si conectó un programa de terminal como RealTerm , configúrelo para recibir sus datos y configure la opción Mostrar como Hex [espacio ] mostrará el valor en hexadecimal como:
34
ya que el hex 34 (3 * 16 + 4) es lo mismo que 52. Si cambia la pantalla a ASCII, en cambio, solo mostrará un 4 ya que el código ASCII para 4 es 0x34, que es una representación incorrecta para Valor que se envió.
A continuación, puede enviar el valor de 8 bits en hexadecimal, un mordisco de 4 bits a la vez:
char data = 52; // or char data = 0x34;
TXREG = (data & 0xf0) >> 4;
while(PIR1.TXIF==0);
TXREG = data & 0x0f;
while(PIR1.TXIF==0);
Esto podría ponerse en un bucle, pero es más fácil de ver de esta manera.
Para mostrar los caracteres, una vez más necesitas poner RealTerm en modo Hex [espacio].
Los nibbles se mostrarán en la pantalla como 03 04. Ya que estos no son dígitos ASCII correctos, no se mostrarán correctamente en la configuración de visualización ASCII.
Si desea ver los caracteres ASCII reales, deberá agregar un carácter '0' (0x30) a cada valor, como este:
char nibble;
nibble = ((data & 0xf0) >> 4) + '0';
Sin embargo, esto solo funcionará para los valores 0-9; los valores hexadecimales A-F no se mostrarán correctamente ya que 9 y A no están uno al lado del otro en el alfabeto ASCII. Así que tienes que agregar una sentencia if para manejar esto:
char data = 52; // or char data = 0x34;
char nibble;
nibble = ((data & 0xf0) >> 4) + '0';
if (nibble > '9') nibble += 'A' - '9';
TXREG = nibble;
while(PIR1.TXIF==0);
nibble = (data & 0x0f) + '0';
if (nibble > '9') nibble += 'A' - '9';
TXREG = nibble;
while(PIR1.TXIF==0);
Ahora los dígitos aparecerán en la pantalla ASCII como 34.
Hay una forma más de hacer esto, y es enviar el valor como caracteres decimales. Eso requiere una conversión del número binario 52 (o 0x34) a una representación de cadena equivalente del número decimal, en este caso "52". Hay varias formas de hacer esto en C, una es itoa (entero a ASCII) y la otra es sprintf. Cualquiera de los dos necesitará un poco de código de biblioteca, lo cual, dependiendo del tamaño de flash de su microcontrolador, puede o no ser un problema.
Aquí está cómo hacerlo usando sprintf:
char buf[5];
char data = 52; // or char data = 0x34;
unsigned char i;
sprintf(buf,"%d",data);
i = 0;
while (buf[i]!='char data = 52; // or char data = 0x34;
')
{
TXREG = buf[i++];
while(PIR1.TXIF==0);
}
El printf convierte el valor en datos a decimal (debido al% d) y lo almacena como caracteres ASCII en la matriz de caracteres buf. El tamaño máximo del número es de cuatro caracteres, ya que un número de 8 bits firmado puede ir de -127 a 128. Las cadenas C terminan con un '\ 0' (nulo), por lo que la matriz debe tener cinco elementos. El bucle while luego envía caracteres hasta que se alcanza el carácter nulo.