我正在尝试使用QSerialPort访问USB加密狗(其中包含SIM卡)。 加密狗已成功识别,但在尝试打开它时,我得到了许可错误。 Qt文档中的错误消息说明可能是该设备正被另一个服务访问,或者该用户没有权限。我尝试断开加密狗并再次连接相同的结果。我该怎么解决这个问题。我使用Qt 5.7在Ubuntu 16.04 64bit上。我运行的代码如下所示。
#include <QApplication>
#include <QString>
#include <QDebug>
#include <QList>
#include <QSerialPortInfo>
#include <QSerialPort>
#include <QDebug>
int main(int argc, char *argv[])
{
QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts();
QSerialPort *port = nullptr;
QString portName;
int counter = 0;
while(counter < ports.size())
{
portName = ports[counter].portName();
quint16 productId = ports[counter].productIdentifier();
quint16 vendorId = ports[counter].vendorIdentifier();
QString manufacturerName = ports[counter].manufacturer();
qDebug() << "Port Name: " << portName;
qDebug() << "Product ID:" << productId;
qDebug() << "Vendor Id: " << vendorId;
qDebug() << "Manufacturer: " << manufacturerName;
++counter;
if(manufacturerName.contains("Huawei", Qt::CaseInsensitive))
{
qDebug() << "found!" << " name: " << portName;
port = new QSerialPort(portName);
break;
}
}
//Write and send the SMS
bool opened = port->open(QIODevice::ReadWrite);
if(!opened)
{
qDebug() << "Error: " << port->error();
}
// some more code here
return 0;
}
输出如下:
Port Name: "ttyS4"
Product ID: 11799
Vendor Id: 32902
Manufacturer: ""
Port Name: "ttyUSB0"
Product ID: 5382
Vendor Id: 4817
Manufacturer: "HUAWEI"
found! name: "ttyUSB0"
Error: QSerialPort::SerialPortError(PermissionError)
答案 0 :(得分:1)
串行设备通常位于/ dev /文件夹中,由root拥有。您可能需要root权限才能打开设备。
例如,在插入加密狗后,您可以使用以下命令获取设备的权限:
import React, { Component, PropTypes } from 'react'
如果您使用&sudo&#39;运行程序,它是否有效?还是以root身份?
在终端中,尝试运行以&#39; sudo&#39;为前缀的程序。命令。这会将您的权限提升到根级别:
ls -l /dev/ttyUSB0
答案 1 :(得分:1)
打开(以root身份)/etc/udev/rules.d/90-my-usb-dongle.rules
并写下:
SUBSYSTEM=="usb", ATTR{idVendor}=="12d1", ATTR{idProduct}=="1506", MODE="0666"
这告诉linux为你的设备设置所有的R / W权限(注意idVendor和idProduct是十六进制的。)
现在重新加载udev规则:
# udevadm control --reload-rules
再次检查