相关疑难解决方法(0)

发送一系列命令并等待响应

我必须更新连接到串行端口的设备上的固件和设置.由于这是通过一系列命令完成的,因此我发送命令并等待直到我收到答案.在answere(多行)里面,我搜索一个字符串,指示操作是否成功完成.

Serial->write(“boot”, 1000);
Serial->waitForKeyword(“boot successful”);
Serial->sendFile(“image.dat”);
…
Run Code Online (Sandbox Code Playgroud)

所以我为这个阻塞读/写方法创建了一个新的Thread.在线程内部我使用了waitForX()函数.如果我调用watiForKeyword(),它将调用readLines()直到它检测到关键字或超时

bool waitForKeyword(const QString &keyword)
{
    QString str;

    // read all lines
    while(serial->readLines(10000))
    {
        // check each line
        while((str = serial->getLine()) != "")
        {
            // found!
            if(str.contains(keyword))
                return true;
        }
    }
    // timeout
    return false;
}
Run Code Online (Sandbox Code Playgroud)

readLines()读取所有可用的东西并将其分成行,每行放在一个QStringList中,并获取一个我调用getLine()的字符串,它返回列表中的第一个字符串并删除它.

bool SerialPort::readLines(int waitTimeout)
{
if(!waitForReadyRead(waitTimeout))
{
    qDebug() << "Timeout reading" << endl;
    return false;
}

QByteArray data = readAll();
while (waitForReadyRead(100))
    data += readAll();

char* begin = data.data();
char* ptr = strstr(data, "\r\n");

while(ptr != NULL) …
Run Code Online (Sandbox Code Playgroud)

c++ qt serial-port blocking

7
推荐指数
1
解决办法
3502
查看次数

Qt的QBuffer线程安全吗?

我在模式中使用QBufferReadWrite.一名工作人员QThread将数据推入缓冲区,另一名工作人员QThread从中读取数据

QBuffer保证线程安全还是我需要派生QBuffer并添加互斥件?

c++ qt thread-safety

4
推荐指数
1
解决办法
5000
查看次数

处理其他信号时等待信号

我的Qt应用程序与串行设备通信,偶尔必须等待此设备发送一个字节.为了实现这一点,我创建了一个新的eventloop,一旦串行缓冲区中有可用信息就会退出:

unsigned char MyClass::waitForDevice(int timeout)
{
    QEventLoop wait;
    connect(d_serial, SIGNAL(readyRead()), &wait, SLOT(quit()));
    if (timeout > 0)
        QTimer::singleShot(timeout, &wait, SLOT(quit()));

    wait.exec();
    return static_cast<unsigned char>(d_serial->read(1)[0]);
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,当应用程序在等待时,即在eventloop运行时,我需要能够在GUI中按下按钮时与串行设备进行通信.天真地,我尝试将信号连接到执行此操作的插槽,但我发现插槽仅 eventloop终止执行.

我试着,没有任何运气,有一个单独的QThread运行调用qApp->processEvents()无限循环,当eventloop终止时终止.这没用,我不太清楚为什么不呢.解决这个问题的规范方法是什么?

c++ qt

1
推荐指数
1
解决办法
430
查看次数

标签 统计

c++ ×3

qt ×3

blocking ×1

serial-port ×1

thread-safety ×1