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
相关产品推荐
相关产品推荐

