使用QSerialPort打开USB加密狗时出现权限错误

时间:2016-08-16 14:56:32

标签: c++ qt

我正在尝试使用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)

2 个答案:

答案 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

再次检查