在Qt中等待数据从串口到达
wait for data arrive from serial port in Qt
我在qt应用程序中使用串口连接。我的问题-在发送命令后,我无法获得控制(或值来自通信端口)。
我有一个名为serial.cpp的类,负责串口连接。这个类包含2个队列。一个用于从通信端口保存字节,第二个用于解码消息。该类具有以下函数:
void Serial::sendCommand(QString s)
{
QString sometext = s;
QByteArray ba = QByteArray::fromHex(sometext.toLatin1());
serial->write(ba);
}
void Serial::serialReceived()
{
QByteArray ba ;
serialArray = serial->readAll();
for (int i=0; i<sizeof(serialArray);i++)
{
queueBytes.enqueue(serialArray[i]); // queue for saving the bytes
}
QVector<int> vect = queueBytes.toVector();
packetSize = 6;
if (vect.size() >= packetSize)
{ // the whole packet arrived
for (int i =0 ;i<packetSize;i++)
{
item = queueBytes.dequeue();
ba.append(item);
}
}
if (ba.toHex() == "12ee02010176")
queueMsgs.enqueue("ACK");
// ... and so on
}
下面是调用类:
void Engine::onNewMessageFromAppReceived(int msgId,QString args)
{
serial->sendCommand("ee1203190209005569");
while (serial->queueMsgs.size() == 0) // infinite loop-the queue is always empty
{
usleep(1);
}
QVector<QString> vect2 = serial->queueMsgs.toVector();
qDebug() << vect2 << "get ack---" ;
}
请帮忙
QSerialPort
类继承自QIODevice
,其中waitFor...
方法可能是您正在寻找的。看看这些文档。
如果您想异步处理串行端口,请使用readyRead
信号并在连接到该信号的函数中执行读取。如果你不介意操作阻塞,waitForReadyRead
函数就是你要找的。
好方法
这是使用Qt的信号和插槽机制的正确方法。这个将不会阻塞您的GUI,并让您的应用程序响应用户的操作,即使你在等待串行端口。
- 连接
bytesWritten
信号
通过串口发送数据后要执行的代码应该放在这个函数中。 - 连接
readyRead
信号从串口读取数据后要执行的代码应该放在这个函数中。 - 打开端口
不好的方式
在某些情况下,你可以这样做,但它是阻塞,这意味着你的GUI将冻结,而你的应用程序正在等待串行端口。我不建议你这样做。- 打开端口
- 呼叫
waitForBytesWritten
呼叫
waitForReadyRead
工作示例代码
Qt有大量的工作示例代码。甚至还有关于如何使用QSerialPort
的示例,它们非常值得一试。您可能对异步写入器示例和异步读取器示例最感兴趣。
相关文章:
- 为什么我要从串口读取垃圾?
- Boost Asio SerialPort。无法创建并打开串口服务
- 如何在QtWidget中使用c++串口发送数据
- 如何插入十六进制值并发送到串口?
- Qt串行端口数据接收
- 发送特定字节模式时串行端口数据损坏
- 为什么Qt(4.8)串口(qextserialport)分两部分从设备读取数据
- 串行数据包丢失 - QTS天线端口
- 通过c++中的串口发送数据
- 将十六进制数据发送到串口
- 无法读取串行数据,除非第三方程序打开端口
- 在Ubuntu中使用c++从串口读取数据到USB
- 无法向串口写入数据
- 接收在第一次读取之前被发送到串口的数据
- 通过RS232串口发送数据到条码扫描器
- 如何在c++中从串口发送和读取数据
- 在Qt中等待数据从串口到达
- 什么是c++中串口数据读取的回调函数?下面是Matlab中的一个例子
- RFID虚拟串口读取数据时超时
- Boost asio串口最初发送坏数据