Mal*_*lte 2 c++ casting bitwise-operators
这是我的问题:
我正在QtCreator中编写一个程序,它读出一些电池数据(电压,电流......).每个值以两个字节传递,我必须将它们组合成UINT16. 有时我的程序会正确执行并显示正确的值(大约12V).但有些时候它不起作用,并显示约65V.仅当我已将负载连接到电池时才会出现此问题.然后它有时说65V,有时说12V.我使用较旧的程序来观察我从电池获得的数据,这些数据一直表示大约12V,所以不是数据有什么不对.
这是我在我的实际计划中写的:
voltage = data[6] << 8;
voltage = voltage | data[7];
Run Code Online (Sandbox Code Playgroud)
到目前为止我发现了什么:
如果电压达到一个特殊值(例如从12.XV下降到11.XV),则不会出现问题,似乎没有系统.
我已经将我得到的值转换为二进制数,以查看是否有任何交换.不是这种情况.
旧程序执行此操作,与我的实际程序中的相同:
voltage = data[6]<<8;
voltage|= data[7];
Run Code Online (Sandbox Code Playgroud)
编辑: - 这是我所知道的交付数据:
格式:无符号整数
单位:mV
范围:0到65,535 mV ==> 1000 = 1V
有关程序如何工作的更多信息可能有用:
最奇怪的是它有时会在施加负载时起作用,如果我等待一段时间它不再起作用,那么突然它再次起作用等等,无论电压是多少.
EDIT2:
节目是不同的,除了我的通道,有一切都不同.我只是在阅读这段电池数据/我建造这个区域.旧程序是使用MSVisual Studio 2009 C++ Express编写的.对于新程序,我使用QtCreator和Mingw4.8作为编译器.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;
}
}
Run Code Online (Sandbox Code Playgroud)
两个程序的目标是相同的,我使用相同的电池.
这是我的猜测:如果您的数据[7]是带符号的char(显式或由编译器将char作为有符号值处理),如果比例因子为0.1伏,那么从12.7伏到12.8伏会产生数据[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;
Run Code Online (Sandbox Code Playgroud)
您可以将unsigned int更改为UINT16.您可能会丢失一些括号(基于运算符优先级)并删除最后一个"&0xffff",但这是明确的.