我试图通过串口连接使用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页)。不幸的是,这种情况没有发生。我还尝试了一些其他消息,再次没有任何响应。
有谁能告诉我我做错了什么吗?将不胜感激!
1条答案
按热度按时间6rqinv9w1#
我看到您没有设置通道标识字节(#3,从1开始);如果我没有弄错的话,所有的thorlabs单位都至少有一个“通道”,所以你绝对应该尝试这样做。
如果这不起作用,则装置可能是卡槽型,这意味着您需要将“通用”命令寻址到装置的“母板”(地址字节0x 11),将运动命令寻址到“bay 1”(0x 21),而不是“通用USB x50”