我正在使用
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类变量,我将其用于主类,但始终会得到错误的数据或值。
答案 0 :(得分:1)
使用
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);
当然,根据字节顺序,移位可能必须按照相反的顺序进行。