- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
这是我的问题:
我正在 QtCreator 中编写一个程序来读取一些电池数据(电压、电流等)。每个值都以两个字节的形式传递,我必须将它们组合成一个 UINT16。有时我的程序会正确并显示正确的值(大约 12V)。但其他时候它不工作并显示大约 65V。仅当我将负载连接到电池时才会出现此问题。然后它有时说 65V,有时说 12V。我使用了一个较旧的程序来观察我从电池中获得的数据,并且该数据始终显示大约 12V,所以不是数据出了问题。
这是我在实际程序中写的:
voltage = data[6] << 8;
voltage = voltage | data[7];
到目前为止我发现了什么:
如果电压达到特定值(例如从 12.X V 下降到 11.X V),则不会出现问题,其中似乎没有系统。
我已经将我得到的值转换成二进制数,看看是否有任何交换。事实并非如此。
老程序是这样做的,和我的实际程序是一样的:
voltage = data[6]<<8;
voltage|= data[7];
编辑:- 这是我对传送数据的了解:
格式:无符号整数
单位:mV
范围:0 至 65,535 mV ==> 1000 = 1V
有关该程序如何工作的更多信息,可能会有帮助:
最奇怪的是,它有时会在施加负载时工作,如果我等了一会儿它不再工作,然后突然又工作了,依此类推,无论电压是多少。
编辑2:
节目不一样,除了我的那一段,其他都不同。我只处理读取电池数据的这段话/我建立了这个区域。旧程序是使用 MSVisual Studio 2009 C++ Express 编写的。对于新程序,我使用带有 Mingw4.8 的 QtCreator 作为编译器。data[] 是 QByteArray 类型:
在.h中:UINT16电压;
在.c中:
QByteArray data = com_port.readLine(1000);
if (data[0] == '$')
{
switch (data[1])
{
case 7:
voltage = data[6]<<8;
voltage = voltage|data[7];
qDebug() << voltage;
}
}
这两个程序的目标是相同的,我使用的是相同的电池。
最佳答案
这是我的猜测:如果您的 data[7] 是带符号的 char(明确地或由您的编译器将 char 处理为带符号的值),并且如果比例因子是 0.1 伏,那么从 12.7 伏到 12.8 伏将使 data[7] 成为负值。然后你将它符号扩展到 16 位(通过隐式转换),因此你的结果值大约是 65000 - 等于大约 6500V - 类似于你似乎看到的 65V(有没有可能有几个额外的零? ).在您降至 12.7V 或更低的那一刻 - 您又回到了实际电压。
例如:
12.7 伏 = 0b01111111 ->(符号扩展到 16 位)-> 0b00000000 01111111 -> 127 -> 12.7 伏
12.8 伏 = 0b10000000 ->(符号扩展到 16 位)-> 0b11111111 10000000 -> 65408 -> 6540.8 伏
这只是一种预感 - 因为没有提供实际的类型/比例因子。
编辑:
你可能想要做的是
unsigned int voltage = ((((unsigned int)(data[6])) << 8) | (((unsigned int)data[7])&0xff)) & 0xffff;
您可以将 unsigned int 更改为您的 UINT16。您可以丢失一些括号(基于运算符优先级)并删除最后一个“&0xffff”,但这是尽可能明确的。
关于c++ - "bitwise or"有时工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19244375/
我在一个项目中有几行代码,我看不到...的值(value) buffer[i] = (currentByte & 0x7F) | (currentByte & 0x80); 它从文件中读取文件缓冲区,
为了调试目的,我在头文件中有以下程序代码。我的意图是在编译期间决定哪些消息应该打印到控制台端口,或者如果程序不是在 Debug模式下编译则根本不打印它们。 #define ALL 0xffffffff
这个问题看似重复,但实际上并非如此。我想知道如何将负数 (base-10) 转换为 32 位数字 (base-2)。例如base-10 中的 -9 相当于 base-2 中的 111111111111
如果只有AND和OR运算,如何进行XOR按位运算? 最佳答案 创建我自己的脚本语言-ChrisScript-您只需要以下内容: #!/bin/chrish bit XOR (bit A, bit B)
为什么按位非运算符(在大多数语言中为 ~)像这样转换以下值: -2 -> 1-1 -> 00 -> -11 -> -2 不应该-2转换为 2 , 1转换为 -1 , 等等。? 最佳答案 见 two's
如何使用按位运算符将两个整数相乘? 我找到了一个实现 here .有没有更好的方法来实现乘法? 例如:2 * 6 = 12 必须使用按位运算符执行。 注意:数字是任意的,不是 2 的幂 最佳答案 #i
我面临着一个相当奇怪的问题。我正在为不支持按位运算的体系结构开发编译器。然而,它处理带符号的 16 位整数算术,我想知道是否可以仅使用以下内容来实现按位运算: 加法 (c = a + b) 减法(c
遇到这样一道编程面试题。但对我来说,你怎么知道可以在这里使用位移位并不明显。好心人解释一下。谢谢。 数组的大小为 N,整数介于 0 和 1024 之间(允许重复)。另一个整数数组的大小为 M,对数
在 Pharo 中,我想对整数进行位掩码,在 Python 中如下所示: ((b1 & 0x3F) > 4) 我知道 & 和 | 在 Pharo 中工作,但我很确定它们不是按位的。 最佳答案 但你错了
if (!(y&1)) { c[x++]=d[--y]; } 我无法理解这个声明的作用。 y 是一个 int 值。 非 (!) 符号代表什么? 最佳答案 ! 将 0 转
我想知道类型转换在实践中是如何在类型之间进行的(在“嵌入式”C 中)。例如:如果我有一个 Signed 16-bit 数字,值为 -80d,11010000b,我想将它转换为 无符号 16 位。我
这是我的问题: 我正在 QtCreator 中编写一个程序来读取一些电池数据(电压、电流等)。每个值都以两个字节的形式传递,我必须将它们组合成一个 UINT16。有时我的程序会正确并显示正确的值(大约
我有一个简单的函数来测试两个数组是否互为逆数组。除了 tmp 变量外,它们看起来完全相同。一个有效,另一个无效。我一辈子都弄不明白为什么编译器会优化它——如果它确实是一个优化问题(我的编译器是 IAR
我正在开发我的第一个应用程序,其中包含多个用户的权限和角色。我的理解是最好的方法是使用 BitWise 格式。这是真的吗,还是有更好的选择? 这是我当前的测试代码,我得到了一个相当奇怪的效果。如果有人
在这里让我自己有点困惑。 我想测试一组位(3 位)是否包含某个位置的位。 if (B110 & B010 == B010) (B110 是要检查的数字,B010 是我想看看有没有的位) 上面的代码没有
我正在尝试将代码从 C 转换为 Lua,但遇到了问题。 如何在 Lua 中翻译按位与? 源 C 代码包含: if ((command&0x80)==0) ... 这怎么能在Lua中完成? 我正在
给定两个数字 L & R ,查找 L 和 R 之间的所有数字的按位与 约束 1<= L,R <= (2^32) . LL step = 1; while(L!=R) {
我完全期待投票,但这让我非常好奇,我希望至少有人能回答。我们的离散数学教授真的很喜欢旧语言,因为它们提供了大量的按位运算符。现在,他给了我们一个作业来确定以下 BASIC 语句的输出: PRINT (
我正在尝试实现以下部分中的功能:Per-commitment Secret Requirements . generate_from_seed(seed, I): P = seed f
A) int a[][]=new int[20][32]; a[2][3]=1; if(a[2][3]==1) { System.out.println("true");
我是一名优秀的程序员,十分优秀!