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); }
}
}
}