Voici le code que j'utilise pour lire des valeur sur mon microcontrôleur.
J'arrive à afficher ces valeurs dans une fenêtre (merci le site du zero) avec un renouvellement des valeurs affichées environ une fois par seconde.
Comment faire pour que cela soit plus rapide ?
J'ai déjà essayé de déplacer Ouverture_port(); et close(fd); , mais mon Mac plante...
	
	
	
		
	
		
			
		
		
	
				
			J'arrive à afficher ces valeurs dans une fenêtre (merci le site du zero) avec un renouvellement des valeurs affichées environ une fois par seconde.
Comment faire pour que cela soit plus rapide ?
J'ai déjà essayé de déplacer Ouverture_port(); et close(fd); , mais mon Mac plante...
		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 <fcntl.h>
#include <termios.h>   
#include <unistd.h> //write(), read()
using namespace std;
void Output();          // pour envoyer au µcontroleur
void readport();        // pour recevoir de µcontroleur
void init_port();       //initialise le portUSB
void Ouverture_port();  //ouvre le 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 µcontroleur
int fd = 0;
int continuer = 1;
long Temp,Temp1,Temp2,Temp3 ,Temp4,Temp5  = 0;
int main(int argc, char *argv[])
{
    /******************************************
    détection du port usb
    *******************************************/
    FILE* myPipe=NULL;
    char buffer[1000];
    myPipe = popen("ls /dev/tty.usbserial*", "r");
    if(myPipe==NULL){
        //errorstuff
    }
    while(fgets(buffer, 1000, myPipe)!=NULL){
        (void) printf("\n\nvotre usb est : \n\n%s \n", buffer);
    }    
    
    
    pclose(myPipe);
    
    /*******************************************
    fin de détection
    ********************************************/
            
    
    cout << "Sur quel port est le µcontroleur ?" << endl;
    cout << "Example:\n/dev/tty.usbserial-A70041zl\nor\n/dev/tty.usbserial-A1001N2Y" << endl;    
    
    cin >> USBPort;
    
    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;
                close(fd);
                break;
        }
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
        
        
        // compteur += 100; // On rajoute 100ms au compteur 
        
    Ouverture_port();
    Output();
    readport();
    close(fd);
        
    //Temp = Temp1*100 + Temp2*10 + Temp3 ; 
    //double strtod(const char *nptr, char **endptr); //pour convertir une chaine en entier
            sprintf(Temperature, "%ld%ld%ld%ld", Temp1, Temp2, Temp3, Temp4);     
     
    
    
    cout<<table[0]<<table[1]<<Temperature<<endl;
            
            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();
    return EXIT_SUCCESS;
    }
/**************************************/
/**************************************/
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); 
    } 
    
    
void Ouverture_port()
        {
        fd = open(USBPort, O_RDWR | O_NOCTTY | O_NDELAY);
    if(fd == -1) 
    perror("open_port: unable to open port"); 
    init_port(&fd,19200);         //set serial port to 9600,8,n,1
    fcntl(fd, F_SETFL,3);
    }
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); }    
    }
    }
    } 
	 
	 
 
		 
 
		 
 
		