小编Mal*_*lte的帖子

"按位或"有时会起作用

这是我的问题:

我正在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

  • 对于'电压​​'变量,我在新程序中选择了UINT16.
  • 在我的旧代码中,我使用无符号短路来表示"电压".当我在新程序中更改此项时,这对我的问题没有影响.

有关程序如何工作的更多信息可能有用:

  • 读出缓冲区(14个字节)
  • 检查第一个字节是否为'$'(相关数据的徽章)
  • 检查第二个字节是否为7(电池数据的标志)
  • 那么做转移和按位或我上面写的
  • 打印结果

最奇怪的是它有时会在施加负载时起作用,如果我等待一段时间它不再起作用,那么突然它再次起作用等等,无论电压是多少.

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)

c++ casting bitwise-operators

2
推荐指数
1
解决办法
199
查看次数

标签 统计

bitwise-operators ×1

c++ ×1

casting ×1