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?
Tags:
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...
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por