使用Qt从字符设备读取

时间:2019-01-10 16:13:13

标签: qt file

我不太擅长角色设备,因此需要您的帮助。有一个字符设备(我们称之为/dev/my_light),它是一个光传感器。我必须从该文件中读取数据,并将其转换为亮度值,然后将其传递给更改屏幕亮度的亮度管理器。问题是当我在一段时间内读取该值时,我从文件中获取了旧值,我假设有一个缓冲区(同样不确定字符设备如何正常工作)。而当我使用cat /dev/my_light时,我会看到新数据!是否有可能摆脱缓冲区并立即读取刚刚写入文件的新值。这是我在Qt中的代码:

    void MySensor::updateMySensor()
    {
        Packet packet;
        packet.startByte = 0;
        packet.mantissa = 0;
        packet.exp = 0;

        d->device = ::open(d->path.toStdString().c_str(), O_RDONLY);
        if (d->device == -1)
        {
            qDebug() << Q_FUNC_INFO << "can't open the sensor";
            return;
        }

        ssize_t size = ::read(d->device, &packet, sizeof(packet));
        close(d->device);

        if (size == -1)
        {
            qDebug() << errno;
            return;
        }

        packet.exp &= 0x0F;

        float illumination = pow(2, packet.exp) * packet.mantissa * 0.045;

        if(d->singleShot) emit lightSensorIsRunning(true);
        emit illuminationRead(illumination);
    }

mySensor函数每秒被调用一次。我尝试每200毫秒调用一次,但没有帮助。照明的值会保持旧状态约7秒钟(!),而我从cat获得的值立即是新的。

提前谢谢!

1 个答案:

答案 0 :(得分:2)

我无法使用您的特定设备进行测试,但是,我将键盘用作只读设备。

程序尝试连接到键盘并读取在窗口内部和外部按下的所有键。这是一个广泛的解决方案,您必须适应以满足您的需求。

请注意,我将使用const data = { "brands": [ "accessible-icon", "accusoft", "adn", "adobe", "adversal", ], "regular": [ "address-book", "address-card", "angry", "bell", ], "solid": [ "ad", "address-book", "address-card", "adjust", "air-freshener", "align-center", ] } const result = Object.entries(data).reduce((acc, [key, value]) => ({ ...acc, [key]: value.map(obj => key + '-' + obj) }), {}) console.log(result)打开文件,这意味着分别以只读模式打开并且不等待事件触发(某些通知​​程序需要知道数据何时准备就绪!)。

您需要超级用户权限才能运行此示例!

O_RDONLY | O_NONBLOCK