You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下Qt基于APT协议与Thorlabs KDC101串口通信无响应问题

问题

在Linux系统中使用Qt框架,通过串口基于Thorlabs APT通信协议与KDC101控制器通信,能成功识别COM端口、写入指定字节,但控制器完全无响应(控制器本身功能正常)。发送的message是APT协议第47页的LED闪烁命令,尝试其他命令也无效。

代码实现

main.cpp:

#include <QCoreApplication>
#include <QSerialPortInfo>
#include <QSerialPort>
#include <QDebug>
#include <QIODevice>
#include <QIODeviceBase>


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

    QByteArray message;
    QByteArray response;

    message.resize(6);
    message[0] = 0x23;
    message[1] = 0x02;
    message[2] = 0x00;
    message[3] = 0x00;
    message[4] = 0x50;
    message[5] = 0x01;


    QList<QSerialPortInfo> SerialPortList = QSerialPortInfo::availablePorts();
    foreach (QSerialPortInfo info, SerialPortList)
    {
        qDebug() << "port name:" << info.portName();
        qDebug() << "serial number:" << info.serialNumber();
    }

    QSerialPort port;
    port.setPort(SerialPortList[0]);
    port.open(QIODeviceBase::ReadWrite);

    if (!port.setBaudRate(QSerialPort::Baud115200))
    {
        qDebug() << "Error: Failed to set BAUD RATE of COM port" << port.portName() << "to 115200";
        exit(1);
    }

    if (!port.setDataBits(QSerialPort::Data8))
    {
        qDebug() << "Error: Failed to set DATA BITS of COM port" << port.portName() << "to 8";
        exit(1);
    }

    if (!port.setStopBits(QSerialPort::OneStop))
    {
        qDebug() << "Error: Failed to set STOP BITS of COM port" << port.portName() << "to 1";
        exit(1);
    }

    if (!port.setParity(QSerialPort::NoParity))
    {
        qDebug() << "Error: Failed to set PARITY of COM port" << port.portName() << "none";
        exit(1);
    }

    if (!port.setFlowControl(QSerialPort::HardwareControl))
    {
        qDebug() << "Error: Failed to set FLOW CONTROL of COM port" << port.portName() << "RTS/CTS";
        exit(1);
    }

    qint64 bytesWritten = port.write(message);

    qDebug() << bytesWritten << "bytes written to serial port.";

    port.close();

    return 0;
}

项目文件(.pro):

QT -= gui
QT += serialport

CONFIG += c++17 console
CONFIG -= app_bundle

SOURCES += \
        main.cpp

# Default rules for demployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

排查与解决建议

  • 修正串口流控设置:KDC101默认使用无流控而非硬件流控,将port.setFlowControl(QSerialPort::HardwareControl)改为port.setFlowControl(QSerialPort::NoFlowControl)。
  • 确保数据完全发送:port.write()仅将数据放入Qt发送缓冲区,需调用port.waitForBytesWritten(-1)(-1表示无限等待)确认数据全部发送到硬件后,再关闭端口。
  • 检查APT协议命令的完整性:APT协议命令需包含正确的校验和,对照协议文档重新计算你发送的6字节命令的校验值,确认message[5]是否符合要求。
  • 添加串口打开校验:打开串口后立即检查是否成功,避免后续操作基于无效的串口连接:
    if (!port.open(QIODeviceBase::ReadWrite)) {
        qDebug() << "Failed to open port:" << port.errorString();
        exit(1);
    }
    
  • 读取控制器响应:发送命令后等待并读取响应,帮助定位问题:
    if (port.waitForReadyRead(1000)) { // 等待1秒
        QByteArray response = port.readAll();
        qDebug() << "Response (hex):" << response.toHex();
    } else {
        qDebug() << "No response received";
    }
    
  • 解决Linux串口权限问题:将当前用户加入dialout组以获得串口访问权限,执行sudo usermod -aG dialout $USER后重新登录。

内容的提问来源于stack exchange,提问作者isomattis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:00:00