Fala Pessoal, 

Estou fazendo um TCC e preciso utilizar o arduino para comunicar e decodificar um sinal vindo de uma balança no Arduino.

No manual da fabricante é dito que o pacote de dados enviado é:

[STX][PPPPPP][CR]

Onde

STX = ASCII para start of text

PPPPPP = peso enviado da balança

CR = ASCII para carriage return

estou recebendo o seguinte pelo monitor serial

63
246
54
235
147
143
229
0

Estou utilizando o seguinte sketch para obter isso pela serial:

// variable to hold the analog value

void setup() {
// open the serial port at 9600 bps:
Serial.begin(9600);
}

void loop() {
// read the analog input on pin 0:

if(Serial.available() > 0)
{

int buf = Serial.read();
int valor = buf ;

// print it out in many formats:

Serial.println(valor); // print as an ASCII-encoded decimal
}
// delay 10 milliseconds before the next reading:
delay(10);
}

Como eu decodifico isso?

Exibições: 2733

Responder esta

Respostas a este tópico

O mais estranho aí ´são os dados que estás recebendo pela serial. Nem batem com os valores da ASCII para o protocolo que você citou.

Os valores numéricos (peso) também vem em ASCII?

No caso, vais ter que jogar esses valores do Buffer para um vetor de caracteres e depois convertê-lo pra int com a função ATOI();

char    buffer[4]; 
if ( Serial.available() >= 3 ) {
buffer[0] = Serial.read();
buffer[1] = Serial.read();
buffer[2] = Serial.read();
buffer[3] = '\0';

int n;
n = atoi(buffer);
}

Exemplo de um código usado em um trabalho com um protocolo similar:

int input[4]; //buffer USB  - Variável Global

//------------- Protocolo Serial
// Formato:  [!][Id][Comando][x]

// lembrando quem em ASCII: 33 = "!" e 120 = "x"


void protocol(){
  memset(input, '\0', 5);
  byte inByte = '\0';
  delay(100);
  while(inByte != 33) {
    inByte= Serial.read(); // Wait for the start of the message
  }
  if(inByte == 33) {
    while(Serial.available() < 3){ // Wait until we receive 5 characters
    }
    for (int i=0; i < 3; i++) {
      input[i] = Serial.read(); // Read the characters into an array
    }
  }
  if (input[2] == 120) {
    Serial.println("ACK");
  }
  else {
    Serial.println("NACK");
    for (int i=0; i < 3; i++) {
      input[i] = 0; // Zera o vetor em caso de erro
    }
  }
}

No caso eu lia os dados direto em Decimal, mas pra converter um vetor de CHAR em um INT só usar a função ATOI();

Exemplo: Considerando que o meu input fosse um um vetor de Char e não de int...

char input[4];
...
...
int n;
n = atoi(input);

Pega o manual da balança e confirme a velocidade, quantos stop bits, start bits e se tem paridade na comunicação serial. Depois veja se há algum handshake com o host.

A partir daí, vc monta uma pilha com a informação recebida pega o que interessa e joga no LCD por exemplo.

Agora, se a lib serial do Arduino não usar IRQ e não tiver um buffer disponível vc terá problemas com a sincronia e fatalmente vai perder bits vindos pela serial e aí a palavra (byte) montada estará corrompida.

 

Boa sorte.

 

 

Olá Renato,

valeu pela dica...descobri já qual era o problema. Nunca tinha feito conexão deste tipo e descobri que precisava de um RS232-TTL Level converter como o MAX232. Estava ligando diretamente nos pinos RX/TX do arduino com perigo de até queima-lo pela voltagem RS232 vs a TTL utilizada pelo Arduino. Bastou colocar o max e tudo funcionou que é uma beleza. Errando e aprendendo rs.

Caramba véio!? Nem imaginei que vc não tivesse usando um conversor de nível! rs

Mas blz, é isso mesmo, errando...

 

É nessas horas que o cara tem q manjar mesmo pra "brincar" com o Arduino.

Um leigo NUNCA iria descobrir esse problema de diferença física no protocolo.

Mas o FTDI segurou bonito os 15v eính? Senão tinha fritado as USBs do PC. Sem falar do Arduino.

minha inexperiência foi por nunca ter tido feito conexão do tipo antes...mas valeu como aprendizado...ja tinha até lido sob re conversores de nível mas só fui lembrar dps...

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço