Voici ou j'en suis avec mon code qui fonctionne (sans démon, avec le thread):
Les fonctions :
J'avoue avoir été également sur Mactronique.com pour chercher un peu d'aide à propos des microcontroleurs en USB :zen:.
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:.