我在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---" ;
}
请你的帮助
答案 0 :(得分:3)
QSerialPort
类继承自QIODevice
,其中waitFor...
种方法可能正是您所寻找的方法。看看these docs。
如果要异步处理串行端口,请使用readyRead
信号并在连接到该信号的函数中执行读取操作。如果你不介意该操作是阻塞的,waitForReadyRead
函数就是你要找的。 p>
以下是使用Qt's signals and slots mechanism执行此操作的正确方法。这个不会阻止您的GUI,即使您在等待串口,也可以让您的应用程序响应用户操作。
bytesWritten
信号readyRead
信号
从串口读取一些数据后要执行的代码应放在此函数中。在某些情况下,您可以这样做,但它是阻止,这意味着当您的应用等待串口时,您的GUI将会冻结。我不建议这样做。
waitForBytesWritten
waitForReadyRead
Qt有vast amount of working example code。甚至有examples about how to use QSerialPort
,它们非常值得一试。您可能对async writer example和async reader example最感兴趣。