Re: Port serie et Qt

Top Page

Reply to this message
Author: Edgar Bonet
Date:  
To: Liste Guilde
Subject: Re: Port serie et Qt
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().

-- 
Edgar Bonet           Maison : 04 76 21 29 16    Bureau : 04 76 88 10 96
3 rue Jean Prévost    Mobile : 06 77 19 79 39    Fax    : 04 76 88 11 91
38000 Grenoble        guilde@???     www.edgar-bonet.org