如何在QSerialPort打开的串口中设置低延迟
How to set low latency in serial port open by QSerialPort
我已经开发了一个应用程序,它与传感器进行串行通信。
由于未知原因,我使用 QT C++ Framework 时接收到的数据很慢。
我已经测试了示例代码 (https://www.pjrc.com/tmp/host_software/receive_test.c)。我使用此示例代码在适当的时间收到了数据。
在这里我发现低延迟模式设置为 ASYNC_LOW_LATENCY
.
我已阅读 (https://doc.qt.io/qt-5/qserialport.html) 但不知道如何使用 QSerialPort
设置低延迟
问题 1:请给出 sample code
在 qt c++ with QSerialPort 中如何设置低延迟。
请不要建议在 qt c++ 中编写 c 代码,这不是解决此问题的正确方法。
QSerialPort *pUsbSerialPort;
pUsbSerialPort = new QSerialPort();
if(IS_VALID_OBJ(pUsbSerialPort))
{
pUsbSerialPort->setPortName(sSerialPort);
pUsbSerialPort->setBaudRate(BaudRate);
pUsbSerialPort->setDataBits(QSerialPort::Data8);
pUsbSerialPort->setParity(QSerialPort::NoParity);
pUsbSerialPort->setStopBits(QSerialPort::OneStop);
pUsbSerialPort->setFlowControl(QSerialPort::NoFlowControl);
if(pUsbSerialPort->open(QIODevice::ReadWrite))
{
connect(pUsbSerialPort, &QSerialPort::readyRead,this , &Laser::LaserReadyRead);
PRINT_INFO("Serial port successfully initialized" + sSerialPort);
bIsServeropen = true;
}
else
{
PRINT_INFO("Serial port initialization failed" + sSerialPort);
return;
}
}
else
{
PRINT_INFO(" Failed to assign memory to pUsbSerialPort" + sSerialPort);
return;
}
描述符是QSerialPort的句柄:
#include <sys/ioctl.h>
#include <linux/serial.h>
// ...
pUsbSerialPort->open(QIODevice::ReadOnly);
int fd = pUsbSerialPort->handle();
struct serial_struct kernel_serial_settings;
::ioctl(fd, TIOCGSERIAL, &kernel_serial_settings);
kernel_serial_settings.flags |= ASYNC_LOW_LATENCY;
::ioctl(fd, TIOCSSERIAL, &kernel_serial_settings);
我已经开发了一个应用程序,它与传感器进行串行通信。 由于未知原因,我使用 QT C++ Framework 时接收到的数据很慢。
我已经测试了示例代码 (https://www.pjrc.com/tmp/host_software/receive_test.c)。我使用此示例代码在适当的时间收到了数据。
在这里我发现低延迟模式设置为 ASYNC_LOW_LATENCY
.
我已阅读 (https://doc.qt.io/qt-5/qserialport.html) 但不知道如何使用 QSerialPort
设置低延迟问题 1:请给出 sample code
在 qt c++ with QSerialPort 中如何设置低延迟。
请不要建议在 qt c++ 中编写 c 代码,这不是解决此问题的正确方法。
QSerialPort *pUsbSerialPort;
pUsbSerialPort = new QSerialPort();
if(IS_VALID_OBJ(pUsbSerialPort))
{
pUsbSerialPort->setPortName(sSerialPort);
pUsbSerialPort->setBaudRate(BaudRate);
pUsbSerialPort->setDataBits(QSerialPort::Data8);
pUsbSerialPort->setParity(QSerialPort::NoParity);
pUsbSerialPort->setStopBits(QSerialPort::OneStop);
pUsbSerialPort->setFlowControl(QSerialPort::NoFlowControl);
if(pUsbSerialPort->open(QIODevice::ReadWrite))
{
connect(pUsbSerialPort, &QSerialPort::readyRead,this , &Laser::LaserReadyRead);
PRINT_INFO("Serial port successfully initialized" + sSerialPort);
bIsServeropen = true;
}
else
{
PRINT_INFO("Serial port initialization failed" + sSerialPort);
return;
}
}
else
{
PRINT_INFO(" Failed to assign memory to pUsbSerialPort" + sSerialPort);
return;
}
描述符是QSerialPort的句柄:
#include <sys/ioctl.h>
#include <linux/serial.h>
// ...
pUsbSerialPort->open(QIODevice::ReadOnly);
int fd = pUsbSerialPort->handle();
struct serial_struct kernel_serial_settings;
::ioctl(fd, TIOCGSERIAL, &kernel_serial_settings);
kernel_serial_settings.flags |= ASYNC_LOW_LATENCY;
::ioctl(fd, TIOCSSERIAL, &kernel_serial_settings);