QMap <int, QByteArray> return Wrong QByteArray - PullRequest
0 голосов
/ 27 мая 2019

Я использую

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

1 Ответ

1 голос
/ 27 мая 2019

С

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);

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

...