1

在带有 Qt 5.3 的 Ubuntu 14.04 上使用此处的示例

 foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
    qDebug() << "Name        : " << info.portName();
    qDebug() << "Description : " << info.description();
    qDebug() << "Manufacturer: " << info.manufacturer();

    // Example use QSerialPort
    QSerialPort serial;
    serial.setPort(info);
    if (serial.open(QIODevice::ReadWrite)){
        serial.errorString();
        serial.close();
    }
}

输出:

Name "ttyACM2"
Description "E5-00"
Manufacturer "Nokia"
"No such File or Directory"

从代码看来,QSerialPortInfo 已正确检测到端口,但即使 serial.open() 返回 true,errorString() 也会返回“没有这样的文件或目录”。迫切需要一个解决方案。

4

1 回答 1

2

我知道这听起来很有趣,但我只是通过简单地确保端口名称是串行设备的绝对路径来解决这个问题。

在我分发使用“macdeployqt”创建的构建之前,这个问题对我们来说并不明显。使用 Qt Creator 创建的调试版本连接良好(我们分发的 Windows 版本也运行良好)。但是部署的构建会给出 DeviceNotFound 错误,错误文本为“没有这样的文件或目录。

修复很简单,只需在调用 QSerialPort::open() 之前像这样准备端口名称:

#ifdef __APPLE__
// mac only
        comPort.name = "/dev/cu." + info.portName();
// end mac only
#else
        comPort.name = info.portName();
#endif

当然,这是特定于 OS X 的(“usbserial*”端口实际上是“/dev/cu.usbserial*”),但如果您知道 /dev/ 中的实际端口名称,类似的东西在 Linux 上也适用。此外,我一直只是简单地使用 QSerialPort::setPortName 而不是 setPort,因为您尝试这样做,所以您可能想尝试一下。

于 2015-03-11T21:15:12.510 回答