souci de différence de réaction entre 2009 et UNO ( communication )

bonjour à tous,
je rencontre un petit souci pour l’éxécution d’un script qui fonctionne avec Arduino 2009 , mais pas complètement avec l’UNO.
Ce script a été écrit au départ sous interface 018, et comprenait un include de wstring.h.

Mon application envoit des données à l’arduino et “stimule” la communication.
Un jeu de mots de clés permet la demande d’écriture sur les IO et PWM ainsi que la demande d’envoi vers l’application des ports IO et analogues.
Ce rafraichissement est fait via un timer dans mon API.

En passant sous logiciel 022 j’ai du juste revoir l’usage de la fonction .append de wstring : String.append devenant String+=string_a_rajouter. Et j’ai été heureusement surpris de voir que je n’avais pas besoin de revoir la partie hardware de mon soft. Une fois installé le nouveau driver de l’UNO, celà fonctionne pour l’écriture/lecture sur port série sans adaptation de code ( ouf ).

Cepedant, cependant, le problème que je rencontre est le suivant:

-je branche l’interface UNO sur port USB
-je lance le logiciel et me connecte à elle
-le voyant RX s’allume. Par contre aucun renvoi n’est fait en TX alors que l’arduino est stimulée
-je suis obligé d’écrire 2-3 fois sur un port IO ON OFF pour que tout d’un coup je recoive les valeurs des IO et analogs de l’UNO

Ce problème ne se pose absolument pas avec la 2009 ( j’ai retesté).

Si je laisse l’arduino branchée, une fois la communication enclenchée, je peux quitter mon logiciel ( le port com est fermé quand on quitte) et le rédémarrer: le dialogue est ok.

Quelle en est la cause, et comment ammorcer correctement l’UNO ?

Voici le script, merci à vous :wink:

//dernière mise à jour: 20 février 2011 pour UNO sous logiciel 0022
//ce sketch est conçu pour fonctionner avec WhiteCat Lighting Board
//sit: http://www.le-chat-noir-numerique.fr

//#include <WString.h> //necessaire en versions précédentes 018


//chaine des ordres venant de whitecat
#define maxLength 36
String inString = String(maxLength);   
char end_data[]={"ED/"};//whitecat demande la mise en 0 ou 1 de la sortie digital

int threshold_analog=0;
//definitions paramètres com:
const int BAUDRATE=9600;//9600 pour 13 IO et 6 ANA ok //11400 pour 54 IO
//11400 ppour 54 IO
//définitions du nombre de capteurs ( doit concorder aussi dans whitecat -> arduino cfg)
const int NBR_ANALOG=6;
const int NBR_DIGITAL=13;
//création d'un tableau de définition pour les I/O 
bool digital_is_output[NBR_DIGITAL];
bool allow_analog_read[NBR_ANALOG];
bool allow_pwm_write[NBR_DIGITAL];
////////////////////////////////////////////////////
//tableaux de stockage des valeurs reçues en input
byte buffer_analog[NBR_ANALOG];
byte old_buffer_analog[NBR_ANALOG];
byte buffer_digital[NBR_DIGITAL];
byte old_buffer_digital[NBR_DIGITAL];
int valeur_pwm[NBR_DIGITAL];

/////////////////////////////////////////////////////////////////
void setup()
{
Serial.begin(BAUDRATE);
 ////////////////////////////////////////////////////////////////////////////////
digital_is_output[2]=1;
digital_is_output[3]=1;
digital_is_output[4]=1;
digital_is_output[5]=1;
digital_is_output[6]=1;
digital_is_output[7]=0;
digital_is_output[8]=0;
digital_is_output[9]=1;//sortie mais PWM
digital_is_output[10]=1;//sortie mais PWM
digital_is_output[11]=0;
digital_is_output[12]=0;
digital_is_output[13]=0;

allow_pwm_write[9]=1;
allow_pwm_write[10]=1;
/*autorisation de lecture des analogues. Si vous ne définnissez pas =1 l'analogue ne
sera pas envoyé à WhiteCat*/
allow_analog_read[0]=1;
allow_analog_read[1]=1;
allow_analog_read[2]=1;
allow_analog_read[3]=1;
allow_analog_read[4]=1;
allow_analog_read[5]=1;
////////////////////////
//INITIALISATION DES ON/OFF
for(int i=2; i<NBR_DIGITAL; i++)
{
if(digital_is_output[i]==1){pinMode(i,OUTPUT);}
else {pinMode(i,INPUT);}
}
}
/////////////////////////////////////////////////////////////////
void loop()
{
if (Serial.available() > 0) 
{
 char inChar =Serial.read();
 if( inChar!='\0')
 {
    if (inString.length() <maxLength ) 
    {
     inString+=inChar;//inString.append(inChar);
    }
    else 
     {
      // empty the string by setting it equal to the incoming char:
      inString = inChar;
     }
 }
 read_order();
}
}
/////////////////////////////////////////////////////////////
void read_order()
{
if (inString[0]=='S' && inString[1]=='D' && inString[2]=='/' )
{
arduino_to_whitecat();//lecture des IO et analogs IN et envoi à whitecat
inString="";//nettoyage de l'ordre
} 
if (inString[0]=='D' && inString[1]=='O' && inString[2]=='/' && inString.endsWith(end_data) )
{
whitecat_to_dig();//envoi par white cat des IO
inString="";//nettoyage de l'ordre
} 
if (inString[0]=='P' && inString[1]=='W' && inString[2]=='/' && inString.endsWith(end_data) )
{
whitecat_to_pwm();//envoi par whitecat des pwm
inString="";//nettoyage de l'ordre
} 
}
///////////////////////////////////////////////////////////////////////
void whitecat_to_dig()
{
for(int i=2; i<NBR_DIGITAL; i++)
{
if(digital_is_output[i]==1 &&  allow_pwm_write[i]==0)
{//32= valeur 0
if(inString[i+3]!=32){digitalWrite(i,HIGH);} else {digitalWrite(i,LOW);}
}
}
}
//////////////////////////////////////////////////////////////////////
void whitecat_to_pwm()
{
for(int i=0; i<NBR_DIGITAL; i++)
{
if(allow_pwm_write[i]==1)
{
valeur_pwm[i]=byte(inString[i+3]-1);
analogWrite(i,valeur_pwm[i]);
}

}
}
//////////////////////////////////////////////////////////////////////
void arduino_to_whitecat()
{
//digitales///////////////////
bool change_on_dig=0;
for(int i=2;i<NBR_DIGITAL;i++)//on zappe les états de TX RX en pins 0 et 1
{
old_buffer_digital[i]=buffer_digital[i];
//si le digital est une entrée
if(digital_is_output[i]==0 && allow_pwm_write[i]==0)
   {
    buffer_digital[i]= digitalRead(i);
    if(old_buffer_digital[i]!=buffer_digital[i])
    {change_on_dig=1; } 
  }
}

//analogues////////////////////
bool change_on_ang=0;
for(int i=0;i<NBR_ANALOG;i++)
{
 old_buffer_analog[i]=buffer_analog[i]; 
   if(allow_analog_read[i]==1)//si on autorise la lecture de cet analog
   {
    int temp_val=analogRead(i); 
    if((temp_val/4)>old_buffer_analog[i]+threshold_analog || (temp_val/4)<old_buffer_analog[i]-threshold_analog)
    {
    buffer_analog[i]=byte(temp_val/4);
    change_on_ang=1;
    }
   }  
}
//envois
 if(change_on_dig==1)
{
 Serial.print("DG/");
 Serial.write(buffer_digital,NBR_DIGITAL);
 Serial.println("");
}
 if(change_on_ang==1)
{
 Serial.print("AN/");
 Serial.write(buffer_analog,NBR_ANALOG);
 Serial.println(""); 
} 
}
/////////////////////////////////////////////////////////////////////////

après cogitation, il me semble que le problème pourrait venir de wstring. Est ce que quelqu un peut me donner son avis là dessus ? merci

Je suis surpris par cette ligne if( inChar!='\0')

Le \0 n'est pas envoyé normalement (sauf si tu le fais explicitement)

bonjour à toi. le '\0' est envoyé explicitement par mon api pour cloturer la chaine envoyée par mon api.

le truc c est que sur une 2009 avec wstring d i'l y a 6 ou 8 mois, tout fonctionne parfaitement :-(

Autre question, est-ce que les ordres envoyés sont pris en compte même si tu n'as pas de retour ce qui placerait le problème dans la partie retour d'info. Ou est-ce que les ordres ne sont pas pris en compte et alors là on peut penser que le problème vient de la réception.

En fait la seule différence notable entre les deux versions de ton sketch c'est cette ligne: inString+=inChar;//inString.append(inChar); Est-ce qu'il n'y aurait pas une différence de comportement entre le .append et le +=

Il faudrait essayer d'afficher le contenu de ton tampon de réception pour voir comment il se remplit

ok, je vais vérifier et je reviens à toi une fois vu en monitoring ce qui se passe. merci

hello. donc en fait le souci avec la nouvelle mouture de wstring en version 0022 c’est que la valeur numérique 0 envoyées sur port série ne correspond plus à ‘\0’.
j’ai donc modifié mon api en conséquence.
Il me faut attendre 10 secondes avant d’avoir un envoi de data de la UNO. Est ce que ceux qui ont une UNO rencontrent la même problématique au démarrage de leur API ( la 2009 elle répond dès l’ouverture, sans attente: la led RX clignote, la Tx s’allume au bout de 10 secondes) ?

merci