Go Down

Topic: lire des valeurs sur Arduino en c / c++ (Read 7388 times) previous topic - next topic

romain78

Je suis sur MAC OS X (10.6.4)

La j'a réussi a lire les infos du port com  :) mais seulement quand je ne remet pas a zéro le tableau table dans la fonction read, si je remet a zéro le tableau je n'arrive pas a lire de valeur.

Quand j'arrive a lire au bout d'un certain temps le port COM plante complètement je ne peut plus l'utiliser,je dois redémarrer mon pc pour pouvoir réutiliser le port com de l'usb.
Peut être que je lis trop rapidement sur le port série dans mon programme.

J'ai bien enlevé le "ln" dans le code arduino.

Korman

Quote
Je ne comprend pas trop ce qu'il se passe en fait.


Romain,

en effet, ça parait être le cas. Je n'ai pas regarder ton programme en détail, mais j'ai eu l'impression que le problème fondamental est que le comportement de la fonction read n'est pas vraiment clair. Il vaut mieux revoir la documentation pour celle-ci en détail. Le troisième paramètre ne sont pas les lettres à lire mais que le maximum. Pour un fichier c'est plus où moins la même chose, mais pour des données transférées par l'interface sérielle (ou provenant du clavier) les valeurs lues sont souvent moins.

Pour toi ça veut dire, tu dois prendre en compte la valeur retourné par la fonction read et traiter tes infos que lorsque tout est arrivé.

Korman

romain78

Bon maintenant j'arrive a lire sur le port mais j'ai deux problème qui persiste:
-le 1er c'est que mon programme ne capte pas systématiquement toutes les messages du port com (j'ai fait un code sur l'arduino pour envoyer le message que quand j'appuis sur un bouton et la trame est lu au bout de n appui.
-Le 2eme est que quand je remet le tableau a 0 dans la fonction de lecture je n'arrive plus a lire le message entrant.

Code c de la fonction de lecture du port:
Code: [Select]
int readport()
{
       //in[5]=0; dès que j'exécute ces lignes je n'arrive plus a lire sur le port.
     //in[4]=0;  
     //in[3]=0;
     //in[2]=0;
     //in[1]=0;
     //in[0]=0;
     int i=1;
     int reade;
     int j;
   //{
     while(in[5]!='$')
     {
     reade=(read(fd,&in,6));
     if(reade<0)
     printf("erreur lecture\n code: %d\n",reade);
     else printf("read=%d\n",reade);
           printf("sizeof de table: %d\n",sizeof(in));
           }
           return &in;
//    }
}


Main():
Code: [Select]
int main(int argc, char *argv[])
{

     int c,j;
     
     /******************************************
      détection du port usb
      *******************************************/
     RecherchePort();
     if(!RecherchePort()) return 0;
   /*******************************************
      fin de détection
      ********************************************/
     
     
   printf("what USB port is your Arduino Board pluged into?");
   printf("Example:\n/dev/tty.usbserial-A70041zl\nor\n/dev/tty.usbserial-A1001N2Y\n");
     
   scanf("%s", &USBPort);
     
   Ouverture_port();
   if(!Ouverture_port()) return 0;
     
     
     while(1)
     {
           c=readport();
           printf("valeur recu =%c%c%c%c%c%c\n",in[0],in[1],in[2],in[3],in[4],in[5]);

           
     }
     
           
     return EXIT_SUCCESS;
}


Et le tableau dans lequel je range mes données venant du port série est déclaré comme ceci en variable globale:

char in[6]={0};


Si vous avez des idées elles sont le bienvenue car je stagne un peut la...

Jean-François

L'idéal serait de pouvoir ouvrir le port USB et le fermer seulement lors de l'arrêt du programme.
C'était un problème pour lequel je n'avais pas trouvé de solution.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

sxdemon

Quote
Je cherchais un moyen de lire des valeurs sur l'Arduino avec mon Mac depuis quelques temps...

Les Mac ne peuvent pas créer des ports Serial virtuels?
Comment utilises-tu le IDE  dans ce cas?

Je suis très confus, j'ai sans doute mal compris  ;D

Jean-François

#35
Oct 27, 2010, 06:09 pm Last Edit: Oct 27, 2010, 06:10 pm by jfs Reason: 1
Et bien pour ne pas paraitre embêtant, ce n'est pas le Mac (ou le Pc) qui fait le port série, mais la puce Ftdi qui fait une liaisons usb par le biais d'un driver.

Et ce qu'il fallait comprendre dans cette première phrase, c'est que je voulais afficher des valeur en dehors de l'IDE  ;)
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

sxdemon

Ok merci  ;)

(Pas nécessairement le FTDI. Il n'en a pas dans le Uno)

Jean-François

Dans la Uno c'est un Atmega8 qui utilise le protocole usb et qui fait une communication série avec l'autre Atmega... toujours pas de port série sur le Mac  ::), mais plus besoins des drivers Ftdi.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

karistouf

hello jean francois. si je puis me permettre, tu peux trouver des exemples d ouverture de port FTDI sous MAC/Linux en C++ avec OLA: http://opendmx.net/index.php/OpenDMX.net

la enttec pro utilise les memes drivers FTDI que arduino, et tu peux donc y accéder en t inspirant du code de discussion de la Pro .

Quote
mais plus besoins des drivers Ftdi.

est ce le cas sous windows ? plus de drivers ftdi necessaires pour la UNO ? ( j ai acheté une 2009 il y a deux mois et fais un gros boulot de portage)

Jean-François

Merci pour ce lien.

Pour les drivers, c'est ce qui ressortait d'une discussion récente dans un sujet sur l'USB et la Uno.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

karistouf

hello jean francois as tu un lien de cette discussion ?

Jean-François

#41
Oct 28, 2010, 01:21 pm Last Edit: Oct 28, 2010, 01:21 pm by jfs Reason: 1

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1287034719
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

karistouf

#42
Oct 29, 2010, 10:29 am Last Edit: Oct 29, 2010, 10:32 am by karistouf Reason: 1
bien le merci !  ;D

donc si je comprends bien l UNO fonctionne avec les drivers FTDI ? ou bien la communication se fait désormais autrement ?
( j ai un joli travail sur mon api en C par FTDI, sur 2009, du coup je suis inquiet)

Teiva

Quote
donc si je comprends bien l UNO fonctionne avec les drivers FTDI ?


Bien non, la Uno et mega 2560 n'utilisent plus le FTDI, à la place c'est un chip USB Atmega8 qui fait office de pont USB/série.
Ce chip n'a pas besoin de driver sous Windows juste un fichier ini , sous mac et linux pas besoin de driver.
Dans tous les cas ça se présente comme un port série COMx.
Pourquoi as tu attaqué le port au niveau du driver FTDI, tu fais du bit-bang ??

A+ Teiva,


www.Zartronic.fr votre source Arduino en France
Distributeur officiel Arduino et DFRobot


www.Zartronic.fr : Arduino & Robotique

karistouf

hello teiva. non non j ai juste  acheté une carte et passé un mois à porter arduino et différentes fonctions + le dialogue FTDI

... et la uno sort sans FTDI.

du coup va falloir que je me procure une UNO.... et que je recode tout le dialogue avec les ports .... alors que je m appretais à livrer le upgrade de mon soft pour arduino cette semaine - ci.

je suppose qu il va falloir que je maintienne le dialogue FTDI + le portage Atmega ( cool en termes de bugs à venir) pour les ouvertures et fermeture de ports

il n y avait aucun signe d un quelconque changement il y a 3 mois sur le site arduino.... juste un truc du genre "on va vous faire une nouvelle surprise".... grrrrr.....

mais bon je comprends les besoins de liberté.....
c est juste que si j avais su j aurais attendu un peu.  :(

Go Up