c – 如果打开设备,QSerialPort会导致程序停止(无限循环?)

我想在串行设备上写.不幸的是,我觉得QSerialPort在linux下没有正确实现.与其他方法(python)相比,我得到了!有时候!当我试着打电话时,程序挂起:

serial.open(QIODevice::ReadWrite)

我正在使用http://qt-project.org/wiki/QtSerialPort的示例(见下文). QSerialPortInfo正常工作,以便我可以在打开它之前搜索我的设备.问题出现在所有Qt 5. *系列中.我目前正在使用OpenSuse存储库中的5.3 beta.其他工具或方法证明设备正在运行(Windows或Python).

// Example use QSerialPortInfo
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)) // Hang of the program
        serial.close();
}

工作python脚本:

com_port = 4
baud_rate = '9600'
pySerial = serial.Serial(com_port, baud_rate)

编辑:
我用调试器测试过.似乎至少在Linux上是Qt 5的问题.它看起来像是与设备锁相连.

解决方法:

我不知道帕普先生在抱怨什么;我能够在没有任何更多信息的情况下重现您的问题.

在Linux上,如果具有打开的QSerialPort实例的Qt进程异常终止或者在进程退出时QSerialPort实例未被销毁,则锁定文件会挂起并可能导致问题.过时的锁文件不应该导致此问题;锁定文件包含崩溃的应用程序的PID,新的应用程序实例应该识别出不存在具有该PID的进程,并在创建新进程之前立即删除锁定. strace将反复显示有问题的锁定文件,并增加退避时间,因为新进程会反复检查过时的锁定文件是否已被删除或者其他什么.所以,删除文件(例如,/ var / lock / LCK..ttyS0);如果您运行崩溃的应用程序,您将拥有锁定文件.

随机附注:如果您通过PyQt5在Python中使用QSerialPort(顺便说一句,它确实有效!),请确保在Python解释器退出之前已经显式删除了QSerialPort实例.如果你在IPython中操作端口,那么在退出之前执行“%xdel portobject”.

这是一个愚蠢的解决方法,但是如果您正在使用其他一些机制来确保您没有运行程序的两个实例并使用相同的端口 – 或者如果您根本不关心 – 您可以删除一行代码在打开端口之前锁定文件.

恕我直言,Qt不应该首先仿效完全没有价值的Windows风格的保姆国家保护.我可以sudo rm -rf /它发生了!我甚至可以使用串口.鉴于这种不受约束的,原始的,像神一样的力量,我应该能够随时打开一个串口,但是我请…

上一篇:6.Python的Set容器


下一篇:CsvHelper 解析数据乱码处理