Использование псевдотерминала Linux для тестирования QSerialPort

Я хотел бы протестировать приложение, используя последовательные порты Qt с псевдотерминалом. Согласно справочным страницам, которые я реализовал:

// 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 с помощью псевдотерминала?

0

Решение

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 поскольку это блокирующая задача, которая препятствует выполнению цикла событий.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]