在你提供的代码中,Temp
的值应该是一个整数(50),但是你使用 std::get<int64_t>(data.second)
来获取这个值可能导致了问题。原因有几个方面:
类型不匹配:从 D-Bus 获取到的
Temp
值是一个int32_t
或者uint32_t
类型,而不是int64_t
。如果你的实现中将其存储为小于 64 位的整数,而你用的是 64 位变量来接收它,那么会出现类型不匹配的问题。Variant 使用不当:如果你使用的是
std::variant
等类似结构,那么你需要确保正确处理所有可能的类型。如果 D-Bus 返回的数据类型不是预期的整型,则会引发异常。Debugging 输出:建议在尝试提取值之前,打印出数据类型信息,以便确认该值实际存储的是什么类型。例如,可以通过以下方式检查:
for (const auto& data : properties)
{
std::cout << "data.first : " << data.first << std::endl;
if (data.first == "CardModel")
{
cardModel = std::get<std::string>(data.second);
}
else if (data.first == "Temp")
{
// 打印出当前值和数据类型
std::cout << "Type of Temp: " << data.second.index() << std::endl; // 如果使用std::variant
if (std::holds_alternative<int32_t>(data.second)) // 假设 Temp 是 int32_t
{
temp = static_cast<int64_t>(std::get<int32_t>(data.second));
std::cout << "temp : " << temp << std::endl;
}
else if (std::holds_alternative<uint32_t>(data.second)) // 假设 Temp 也可能是 uint32_t
{
temp = static_cast<int64_t>(std::get<uint32_t>(data.second));
std::cout << "temp : " << temp << std::endl;
}
else
{
std::cerr << "Unexpected type for Temp!" << std::endl;
}
}
}
- DBus 返回的数据结构:根据返回的信息,确保你对返回数据进行正确解读,有时它们可能包含额外的信息或不同格式的数据。因此,在解析这些属性时要谨慎并考虑多种可能性。
通过上述方法,你应该能够找出为什么无法正确获取到温度值的原因,并据此进行调整。
内容由零声教学AI助手提供,问题来源于学员提问