我有一个 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
获得的值立即是新的。
我无法使用您的特定设备进行测试,但是,我将键盘用作只读设备。
程序尝试连接键盘并读取窗口内外按下的所有按键。这是一个广泛的解决方案,您必须适应它才能满足您的需求。
请注意,我使用
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(¬ifier, &QSocketNotifier::activated, ¬ifier, [&](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();
}