À l'aide de QSocketNotifier pour sélectionner un char de l'appareil.

J'ai écrit un char de pilote de périphérique et je suis en train d'écrire un QT "wrapper" qui elle est en partie pour obtenir un signal se déclenche lorsque l'appareil devient lisible via le sondage mécanisme. J'avais essayé de faire:

QFile file("/dev/testDriver");
if(file.open(QFile::ReadOnly)) {
  QSocketNotifier sn(file.handle(), , QSocketNotifier::Read);
  sn.setEnabled(true);
  connect(&sn, SIGNAL(activated(int)), &this, SLOT(readyRead()));
}

Mais readyRead n'a jamais été appelé et mon chauffeur jamais signalé, ayant son sondage de la méthode appelée.

J'ai été en mesure d'obtenir le code suivant pour le travail donc je sais que mon driver est

QFile file("/dev/testDriver");
if(file.open(QFile::ReadOnly)) {
    struct pollfd fd;
    fd.fd = file.handle();
    fd.events = POLLIN;

    struct pollfd fds[] = {fd};
    int ready;
    qDebug() << "Started poll";
    ready = poll(fds, 1, -1);
    qDebug() << "Poll returned: " << ready;

    QTextStream in(&file);
    QTextStream out(stdout);
    out << in.readAll();
}

Correctement attend mon pilote de faire appel wake_up et je peux voir deux sondage des appels de mon chauffeur. L'un pour le premier sondage d'enregistrement et un pour quand la wake_up qui se passe.

De le faire de cette façon, j'aurais probablement lancer un thread séparé qui tous, il n'était sondage sur cet appareil et de lancer un signal et la boucle.

Est-il possible d'utiliser QSocketNotifier de cette façon? La documentation de QFile::handle() semble indiquer qu'il devrait être.

Avez-vous jamais obtenir ce travail? J'ai écrit quelque chose de similaire, mais je ne pouvais pas file->read(buf, 1) de travail. Il suffit de l'accrocher. Cependant, read(file->handle(), buf, 1) a très bien fonctionné.
Oui la réponse j'ai vérifié a fonctionné pour moi. S'est avéré être une simple erreur de codage. Découvrez également ma réponse pour voir si cela vous aide.
Revoir mon commentaire précédent, c'était un malentendu de ma part de la façon dont le pilote de l'appareil a fonctionné. Les deux morceaux de code a travaillé, il s'est trouvé que mes autres facteurs ont entraîné l'ensemble de test à l'échec quand j'étais en utilisant l'un d'entre eux m'obligeant à faire l'erreur de connexion.

OriginalL'auteur jjcf89 | 2011-07-29