- 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/
我在Windows 10中使用一些简单的Powershell代码遇到了这个奇怪的问题,我认为这可能是我做错了,但我不是Powershell的天才。 我有这个: $ix = [System.Net.Dn
var urlsearch = "http://192.168.10.113:8080/collective-intellegence/StoreClicks?userid=" + userId +
我有一个非常奇怪的问题,过去两天一直让我抓狂。 我有一个我试图控制的串行设备(LS 100 光度计)。使用设置了正确参数的终端(白蚁),我可以发送命令(“MES”),然后是定界符(CR LF),然后我
我目前正试图让无需注册的 COM 使用 Excel 作为客户端,使用 .NET dll 作为服务器。目前,我只是试图让概念验证工作,但遇到了麻烦。 显然,当我使用 Excel 时,我不能简单地使用与可
我开发了简单的 REST API - https://github.com/pavelpetrcz/MandaysFigu - 我的问题是在本地主机上,WildFly 16 服务器的应用程序运行正常。
我遇到了奇怪的情况 - 从 Django shell 创建一些 Mongoengine 对象是成功的,但是从 Django View 创建相同的对象看起来成功,但 MongoDB 中没有出现任何数据。
我是 flask 的新手,只编写了一个相当简单的网络应用程序——没有数据库,只是一个航类搜索 API 的前端。一切正常,但为了提高我的技能,我正在尝试使用应用程序工厂和蓝图重构我的代码。让它与 pus
我的谷歌分析 JavaScript 事件在开发者控制台中运行得很好。 但是当从外部 js 文件包含在页面上时,它们根本不起作用。由于某种原因。 例如; 下面的内容将在包含在控制台中时运行。但当包含在单
这是一本名为“Node.js 8 the Right Way”的书中的任务。你可以在下面看到它: 这是我的解决方案: 'use strict'; const zmq = require('zeromq
我正在阅读文本行,并创建其独特单词的列表(在将它们小写之后)。我可以使它与 flatMap 一起工作,但不能使它与 map 的“子”流一起工作。 flatMap 看起来更简洁和“更好”,但为什么 di
我正在编写一些 PowerShell 脚本来进行一些构建自动化。我发现 here echo $? 根据前面的语句返回真或假。我刚刚发现 echo 是 Write-Output 的别名。 写主机 $?
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我将一个工作 View Controller 类从另一个项目复制到一个新项目中。我无法在新项目中加载 View 。在旧项目中我使用了presentModalViewController。在新版本中,我
我对 javascript 很陌生,所以很难看出我哪里出错了。由于某种原因,我的功能无法正常工作。任何帮助,将不胜感激。我尝试在外部 js 文件、头部/主体中使用它们,但似乎没有任何效果。错误要么出在
我正在尝试学习Flutter中的复选框。 问题是,当我想在Scaffold(body :)中使用复选框时,它正在工作。但我想在不同的地方使用它,例如ListView中的项目。 return Cente
我们当前使用的是 sleuth 2.2.3.RELEASE,我们看不到在 http header 中传递的 userId 字段没有传播。下面是我们的代码。 BaggageField REQUEST_I
我有一个组合框,其中包含一个项目,比如“a”。我想调用该组合框的 Action 监听器,仅在手动选择项目“a”完成时才调用。我也尝试过 ItemStateChanged,但它的工作原理与 Action
你能看一下照片吗?现在,一步前我执行了 this.interrupt()。您可以看到 this.isInterrupted() 为 false。我仔细观察——“这个”没有改变。它具有相同的 ID (1
我们当前使用的是 sleuth 2.2.3.RELEASE,我们看不到在 http header 中传递的 userId 字段没有传播。下面是我们的代码。 BaggageField REQUEST_I
我正在尝试在我的网站上设置一个联系表单,当有人点击发送时,就会运行一个作业,并在该作业中向所有管理员用户发送通知。不过,我在失败的工作表中不断收到此错误: Illuminate\Database\El
我是一名优秀的程序员,十分优秀!