Je toujours utilisé pour mes programme l'objet String car je le trouve puissant.
Depuis que je me suis mis à l'arduino, je n’arrête pas d'entendre que il faut éviter d'utiliser String et privilégier char[].
OK, message reçu!
Mon code:
String sTrama;
void CapteursPresion()
{
double c;
char cDato[6];
String sHex;
byte PosX = 1;
//sTrama = "";
while (Serial2.available() > 0)//il y a quelque chose que le BT veut nous transmettre?
{
//lit le BT
sHex = String(Serial2.read(), HEX);//Attention: il ne met pas les 0 non significatifs
if (sHex.length() == 1) sHex = "0" + sHex;//ajoute les 0 non significatifs
sTrama += sHex; //Crée la trame
if (sTrama == OkDisa1 || sTrama == OkDisa2 || sTrama == OkDisa3) sTrama = ""; // efface les "OK+DISA*"
//Serial.println(sTrama);
if (sTrama.endsWith("0d0a")) //fin de la trame
{
//PrintTFT(42, 182, "Od0a", 2);
//Serial.println(sTrama);
// Analise la trame
if (sTrama.length() == 76)//le capteur transmet 2 differentes trames
{ //seulement la plus longue nous interesse
if (sTrama.startsWith(MACCaptPressAv)) PosX = 140;//La trame vient elle du capteur avant?
else if (sTrama.startsWith(MACCaptPressAr)) PosX = 0;//La trame vient elle du capteur arrière?
else
{
sTrama = "";
return;//on sort car la trame ne provient pas de nos capteurs
}
//PrintTFT(42, 182, String(PosX), 2);
cDato[0] = sTrama.charAt(56);// Preds les char de la pression
cDato[1] = sTrama.charAt(57);
cDato[2] = sTrama.charAt(54);
cDato[3] = sTrama.charAt(55);
cDato[4] = sTrama.charAt(52);
cDato[5] = sTrama.charAt(53);
c = strtoul(cDato, 0, 16);//Converte HEX to DEC.
if (c > 400000UL)//des fois il trouve de pressions incoerrentes!
{
sTrama = "";
return;
}
if (c < 190000UL && tft.readPixel(PosX + 10 , 259) != RED)//pression insuffisante tft.readPixel(posxa + 6 , posya)
{ // PneuAV sert pour eviter qu'il colorie le pneu à chaque fois
for (byte a = 41; a < 60; a++) tft.drawCircle(PosX + 60, 259, a, RED);//Colora le gomme in ROSSO
}
else if (c > 250001UL && tft.readPixel(PosX + 10 , 259) != BLUE)// Pression elevée
{
for (byte a = 41; a < 60; a++) tft.drawCircle(PosX + 60, 259, a, BLUE);//Colora le gomme in BLU
}
else if (c < 250000UL && c > 189000UL && tft.readPixel(PosX + 10 , 259) != GREEN) //pression optimale
{
for (byte a = 41; a < 60; a++) tft.drawCircle(PosX + 60, 259, a, GREEN);//Colora le gomme in VERDE
}
PrintTFT(42 + PosX, 180, String(float(c) / 100000.00), 2);//Ecrit la pression
cDato[0] = sTrama.charAt(64);// Preds les char de la Temperature
cDato[1] = sTrama.charAt(65);
cDato[2] = sTrama.charAt(62);
cDato[3] = sTrama.charAt(63);
cDato[4] = sTrama.charAt(60);
cDato[5] = sTrama.charAt(61);
c = strtoul(cDato, 0, 16);//Converte HEX to DEC
PrintTFT(112 + PosX, 300, String(int(c / 100)) + " ", 2);// Ecrit sur le TFT la Temperature
}
sTrama = "";//efface la trame
}
}
J'ai commencé avec la première partie:
while (Serial2.available() > 0)//il y a quelque chose que le BT veut nous transmettre?
{
//lit le BT
sHex = String(Serial2.read(), HEX);//Attention: il ne met pas les 0 non significatifs
LenTrama = strlen(sTrama);
if (strlen(sHex) == 1) //Ajoute le 0 non significatif
{
sTrama[LenTrama] = '0';
sTrama[LenTrama +1] = sHex[0];
sTrama[LenTrama +2] = '\0';
}else
{
sTrama[LenTrama] = sHex[0];
sTrama[LenTrama +1] = sHex[1];
sTrama[LenTrama +2] = '\0';
}
Je n'ai pas l’habitude d'utiliser char c'est pour cette raison que je vous demande si c'est bien ou pas.