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, и я использовал ее для основного класса, но всегда получаю неправильные данные или значения.


person Bhura    schedule 27.05.2019    source источник


Ответы (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);

Конечно, сдвиги могут быть выполнены в обратном порядке в зависимости от порядка байтов.

person Some programmer dude    schedule 27.05.2019
comment
Значение TimeStamp изменяется за 1 секунду, но unixTimeStamp всегда сохраняет 4294967239 void MainWindow :: UpdateCustomUI (short regAddr) {if (regAddr == 30000) {xxunixTimeStamp = 0; QByteArray temp_d = modbus- ›QRegTable [regAddr]; xxunixTimeStamp = temp_d [4]; xxunixTimeStamp | = temp_d [5] ‹---------------- 8; xxunixTimeStamp | = temp_d [6] ‹---------------- 16; xxunixTimeStamp | = temp_d [7] ‹---------------- 24; QDateTime timestamp; timestamp.setTime_t (xxunixTimeStamp); qDebug () ‹★ timestamp.toString (Qt :: SystemLocaleShortDate); }} - person Bhura; 27.05.2019