// SENAI-SP
// Pós Graduação em Sistemas Embarcados
// Disciplina: Protocolos de Comunicação
// Aluno: Marcos Flávio Soares
// Turma 11SE - 10.09.2022
// Exercício 2 - Mestre-escravo com tamanho fixo, timeout e endereço no último byte
// Formato da mensagem(5 bits): |comando|Param1|Param2|CS-checksum|ENDereço|
// Mensagem de teste: !"#fA
#define TIMEOUT 11 // timeout de 11ms (Com o delay de 10ms, às vezes passa, às vezes falha)
int i = 0;
unsigned long ti, t; // Tempo a ser medido
char endereco= 'A';
char rx[6] = {0};
void setup()
{
pinMode(3, OUTPUT);
digitalWrite(3, LOW);
Serial.begin(9600);
Serial.println("Exercicio 2 Marcos");
}
void loop()
{
uint16_t ret = RX();
if(ret == 5)
{
// timeout
Serial.println("Erro de Timeout");
Serial.println("Mensagem Abortada!"); //Eco
}
else if(ret == 3)
{
// Tratamento do vetor rx[]
Serial.println("OK");
Serial.println(rx); //Eco
}
else if(ret == 2)
{
Serial.println("Erro de CS");
Serial.println(rx); //Eco
}
else if(ret == 1)
{
Serial.println("Erro de Endereco");
Serial.println(rx); //Eco
}
delay(200);
i = (i+1) % 2;
digitalWrite(3, i);
}
uint16_t RX()
{
int16_t n;
if (Serial.available() > 0)
{
ti = millis();
n = 0;
while(n < 5)
{
delay(10); // Atraso incluído para provocar o timeout na simulação;
if (Serial.available() > 0)
{
t = millis(); // Recebeu um caractere >> atualiza o tempo final
//DEBUG
//Serial.println(t);
//Serial.println(ti);
//Serial.println(t - ti);
//Serial.println(TIMEOUT);
if ((t - ti) >= TIMEOUT)
{
while (Serial.available() > 0) // esvazia o buffer serial
{
Serial.read();
rx[n] = 0;
n++;
}
return 5;
}
rx[n] = Serial.read();
if(rx[n] < ' ')
{
return 4;
}
n++;
ti = millis(); // Restaura o tempo inicial depois de receber o caractere
}
}
if(rx[4] == endereco)
{
if(rx[3] == (rx[0]+rx[1]+rx[2]))
{
return 3; // pacote ok
}
else
{
return 2; //erro de checksum
}
}
else
{
return 1; // erro de endereco
}
}
else
{
return 0; //semdado
}
}