comment readyRead() travaillent dans Qt?
C'est ma première question sur ce site !
J'ai quelques problèmes de lecture de données à partir d'un port COM, j'ai envoyer un message complet à partir d'un autre port COM, et quand je le reçois avec Qt, c'est toujours coupée en plusieurs submessages.
void SerialPortReader::init()
{
connect(m_serialPort, SIGNAL(readyRead()), this, SLOT(readData()));
}
void SerialPortReader::readData()
{
// m_serialPort->waitForReadyRead(200);
QByteArray byteArray = m_serialPort->readAll();
qDebug() << byteArray;
if(byteArray.startsWith(SOF) && byteArray.endsWith(EOF_LS)
&& byteArray.size() >= MIN_SIZE_DATA) {
decodeData(byteArray.constData());
} else {
qDebug() << "LIB SWCom : Unvalid trame !";
}
}
les messages envoyés sont 25 ou 27 Octets de long, si j'utilise du Mastic ou un Hyperterminal pour les lire, je n'ai aucun problème.
Aussi, si j'utilise 2 émulé port série COM pour communiquer, je n'ai pas ce problème...
Il se produit uniquement avec Qt système de lecture ET avec 2 port COM physique...
Je pense que je n'ai pas lorsque le signal readyRead est émis exactement...
Je suis très confuse, je vous Remercie d'avance pour votre aide !
- Demandez-vous comment nous avons plus particulièrement mis en œuvre dans ce QtSerialPort et/ou juste l'API de concept?
- Oui, il a beaucoup aidé, merci
Vous devez vous connecter pour publier un commentaire.
La la documentation est en fait tout à fait clair à ce sujet:
Cela signifie qu'il n'est pas vraiment garantie la quantité de données disponibles pour la lecture, c'est juste que certains seront disponibles.
Si vous souhaitez lire plus de données qu'il est venue d'un seul coup, vous pouvez peut-être opter pour une valeur de délai d'expiration et/ou readyRead. Cela dépend de ce que vous essayez d'atteindre.
Voir le ligne de commande asynchrone lecteur exemple que j'ai écrit il y a un moment pour cette opération, trop:
Dans ce cas, la ligne de commande lecteur exemple obtiendrez toutes les données qui a été passé d'un seul coup, mais il ne garantit pas la longueur ou quoi que ce soit.
Aussi, veuillez noter que la synchronisation de l'api qui est derrière vos commentaires ne font pas beaucoup de sens avec l'API asynchrone que vous parlez. Je me réfère à
m_serialPort->waitForReadyRead(200);
ici.La readyRead-signal est émis à chaque fois qu'il est en attente de données ET l'exécution précédente de readyRead a fini.
Documentation dit:
Si cela doit conduire à des problèmes dans votre cas, vous pourriez utiliser tout en boucle où vous vérifiez bytesAvailable().
L'utilisation de la Thread concept ici , à l'aide de threads que vous pouvez atteindre cet objectif... exécuter votre portread dans un sujet séparé, alors il sera fonctionne très bien, sinon le message sera coupé.
autre méthode u peut utiliser Qprocess et ouvrez un nouveau terminal à l'aide de QProcess et envoyer le numéro de port et les détails sur la connectivité de la console et de l'exécuter à partir de Qt puis aussi u peut archiver ce
je veux dire, on peut utiliser therad et de la communication par socket regardez ce code
c'est un simple exemple de connexion telnet, de même que u peut spécifier le port sur lequel vous voulez vous connecter et relié à l'ip