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

问题描述 投票:0回答:2

我正在尝试使用 Linux 上的 Qt 和 Thorlabs APT 通信协议通过串行端口连接与我的 Thorlabs KDC101 控制器进行通信。我可以打开 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 面板闪烁以识别自身的命令(Thorlabs APT 通信协议,第 47 页)。不幸的是,这并没有发生。我还尝试了一些其他消息,同样没有任何回复。

谁能告诉我我做错了什么?将不胜感激!

c++ qt serial-port serial-communication
2个回答
0
投票

我看到你没有设置通道标识字节(#3,从1开始);如果我没记错的话,所有 thorlabs 设备都至少有一个“通道”,所以你绝对应该尝试这样做。

如果这不起作用,则该设备可能是卡槽类型,这意味着您需要将“常规”命令发送到设备的“主板”(地址字节 0x11),并将运动命令发送到“托架” 1' (0x21),而不是'通用 USB x50'


0
投票

我发现自己和作者的处境一样,这个问题的答案花了我两天的时间来调试,而且很简单,你需要冲洗一下。

qint64 bytesWritten = port.write(message);
port.flush();// <--

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

port.close();

此外,我想补充一点,您应该在断开连接之前等待写入,但对于一个小示例代码,我认为没有必要。

© www.soinside.com 2019 - 2024. All rights reserved.