Bonjour
Je voudrais établir une communication série, pour ceci j'ai utilisé la bibliothèque QtSerialPort http://qt-project.org/wiki/QtSerialPort, je me suis basé sur l'exemple sur le site.
Malheureusement, quand j'ai testé ce code tous les "qDebug" sont exécutés ainsi les "cin", mais les messages ne sont pas envoyés sur le port série.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89 #include <QtCore/QCoreApplication> #include <QtCore/QDebug> #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <iostream> QT_USE_NAMESPACE int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); const QSerialPortInfo info("ttyUSB0"); qDebug() << "Name : " << info.portName(); qDebug() << "Description : " << info.description(); qDebug() << "Manufacturer: " << info.manufacturer(); QSerialPort serial; serial.setPort(info); if (serial.open(QIODevice::ReadWrite)) { serial.setBaudRate(QSerialPort::Baud57600); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); serial.setDataBits(QSerialPort::Data8); while(1) { int j=0; qDebug()<<"Please enter an integer value: "; std::cin>>j; qDebug()<<"j= "<< j << endl; switch(j) { case 0: { qDebug() << "ON" << endl; const char *message = "\x4F\x6E\x0A\n"; serial.write(message); break; } case 1: { qDebug() << "OFF" << endl; const char *message = "\x4F\x66\x0A\n"; serial.write(message); break; } case 2: { qDebug() << "R --" << endl; const char *message = "\x46\x2D\x0A\n"; serial.write(message); break; } case 3: { qDebug() << "R ++" << endl; const char *message = "\x46\x2B\x0A\n"; serial.write(message); break; } default: { qDebug() << "ON" << endl; break; } } } } else { serial.close(); qDebug() << "error " <<endl; } return a.exec(); }
Pour savoir la source du probleme, j'ai testé ce programme:
là je me suis rendu compte que malgré que je demande l'envoie d'un message avant que je mets la valeur demande dans le cin, ce dernier n'est envoyé qu'à la fin du programme, du coup le message s'envoie 2 fois à la suite. Ce qui explique sur le programme précédent pourquoi aucun message n'est envoyé, car ils attendent tous la fin du programme, ce qui n'est jamais réalisé puisqu'il y a une boucle infini.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 #include <QtCore/QCoreApplication> #include <QtCore/QDebug> #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <iostream> QT_USE_NAMESPACE int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); const QSerialPortInfo info("ttyUSB0"); qDebug() << "Name : " << info.portName(); qDebug() << "Description : " << info.description(); qDebug() << "Manufacturer: " << info.manufacturer(); QSerialPort serial; serial.setPort(info); if (serial.open(QIODevice::ReadWrite)) { const char *message1 = "\x46\x2D\x0A\n"; serial.setBaudRate(QSerialPort::Baud57600); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); serial.setDataBits(QSerialPort::Data8); serial.write(message1); //1 int j=0; qDebug()<<"Please enter an integer value: "; std::cin>>j; serial.write(message1); //2 } else { serial.close(); qDebug() << "error " <<endl; } return a.exec(); }
A votre avis, que puis-je faire pour éviter ce problème?
Merci d'avance pour votre aide.
Partager