Qt 没有从 arduino 接收串行数据
Qt not receiving serial data from arduino
我正在使用 Qt 编写一个从串行线路读取数据的 C++ 程序。数据的"producer"是一块Arduino UNO板。
Arduino代码非常简单。目前,它只是生成一个随机数并通过串行线路发送。这是代码:
long randNumber;
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
}
void loop() {
randNumber = random(300);
Serial.write(randNumber);
delay(10);
}
我已经使用 Arduino 的 "serial monitor" 来验证数据是否通过串行线。
在 Qt 方面,我有一个工作线程应该读取串行数据并相应地更新 UI 上的绘图。工作线程肯定是 运行,这段代码正在执行(我已经检查过了)。我的 "port list" 中只有一个设备出现,它是 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();
}
不幸的是,从来没有可用的字节。它成功打开串口,但没有字节通过。我在这里做错了什么?有任何想法吗?谢谢!
来自https://www.arduino.cc/en/Serial/Write:
Serial.write(val)
val: a value to send as a single byte
如果你写一个数字,Arduino 只发送一个字节,如果你想发送一个 long,那么你必须将它分解为一个数组并发送该数组(或者获取一个指向 long 地址的指针并发送每个字节)。
由于您的 Qt 代码期望读取四个字节,因此永远不会执行 if。
您忘记在 bytesAvailable() 之前添加 waitForReadyRead()。
我正在使用 Qt 编写一个从串行线路读取数据的 C++ 程序。数据的"producer"是一块Arduino UNO板。
Arduino代码非常简单。目前,它只是生成一个随机数并通过串行线路发送。这是代码:
long randNumber;
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
}
void loop() {
randNumber = random(300);
Serial.write(randNumber);
delay(10);
}
我已经使用 Arduino 的 "serial monitor" 来验证数据是否通过串行线。
在 Qt 方面,我有一个工作线程应该读取串行数据并相应地更新 UI 上的绘图。工作线程肯定是 运行,这段代码正在执行(我已经检查过了)。我的 "port list" 中只有一个设备出现,它是 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();
}
不幸的是,从来没有可用的字节。它成功打开串口,但没有字节通过。我在这里做错了什么?有任何想法吗?谢谢!
来自https://www.arduino.cc/en/Serial/Write:
Serial.write(val)
val: a value to send as a single byte
如果你写一个数字,Arduino 只发送一个字节,如果你想发送一个 long,那么你必须将它分解为一个数组并发送该数组(或者获取一个指向 long 地址的指针并发送每个字节)。
由于您的 Qt 代码期望读取四个字节,因此永远不会执行 if。
您忘记在 bytesAvailable() 之前添加 waitForReadyRead()。