Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 等待数据从Qt中的串行端口到达_C++_Qt - Fatal编程技术网

C++ 等待数据从Qt中的串行端口到达

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());

我在qt应用程序中使用串行端口连接。 我的问题-发送命令后,我无法恢复控件(或值来自comm端口)

我有一个名为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 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---" ;
    }