Serial.print() ASCII

Olá pessoa =D. É o seguinte, eu to fazendo um código de transmissão RF e quero, por enquanto, apenas transmitir textos. Porém no meu serial monitor recepitor, não está aparecendo o texto em si - ACSII(texto humano)- mas sim, em hexadecimal - veja a imagem. Queria saber se há alguma maneira de mostrar o texto que eu quero ao invés de códigos numéricos.

Bota a parte do código, pois parece q vc ta mandando um serial.print([variavel],HEX);

É isso mesmo, mas tentei com outras maneiras e também não consegui .-.

Mas, de qualquer formar, está postado o código do receptor.

#include <VirtualWire.h>

int LED = 13;
void setup()
{
  Serial.begin(9600);
  Serial.println("setup");
  vw_set_ptt_inverted(true);
  vw_setup(2000);
  vw_set_rx_pin(9);
  vw_rx_start();
    pinMode(LED, OUTPUT);  
}
void loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
    digitalWrite(13, LOW);
    if (vw_get_message(buf, &buflen))
    {
	int i;

        digitalWrite(LED, HIGH);
	Serial.print("Got: ");
	
	for (i = 0; i < buflen; i++)
	{
	    Serial.print(buf[i], HEX);
	    Serial.print(' ');
	}
	Serial.println();
        digitalWrite(LED, LOW);
    }
}
Serial.print((char)buf[i] );

e hello para ti também. :slight_smile:

Muda o tipo de variável de uint8_t para char na buf[]

Boas,

Ora aqui esta uma boa duvida ... que já tenho a algum tempo ... nunca sei que tipo de variável usar

o tipo de variável char não é a mesma coisa que um signed int ? ou seja de -128 a + 127, e sendo uint8_t a mesma coisa que um BYTE (0-255)

e visto que a tabela ascii "normal" é de 0 a 127, não vejo que diferença era ter ... ou estou enganado ?

Cpts

Zé tretas

o tipo de variável char não é a mesma coisa que um signed int ?

Nao.Um signed int armazena 16 bits que vai de -32766 a 32765 por ser signed. Se fosse unsigned ia de 0 a 65535 por omitir os valores negativos.
Já um uint8_t é um int unsigned mas de apenas 8 bits.
Na pratica o que o uint8_t ocupa é o mesmo que o unsigned char.
Apesar de existir casos onde usar os dois é irrelevante quando se quer armazenar caracteres o ideal é usar variaveis do tipo char, pois se quiseres usar Strings basta colocar o caracter terminador no fim do vector de chars.
Se usasses variaveis do tipo byte depois se quiseres trata-lo como um char tens de lhe fazer um cast para ele te dar o codigo ascii correspondente ao valor hex que ele tem armazenado.
Se declares um char assim :

char a = 0;

Ela é signed por defeito ou seja inclui valores negativos

uint8_t, byte e unsigned char são a mesma coisa...

Eu uso esta regra para definir o tipo das minhas variáveis:

É texto? Sim: char, Não: Seguinte.
Pode ser negativo? Sim: signed, Não: unsigned.
Cabe de -127 a 127 ou 0 a 255? Sim: char, Não: Seguinte.
Cabe de -32000 a 32000 ou de 0 a 65000?: Sim: int, Não: Seguinte.
Cabe de ....

Apesar de perceber o motivo pelo qual se criam estas nomenclaturas de uint8_t ou byte ou ui8 e por aí adiante, mas como 99,9% do meu código não é para portar por ser normalmente específico da plataforma que estou a usar, normalmente uso os tipos base do C para o que quero. Confunde muito menos.

Fala aí pessoal. Não pude testar o código no final de semana, pois o laboratório da minha escola estava fechado. Mas hoje, quando testei a dica do nosso amigo bubulindo. Funcionou =D, mas ficou com "sujeira" vindo junto na transmissão.

Define sujeira...

Pixes:
Fala aí pessoal. Não pude testar o código no final de semana, pois o laboratório da minha escola estava fechado. Mas hoje, quando testei a dica do nosso amigo bubulindo. Funcionou =D, mas ficou com "sujeira" vindo junto na transmissão.

Acho que o que você define como "sujeira", deve ser alguns bytes, que não são apresentados como caracteres ALFA-NUMÉRICOS + PONTUAÇÃO, eu aconselho você a colocar
o código assim.

Serial.print((char)buf[i] );
Serial.print(" ");
Serial.print(buf[i] );

Você verá que esses bytes, não devem estar entre 20 e 7E que são os caracteres imprimíveis...