J'écris un programme C++ en utilisant Qt qui lit les données de la ligne série. Le "producteur" des données est une carte Arduino UNO.Qt ne pas recevoir de données série de arduino
Le code Arduino est très simple. Actuellement, il génère simplement un nombre aléatoire et l'envoie sur la ligne série. Voici le code:
long randNumber;
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
}
void loop() {
randNumber = random(300);
Serial.write(randNumber);
delay(10);
}
Je l'ai utilisé « moniteur série » de l'Arduino pour vérifier que les données sont à venir sur la ligne série. Sur le côté Qt des choses, j'ai un thread de travail qui est censé lire les données série et mettre à jour un tracé sur l'interface utilisateur en conséquence. Le thread de travail est définitivement en cours d'exécution, et ce code est en cours d'exécution (j'ai vérifié). J'ai seulement un périphérique dans ma "liste des ports" qui apparaît, et c'est l'Arduino, donc actuellement je me connecte directement. Voici le code:
void doWork()
{
QList<QSerialPortInfo> port_list = QSerialPortInfo::availablePorts();
QSerialPort serialPort;
serialPort.setPort(port_list[0]);
serialPort.setBaudRate(QSerialPort::Baud9600);
if (!serialPort.open(QIODevice::ReadWrite))
{
cout << QObject::tr("Failed to open port COM3, error: %1").arg(serialPort.errorString()).toStdString() << endl;
}
while(!abort_thread)
{
int bytes_available = serialPort.bytesAvailable();
if (bytes_available >= 4)
{
QByteArray byte_array = serialPort.read(4);
int data = byte_array.toInt();
emit signalDataReady(data);
}
}
serialPort.close();
}
Malheureusement, il n'y a jamais d'octets disponibles. Il ouvre le port série avec succès, mais aucun octet ne passe. Qu'est-ce que je fais mal ici? Des idées? Merci!
Vous semblez avoir vérifié à peu près toutes les erreurs que je pouvais penser, mais êtes-vous * absolument sûr * que vous avez seulement un port sur votre ordinateur? Avez-vous imprimé la longueur de 'port_list' ou avez-vous utilisé autre chose pour vérifier? Je demande juste parce que beaucoup d'ordinateurs ont tendance à avoir des ports série supplémentaires même s'ils n'ont pas d'interface physique. –
Je présume que Qt fonctionne sur un PC connecté à votre carte Arduino? - ou est-ce que Qt fonctionne aussi sur un autre forum Arduino? Quoi qu'il en soit, quelques petites choses à essayer: D'abord, dans votre fonction de thread doWork(), vous allez probablement maximiser votre processeur car vous n'avez aucun point de commutation. Essayez d'ajouter 'QThread :: msleep (10);' pour ajouter une pause, ralentir votre interrogation et permettre à d'autres processus d'avoir du temps CPU (pas sûr que ça va le réparer, mais ...). Vous aurez besoin de '#include' dans votre fichier. –
Deuxième chose ... ok c'est plus un coup de couteau dans le noir que le premier, mais j'ouvre toujours mon QSerialPorts en mettant setPortName() ... fonctionne toujours pour moi. Vous pouvez donc essayer 'serialPort.setPortName (port_list [0] .portName());' au lieu de 'serialPort.setPort (port_list [0]);' –