我不太擅长角色设备,因此需要您的帮助。有一个字符设备(我们称之为/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
获得的值立即是新的。
提前谢谢!
答案 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