Bonjour,
mon projet comporte une carte Mega, un shield ethernet et une carte teleinfo rs232. Après avoir un peu galéré
au début (a cause du bug String/Free), j'ai tout réécrit pour me passé des String et depuis cela fonctionne inpec
ci dessous une partie de mon projet (seulement le module teleinfo)
#include <HardwareSerial.h>
#include <Statistic.h>
#define L_MAX_MSG 25
char teleinfoInputString[L_MAX_MSG+1];
int teleinfoNbCarRec;
unsigned long teleinfoLastChange = 0;
char szHCHC[L_HCHX+1] = "";
char szHCHP[L_HCHX+1] = "";
char szPTEC[L_PTEC+1] = "";
char szLastPAPP [L_PAPP+1] = "";
char szLastIINST [L_IINST+1] = "";
Statistic statPAPP;
Statistic statIINST;
//String sLPAPP = "";
//String sLIINST = "";
void setupTeleinfo()
{
LOGINFO(CR"******************************************"CR);
LOGINFO("Initializing Teleinfo... ");
//init
TELEINFO_SERIAL.begin(1200);
//configure port 1 en 7/1/e
UCSR1C = B00100100;
statPAPP.clear();
statIINST.clear();
teleinfoInitBufRec();
teleinfoLastChange = millis();
pinMode(recPin, OUTPUT);
digitalWrite(recPin, HIGH);
LOGINFO("OK");
LOGINFO(CR"******************************************"CR);
}
// init buffer de reception
void teleinfoInitBufRec(void)
{
teleinfoNbCarRec = 0;
teleinfoInputString[0] = 0;
}
//ajoute un caractere dans le buffer de reception
void teleinfoAddCar(char c)
{
teleinfoInputString[teleinfoNbCarRec++] = c;
teleinfoInputString[teleinfoNbCarRec] = 0;
}
int teleinfoBufRecLengh(void)
{
return strlen(teleinfoInputString);
}
char *teleinfoBufRec(void)
{
return teleinfoInputString;
}
void checkTeleinfo()
{
teleinfoLec(true);
//chien de garde teleinfo
unsigned long ulNow = millis();
if(ulNow>teleinfoLastChange && ((ulNow - teleinfoLastChange)>5000))
{
ErreurVie(VID_ERREUR_TELEINFO,true);
}
else if(ulNow>teleinfoLastChange)
{
ErreurVie(VID_ERREUR_TELEINFO,false);
}
//rebooclage
else if(ulNow<teleinfoLastChange)
{
teleinfoLastChange = ulNow;
}
}
void teleinfoLec(boolean Tout)
{
static byte recCours = false;
while (TELEINFO_SERIAL.available())
{
// get the new byte:
char inChar = (char)TELEINFO_SERIAL.read();
if(inChar <=4)
{
teleinfoInitBufRec();
recCours = false;
}
else
{
if(inChar == 0x0a) // debut de group
{
teleinfoInitBufRec();
recCours = true;
}
else if(recCours == true && inChar == 0x0d) // fin de group
{
if(checkSumOK(teleinfoBufRec()))
{
traitMesssage(teleinfoBufRec());
}
else
{
LOGDEBUG2PAR("Rec message incorrect !! (%d)(%s)"CR,strlen(teleinfoInputString),teleinfoInputString);
}
teleinfoInitBufRec();
recCours = false;
// si une trame complete et demande de schedule
if(Tout == false)
{
return ;
}
}
else if(recCours == true)
{
if(teleinfoNbCarRec>=L_MAX_MSG)
{
LOGINFO2PAR("Rec message incorrect !! (%d)(%s)"CR,strlen(teleinfoInputString),teleinfoInputString);
// trame trop longue init
teleinfoInitBufRec();
recCours = false;
}
else
{
teleinfoAddCar(inChar);
}
}
}
}
}
byte checkSumOK(char *Message)
{
int i;
unsigned char checksum =0;
int msgLength = strlen(Message);
// trame pas valide
if(msgLength <= 2)
{
return 0;
}
for(i=0;i<(msgLength-2);i++)
{
checksum += Message[i];
}
checksum = (checksum & 63) + 32 ;
return (checksum == Message[msgLength-1]);
}
void traitMesssage(char *msg)
{
char bufTmp[50+1];
//ledRec.on();
digitalWrite(recPin, HIGH);
//message compteur heure creuse
if (!strncmp(msg,"HCHP",4))
{
STRNCPY(szHCHP,&msg[5],L_HCHX);
LOGDEBUG1PAR("Rec HCHP : %s"CR,szHCHP);
}
else if (!strncmp(msg,"HCHC",4))
{
STRNCPY(szHCHC,&msg[5],L_HCHX);
LOGDEBUG1PAR("Rec HCHC : %s"CR,szHCHC);
}
else if (!strncmp(msg,"PAPP",4))
{
STRNCPY(bufTmp,&msg[5],L_PAPP);
int ip=atoi(bufTmp);
LOGDEBUG1PAR("Rec PAPP : %d"CR,ip);
/*
if(sLPAPP != "")
{
sLPAPP += ":";
}
sLPAPP += String(bufTmp);
*/
statPAPP.add(ip);
}
else if (!strncmp(msg,"IINST",5))
{
STRNCPY(bufTmp,&msg[6],L_IINST);
int ii=atoi(bufTmp);
LOGDEBUG1PAR("Rec IISNT : %d"CR,ii);
/*
if(sLIINST != "")
{
sLIINST += ":";
}
sLIINST += bufTmp;
*/
statIINST.add(ii);
}
else if (!strncmp(msg,"PTEC",4))
{
STRNCPY(bufTmp,&msg[5],L_PTEC);
if(strncmp(bufTmp,szPTEC,L_PTEC))
{
STRNCPY(szPTEC,bufTmp,L_PTEC);
WebClientSendEtatHC((strncmp(szPTEC,"HC..",4)==0));
}
LOGDEBUG1PAR("Rec PTEC : %s"CR,szPTEC);
}
teleinfoLastChange = millis();
//ledRec.off();
digitalWrite(recPin, LOW);
}
char * getLastHCHC(void)
{
return szHCHC;
}
char * getLastHCHP(void)
{
return szHCHP;
}
String getListePAPP()
{
return "";//sLPAPP;
}
String getListeIINST()
{
return "";//sLIINST;
}
char * getLastPAPP(boolean calcul)
{
if(calcul == false)
{
return szLastPAPP;
}
if(statPAPP.count() == 0)
{
return (char*)"0";
}
int p = round(statPAPP.average());
sprintf(szLastPAPP,"%d",p);
//sLPAPP = "";
statPAPP.clear();
return szLastPAPP;
}
char * getLastIINST(boolean calcul)
{
if(calcul == false)
{
return szLastIINST;
}
if(statIINST.count() == 0)
{
return (char*)"0";
}
int i = round(statIINST.average());
sprintf(szLastIINST,"%d",i);
//sLIINST = "";
statIINST.clear();
return szLastIINST;
}
char * getLastPTEC(void)
{
return szPTEC;
}
boolean teleinfoDatasOK(void)
{
if(szPTEC[0] != 0 && szHCHP[0] != 0 && szHCHC[0] != 0 && statIINST.count() >0 && statPAPP.count() >0)
{
return true;
}
return false;
}
setupTeleinfo() lancer dans le setup principal
et checkTeleinfo() lancer dans le loop()
ce code n'est pas utilisable dans l’état (il y a plusieurs autres modules dans mon projet)
mais il y a toutes la gestion de la réception des trames et leurs décodage.
ken@vo
Phil