使用Linux伪终端测试QSerialPort

3

我想使用Qt串口和伪终端测试一个应用程序。根据man手册,我实现了以下内容:

// open master
QSerialPort master("/dev/ptmx");
master.open(QSerialPort::ReadWrite);
int master_fd = master.handle();

// get device name of slave pseudoterminal
constexpr size_t PTSNAME_BUFFER_LENGTH = 128;
char ptsname_buffer[PTSNAME_BUFFER_LENGTH];
if (ptsname_r(master_fd, ptsname_buffer, PTSNAME_BUFFER_LENGTH) != 0)
    return 0;

// grant access to the slave
if (grantpt(master_fd) != 0)
    return 0;

// unlock the slave
if (unlockpt(master_fd) != 0)
    return 0;

// open slave
std::cout << "Slave pseudoterminal: " << ptsname_buffer << std::endl;
QSerialPort slave(ptsname_buffer);
slave.open(QSerialPort::ReadWrite);

// test communication
master.write("Hello World");
std::this_thread::sleep_for(std::chrono::milliseconds(500));
std::cout << "Received: " << slave.readAll().toStdString() << std::endl;

创建从设备似乎是有效的(在我的情况下,它被创建在/dev/pts/2)。然而,slave.readAll()命令总是返回一个空字符串。

是否可能使用伪终端测试QSerialPort?


无论如何最好使用tty0tty。是的,在qt事件循环中需要使用waitForXX()方法。 - Denis Shienkov
1个回答

2

Qt 在事件循环中执行,因此您需要等待通信被处理。在 Qt 中,您应该使用信号进行异步工作:

main.cpp

#include <QCoreApplication>
#include <QSerialPort>

#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QSerialPort master("/dev/ptmx");
    if(!master.open(QSerialPort::ReadWrite))
        std::cout<<"The master port was not opened";

    int master_fd = master.handle();

    // get device name of slave pseudoterminal
    constexpr size_t PTSNAME_BUFFER_LENGTH = 128;
    char ptsname_buffer[PTSNAME_BUFFER_LENGTH];
    if (ptsname_r(master_fd, ptsname_buffer, PTSNAME_BUFFER_LENGTH) != 0)
        return -1;

    // grant access to the slave
    if (grantpt(master_fd) != 0)
        return -1;

    // unlock the slave
    if (unlockpt(master_fd) != 0)
        return -1;

    // open slave
    std::cout << "Slave pseudoterminal: " << ptsname_buffer << std::endl;
    QSerialPort slave(ptsname_buffer);
    if(!slave.open(QSerialPort::ReadWrite))
        std::cout<<"The slave port was not opened";

    QObject::connect(&slave, &QSerialPort::readyRead, [&](){
        std::cout << "Received: " << slave.readAll().toStdString() << std::endl;
        a.quit();
    });
    // test communication
    master.write("Hello World");
    return a.exec();
}

输出:

Slave pseudoterminal: /dev/pts/3
Received: Hello World

注意:不要使用std::this_thread::sleep_for,因为它是一个阻塞任务,会阻止事件循环的执行。


Note: 不要使用 std::this_thread::sleep_for,因为它会阻塞程序的事件循环。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接