我正在尝试使用 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 页)。不幸的是,这并没有发生。我还尝试了一些其他消息,同样没有任何回复。
谁能告诉我我做错了什么?将不胜感激!
我看到你没有设置通道标识字节(#3,从1开始);如果我没记错的话,所有 thorlabs 设备都至少有一个“通道”,所以你绝对应该尝试这样做。
如果这不起作用,则该设备可能是卡槽类型,这意味着您需要将“常规”命令发送到设备的“主板”(地址字节 0x11),并将运动命令发送到“托架” 1' (0x21),而不是'通用 USB x50'
我发现自己和作者的处境一样,这个问题的答案花了我两天的时间来调试,而且很简单,你需要冲洗一下。
qint64 bytesWritten = port.write(message);
port.flush();// <--
qDebug() << bytesWritten << "bytes written to serial port.";
port.close();
此外,我想补充一点,您应该在断开连接之前等待写入,但对于一个小示例代码,我认为没有必要。