我正在使用Qt编写一个C ++程序,它从串行线读取数据。数据的“生产者”是Arduino UNO委员会。
Arduino代码非常简单。目前,它只生成一个随机数并通过串行线发送。这是代码:
long randNumber;
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
}
void loop() {
randNumber = random(300);
Serial.write(randNumber);
delay(10);
}
我使用Arduino的“串行监视器”来验证数据是否来自串行线。
在Qt方面,我有一个工作线程,应该读取串行数据并相应地更新UI上的图。工作线程肯定在运行,并且此代码正在执行(我已经检查过)。我的“端口列表”中只有一个设备出现,它是Arduino,所以目前我连接到它。这是代码:
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();
}
不幸的是,从来没有任何字节可用。它成功打开串口,但没有字节通过。我在这做错了什么?有任何想法吗?谢谢!
答案 0 :(得分:1)
您忘记在bytesAvailable()之前添加waitForReadyRead()。
答案 1 :(得分:0)
来自https://www.arduino.cc/en/Serial/Write:
Serial.write(VAL)
val:要作为单个字节发送的值
如果你写一个数字Arduino只发送一个字节,如果你想发送一个长,那么你必须将它作为一个数组分解并发送数组(或获取指向长地址的指针并发送每一个的字节)。
由于您的Qt代码需要读取四个字节,因此永远不会执行if。