我想在串行设备上写入。不幸的是,我感觉 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 / 然后它就发生了!我什至可以 rm 串行端口。有了如此不受约束、原始、神一般的力量,我应该能够随时随地打开串行端口......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)