µicrocontroleur sur un port USB

jfsgeneva

Membre confirmé
12 Mars 2006
33
1
Voici ou j'en suis avec mon code qui fonctionne (sans démon, avec le thread):

Bloc de code:
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL_ttf/SDL_ttf.h>

#include <pthread.h>

#include <fcntl.h>
#include <termios.h>   
//#include <memory.h>
#include <unistd.h> //write(), read()

using namespace std;

void Output();          // pour envoyer à l'arduino
void readport();        // pour recevoir de l'arduino
void init_port();       //initialise le portUSB
bool Ouverture_port();  //ouvre le portUSB
bool RecherchePort();

void* monThread(void*);//thread de lecture de portUSB

char USBPort[1000];            // pour le nom du portUSB
char temps[20] = "";        //pour déterminer le temps
char Temperature [5]={0};    //pour la valeur écrite dans la fenêtre
char table[7]={0};            //pour les valeurs en sortie d'arduino

int Q=0;  //fait la boucle de lecture du portUSB
int continuer = 1; //boucle de fenêtre graphique
int fd = 0;

long Temp,Temp1,Temp2,Temp3,Temp4,Temp5  = 0;
long *pointeurTemp = &Temp,*pointeurTemp1 = &Temp1,*pointeurTemp2 = &Temp2,*pointeurTemp3 =&Temp3,*pointeurTemp4 = &Temp4,*pointeurTemp5  = &Temp5;


int main(int argc, char *argv[])
{

/******************************************
    détection du port usb
    *******************************************/
 RecherchePort();
 if(!RecherchePort()) return 0;
    /*******************************************
    fin de détection
    ********************************************/
    
    
    cout << "what USB port is your Arduino Board pluged into?" << endl;
    cout << "Example:\n/dev/tty.usbserial-A70041zl\nor\n/dev/tty.usbserial-A1001N2Y" << endl;    
    
    cin >> USBPort;
    
    Ouverture_port();
    if(!Ouverture_port()) return 0;
                
    
pthread_t thread;
pthread_create (&thread, NULL, monThread, NULL);
        
        
    SDL_Surface *ecran = NULL, *texte = NULL;
    SDL_Rect position;
    SDL_Event event;
    TTF_Font *police = NULL;
    SDL_Color couleurNoire = {0, 0, 0}, couleurBlanche = {255, 255, 255};


    SDL_Init(SDL_INIT_VIDEO);
    TTF_Init();

    ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    SDL_WM_SetCaption("Mesure de luminosité", NULL);


    /* Chargement de la police */
    police = TTF_OpenFont("angelina.ttf", 65);

 
    while (continuer)
        {
        SDL_PollEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                
                continuer = 0;
                
                break;
        }

        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));


            sprintf(temps, "Temp : %s", Temperature); /* On écrit dans la chaîne "temps" le nouveau temps */
            SDL_FreeSurface(texte); /* On supprime la surface précédente de la mémoire avant d'en charger une nouvelle (IMPORTANT) */
            texte = TTF_RenderText_Shaded(police, temps, couleurNoire, couleurBlanche); /* On écrit la chaine temps dans la SDL_Surface */
                       

        position.x = 180;
        position.y = 210;
        SDL_BlitSurface(texte, NULL, ecran, &position); /* Blit du texte contenant le temps */
        SDL_Flip(ecran);

        }
    
    

        TTF_CloseFont(police);
        TTF_Quit();

        SDL_FreeSurface(texte);
        SDL_Quit();


        pthread_join(thread, NULL);
  
        return EXIT_SUCCESS;
}


Les fonctions :

Bloc de code:
void init_port(int *fd, unsigned int baud) 
    { 
    struct termios options; 
    tcgetattr(*fd,&options); 
    switch(baud) 
    { 
       case 9600: cfsetispeed(&options,B9600); 
    cfsetospeed(&options,B9600); 
    break; 
       case 19200: cfsetispeed(&options,B19200); 
    cfsetospeed(&options,B19200); 
    break; 
       case 38400: cfsetispeed(&options,B38400); 
    cfsetospeed(&options,B38400); 
    break; 
    default:cfsetispeed(&options,B9600); 
    cfsetospeed(&options,B9600); 
    break; 
    } 
    options.c_cflag |= (CLOCAL | CREAD); 
    options.c_cflag &= ~PARENB; 
    options.c_cflag &= ~CSTOPB; 
    options.c_cflag &= ~CSIZE; 
    options.c_cflag |= CS8; 
    tcsetattr(*fd,TCSANOW,&options); 
} 
    
    
bool Ouverture_port()
     {
     fd = open(USBPort, O_RDWR | O_NOCTTY | O_NDELAY);
     if(fd == -1){
          perror("open_port: unable to open port");
          return FALSE;
     }
     init_port(&fd,19200);         //set serial port to 9600,8,n,1
     fcntl(fd, F_SETFL,3);
     
     return TRUE;
}



void Output()
    {
    
    write(fd,"&",1);
}
        
    
void readport()
    {
    char table[7]={0};
    {    
    while(table[6]!='$')
    {
    read(fd,&table,sizeof(table));
    
    Temp1 = table[2]-'0';
    Temp2 = table[3]-'0';
    Temp3 = table[4]-'0';
    Temp4 = table[5]-'0';
    
    //    if (Temp1 < 0){ fputs("read() of 10 bytes failed!\n", stderr); 
    }    

    }
    }
}
    

bool RecherchePort(){
    FILE* myPipe=NULL;
    char buffer[1000];
    bool found=FALSE;
    myPipe = popen("ls /dev/tty.usbserial*", "r");
    if(myPipe==NULL){
      //errorstuff
      printf("Aucune carte trouvée !\n");
      return FALSE;
   }
   while(fgets(buffer, 1000, myPipe)!=NULL){
      printf("\n\nvotre usb est : \n\n%s \n", buffer);
      found=TRUE;
   }   
   
   
    pclose(myPipe);
   if(!found) printf("Aucune carte trouvée !\n");
    return found;
} 
    
    
    
void* monThread(void*)
    {
    while(Q!=4000)
    {  

    //Output();
    readport();
     
    //double strtod(const char *nptr, char **endptr); //pour convertir une chaine en entier
            
    sprintf(Temperature, "%ld%ld%ld%ld", *pointeurTemp1, *pointeurTemp2, *pointeurTemp3, *pointeurTemp4);//affiche dans la fenêtre     
    
    printf("%ld%ld%ld%ld\n", *pointeurTemp1, *pointeurTemp2, *pointeurTemp3, *pointeurTemp4); //affiche dans la console
    
    Q++;
           
    }    
   
    close(fd);
        
    return EXIT_SUCCESS;
}


J'avoue avoir été également sur Mactronique.com pour chercher un peu d'aide à propos des microcontroleurs en USB :zen:.