使用 Qt 从字符设备读取

问题描述 投票:0回答:1

我有一个 char 设备(我们称之为

/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
获得的值立即是新的。

qt file
1个回答
3
投票

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

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

请注意,我使用

O_RDONLY | O_NONBLOCK
打开文件,这意味着以只读模式打开,并且不等待事件被触发(某些通知程序需要知道数据何时准备好!)。

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

#include <QtCore>
#include <fcntl.h>
#include <linux/input.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    const char *device_name = "/dev/input/by-path/platform-i8042-serio-0-event-kbd";

    int descriptor = open(device_name, O_RDONLY | O_NONBLOCK);

    if (descriptor < 0)
    {
        qDebug() << "Error" << strerror(errno);
        return a.exec();
    }

    QFile device;

    if (!device.open(descriptor, QFile::ReadOnly))
    {
        qDebug() << "Error" << qPrintable(device.errorString());
        return a.exec();
    }

    QSocketNotifier notifier(device.handle(), QSocketNotifier::Read);

    QObject::connect(&notifier, &QSocketNotifier::activated, &notifier, [&](int socket){
        Q_UNUSED(socket)

        struct input_event ev;

        QByteArray data = device.readAll();

        qDebug() << "Event caught:"
                 << "\n\nDATA SIZE" << data.size()
                 << "\nSTRUCT COUNT" << data.size() / int(sizeof(input_event))
                 << "\nSTRUCT SIZE" << sizeof(input_event);

        qDebug() << ""; //New line

        while (data.size() >= int(sizeof(input_event)))
        {
            memcpy(&ev, data.data(), sizeof(input_event));

            data.remove(0, int(sizeof(input_event)));

            qDebug() << "TYPE" << ev.type << "CODE" << ev.code << "VALUE" << ev.value << "TIME" << ev.time.tv_sec;
        }

        qDebug() << ""; //New line
    });

    return a.exec();
}
© www.soinside.com 2019 - 2024. All rights reserved.