Re: Port serie et Qt

Pàgina inicial

Reply to this message
Autor: Pierre Carecchi
Data:  
CC: Liste Guilde
Assumpte: Re: Port serie et Qt


Edgar Bonet a écrit:
> Le mercredi 22 septembre, Pierre Carecchi a écrit :
>
>>j'essaie de faire une appli Qt dialoguant avec un rack au travers de la
>>liaison serie (en asynchrone).
>>j'en avais fait une de type console qui marchait a peu pres bien, mais
>>quand j'essaie de transporter ca dans Qt , y a plus grand chose qui marche.
>>Y a t il qq qui aurait une experience avec Qt et les ports serie ?
>
>
> J'ai fait quelque chose d'un peu semblable, sauf qu'au lieu de Qt
> c'était GTK et au lieu d'un port série c'était un socket Unix ;-) .
>
> En gros le problème qui se posait, et je suppose que c'est le même pour
> toi, est dans le fait que tu dois faire de la programmation
> évenmentielle. Dans un programme en ligne de commande, tu peux souvent
> te permettre de faire des read() et des write() bloquants sur ton port
> série, alors que pour un programme graphique tu évites les appels
> bloquants et tu remets à la boucle d'évennements pour le contrôle de la
> séquence du programme. La solution consiste à dire à ton toolkit que tu
> veux lire, ou écrire, sur le port série. Celui-ci se chargera alors de
> produire un évennement quand le port est prêt pour une lecture ou
> écriture non bloquante, et appelera alors le callback que tu lui as
> donné.
>
> Exemple de lecture seule du port série en GTK-1 :
>
> /* Read data from the file descriptor fd and do something with it. */
> void get_data(gpointer unused, gint fd, GdkInputCondition condition)
> {
>     int ret;
>     char buffer[BUF_SIZE];

>
>     /* This will not block. */
>     ret = read(fd, buffer, sizeof buffer);

>
>     /* do something with the data in buffer... */
> }

>
> int main(int argc, char *argv[])
> {
>     int port;
>     GtkWidget *window;

>
>     gtk_init(&argc, &argv);

>
>     /* Open and monitor the connection with the instrument. */
>     port = open("/dev/ttyS0", O_RDONLY);
>     gdk_input_add(port, GDK_INPUT_READ, get_data, NULL);

>
>     /* Standard GTK stuff. */
>     window = create_main_window();  /* defined elsewhere */
>     gtk_widget_show(window);
>     gtk_main();
>     return EXIT_SUCCESS;
> }

>
> Ici le truc important c'est gdk_input_add(). C'est ici que tu demandes à
> GTK de produire un évennement à chaque fois qu'il y a des données qui
> sont arrivées sur le port. Le troisième paramètre est ton callback qui
> sera appelé pour lire et traiter ces données. C'est très similaire de ce
> qu'on fait avec select(2), et d'ailleurs il y a probablement un select()
> sous le capot de gtk_main() (et un FD_SET() sous celui de
> gdk_input_add()).
>
> Il ne te reste plus qu'à trouver l'équivalent Qt de gdk_input_add().
>


ouais sauf que dans les libs de Qtfree, il n'y a rien pour les ports serie!
dans mon programme console, i n'y avait rien de bloquant, j'avais deux
threads ( un de lecture, un d'ecriture) et un mutex, pour empecher que
ca se morde la queue..
mais pas moyen d transposer ca sous Qt, il y a bien des classes de
thread et de mutex, mais ca me parait pas super efficace; Quand aux
threads et mutex "standard", dans un programme Qt ,ca n'a pas l'air mieux...
faut peut etre que j'essaie gtk, j'ai un bouquin, mais j'ai pas encore
joué avec...

--
Pierre Carecchio
Laboratoire des Ecoulements Géophysiques et Industriels
tel : (0) 476 825 134
fax : (0) 476 825 286