繁体   English   中英

QMAP <int,QByteArray> 返回错误的QByteArray

[英]QMap<int,QByteArray> return Wrong QByteArray

我在用

QMap < int, QByteArray> RegTable; (Seprate Class Variable)

存储Modbus寄存器地址和从串行端口接收的数据。 一切正常,从串行端口读取数据并正确填充到QByteArray。

qDebug() << Modbus->RegTable[RegAddr].toHex(' '); 

打印正确的数据。 但是,如果要使用它编写变量,则始终将相同的值/垃圾存储在该变量中。

    unsigned int unixTimeStamp = 0;
    qDebug() << Modbus->RegTable[RegAddr].toHex(' ');

    unixTimeStamp  = static_cast <unsigned int>Modbus->RegTable[RegAddr].at(4);
    unixTimeStamp |= static_cast <unsigned int>Modbus->RegTable[RegAddr].at(5)<<8;
    unixTimeStamp |= static_cast <unsigned int>Modbus->RegTable[RegAddr].at(6)<<16;
    unixTimeStamp |= static_cast <unsigned int>Modbus->RegTable[RegAddr].at(7)<<24;

    QDateTime timestamp;
    timestamp.setTime_t(unixTimeStamp  );
    qDebug() << timestamp.toString(Qt::SystemLocaleShortDate); //wrong time

RegTable是Modbus类变量,并且我将其用于主类,但始终会得到错误的数据或值。

unixTimeStamp |= ...;

您一遍又一遍地写入同一字节。 您需要移动值:

unixTimeStamp  = static_cast <unsigned int>Modbus->RegTable[RegAddr].at(4) << 24;
unixTimeStamp |= static_cast <unsigned int>Modbus->RegTable[RegAddr].at(5) << 16;
unixTimeStamp |= static_cast <unsigned int>Modbus->RegTable[RegAddr].at(6) <<  8;
unixTimeStamp |= static_cast <unsigned int>Modbus->RegTable[RegAddr].at(7);

当然,根据字节顺序,移位可能必须以相反的顺序进行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM