[英]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
,非常值得一试。 您可能对异步 编写器示例和异步阅读器示例最感兴趣。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.