c++ 与Thorlabs KDC101控制器的串行端口通信(APT协议)不工作

fwzugrvs  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(194)

我试图通过串口连接使用Linux上的Qt和X1 E0 F1 X与我的Thorlabs KDC 101控制器通信。我可以打开COM端口,也可以将所需的字节写入此端口,但控制器没有任何形状或形式的响应(虽然控制器功能齐全)。
我对Qt非常陌生,编写了以下代码行来与控制器对话:
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;
}

项目文件如下所示:

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

执行此程序将返回COM端口的正确名称以及控制器的正确序列号,并确认已将6个字节写入串行端口。除此之外,什么也不会发生。
“消息”对应于应该使控制器的LED面板 Flink 以识别其自身的命令(Thorlabs APT communication protocol,第47页)。不幸的是,这种情况没有发生。我还尝试了一些其他消息,再次没有任何响应。
有谁能告诉我我做错了什么吗?将不胜感激!

6rqinv9w

6rqinv9w1#

我看到您没有设置通道标识字节(#3,从1开始);如果我没有弄错的话,所有的thorlabs单位都至少有一个“通道”,所以你绝对应该尝试这样做。
如果这不起作用,则装置可能是卡槽型,这意味着您需要将“通用”命令寻址到装置的“母板”(地址字节0x 11),将运动命令寻址到“bay 1”(0x 21),而不是“通用USB x50”

相关问题