C++ 等待数据从Qt中的串行端口到达
我在qt应用程序中使用串行端口连接。 我的问题-发送命令后,我无法恢复控件(或值来自comm端口) 我有一个名为serial.cpp的类,负责串口连接。 此类包含2个队列。一个用于从通信端口保存字节,另一个用于解码消息。该类具有以下功能:C++ 等待数据从Qt中的串行端口到达,c++,qt,C++,Qt,我在qt应用程序中使用串行端口连接。 我的问题-发送命令后,我无法恢复控件(或值来自comm端口) 我有一个名为serial.cpp的类,负责串口连接。 此类包含2个队列。一个用于从通信端口保存字节,另一个用于解码消息。该类具有以下功能: void Serial::sendCommand(QString s) { QString sometext = s; QByteArray ba = QByteArray::fromHex(sometext.toLatin1());
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 Serial::sendCommand(QString s)
{
QString sometext=s;
QByteArray ba=QByteArray::fromHex(sometext.toLatin1());
串行->写入(ba);
}
void Serial::serialReceived()
{
QByteArray ba;
serialArray=serial->readAll();
用于(int i=0;i=packetSize)
{//整包都到了
对于(int i=0;ISENDCOMAND(“ee1203190209005569”);
当(串行->队列msgs.size()==0)//无限循环时,队列始终为空
{
usleep(1);
}
QVector vect2=serial->queueMsgs.toVector();
qDebug()该类继承自它的waitFor…
方法可能就是您要查找的方法。请查看
如果要异步处理串行端口,请使用readyRead
信号,并在连接到该信号的函数中执行读取。如果您不介意操作被阻塞,则您需要使用waitForReadyRead
函数
好办法
下面是使用的正确方法。此将不会阻止您的GUI,并允许您的应用程序在等待串行端口时响应用户操作
将功能连接到字节写入的信号
通过串行端口发送数据后要执行的代码应置于此函数中
将功能连接到readyRead
信号
从串行端口读取数据后要执行的代码应放在该函数中
开埠
坏方法
在某些情况下,您可以这样做,但它是阻塞的,这意味着您的GUI将在应用程序等待串行端口时冻结。我不建议这样做
开埠
发送数据
调用WaitForBytesWrited
调用waitForReadyRead
工作示例代码
Qt有一个。甚至有,它们非常值得检查。您可能最感兴趣的是和。类继承自它,它有waitFor…
方法,这可能就是您正在寻找的方法。请查看
如果要异步处理串行端口,请使用readyRead
信号,并在连接到该信号的函数中执行读取。如果您不介意操作被阻塞,则您需要使用waitForReadyRead
函数
好办法
下面是使用的正确方法。此将不会阻止您的GUI,并允许您的应用程序在等待串行端口时响应用户操作
将功能连接到字节写入的信号
通过串行端口发送数据后要执行的代码应置于此函数中
将功能连接到readyRead
信号
从串行端口读取数据后要执行的代码应放在该函数中
开埠
坏方法
在某些情况下,您可以这样做,但它是阻塞的,这意味着您的GUI将在应用程序等待串行端口时冻结。我不建议这样做
开埠
发送数据
调用WaitForBytesWrited
调用waitForReadyRead
工作示例代码
Qt有一个。甚至有,它们非常值得检查。您可能最感兴趣的是和。类继承自它,它有waitFor…
方法,这可能就是您正在寻找的方法。请查看
如果要异步处理串行端口,请使用readyRead
信号,并在连接到该信号的函数中执行读取。如果您不介意操作被阻塞,则您需要使用waitForReadyRead
函数
好办法
下面是使用的正确方法。此将不会阻止您的GUI,并允许您的应用程序在等待串行端口时响应用户操作
将功能连接到字节写入的信号
通过串行端口发送数据后要执行的代码应置于此函数中
将功能连接到readyRead
信号
从串行端口读取数据后要执行的代码应放在该函数中
开埠
坏方法
在某些情况下,您可以这样做,但它是阻塞的,这意味着您的GUI将在应用程序等待串行端口时冻结。我不建议这样做
开埠
发送数据
调用WaitForBytesWrited
调用waitForReadyRead
工作示例代码
Qt有一个。甚至有,它们非常值得检查。您可能最感兴趣的是和。类继承自它,它有waitFor…
方法,这可能就是您正在寻找的方法。请查看
如果要异步处理串行端口,请使用readyRead
信号,并在连接到该信号的函数中执行读取。如果您不介意操作被阻塞,则您需要使用waitForReadyRead
函数
好办法
以下是使用的正确方法。此将不会阻止您的GUI,并允许您的应用程序响应用户请求
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---" ;
}