QSerialPort проблемы с динамическим изменением паритета

Реализую протокол получения данных от датчика давления.

Протокол следующий:

  1. Устройству отсылается байт адреса. Отсылка производится с паритетом Mark (типа 9-й бит данных)
  2. Затем, два байта адреса на странице памяти устройства. Отсылка производится с паритетом Space
  3. Устройство должно ответить 4-мя байтами данных. Тоже с паритетом Space.

Все данные и адреса посылаются с кодом Хэмминга в младшей тетраде.

Посылаю два запроса:

  1. Адрес: 77 Адрес на странице: 2E 4D
  2. Адрес: 77 Адрес на странице: 31 4D

На первый приходит ответ, а на второй нет.

В ходе экспериментов выяснил, что устройство не отвечает только на адреса на странице являющиеся нечетными (1,3,5 и т.д). Решил поэкспериментировать и выяснил, что при передаче с паритетом Mark пакеты с байтом 0х55 в пакете бит паритета 1(как и должен быть), а, например, 0х51 бит паритета в пакете в 0-е(смотрел на осциллографе). Т.е. бит паритета зависит от передаваемых данных. Этого быть в принципе не должно! Mark и Space - паритеты не зависящие от передаваемых данных.

Вот пример кода функции:

FSerialPort->setParity(QSerialPort::Parity::MarkParity);
quint64 WriteRes = FSerialPort->write(ADevAddress,ADevAddressSize);
FSerialPort->waitForBytesWritten(100);

Res = FSerialPort->setParity(QSerialPort::Parity::SpaceParity);
WriteRes = FSerialPort->write(APageAddress,APageAddressSize);
FSerialPort->waitForBytesWritten(100);

QByteArray Buff;
if (FSerialPort->waitForReadyRead(300))
{
    Buff = FSerialPort->readAll();
    while (FSerialPort->waitForReadyRead(40))
    {
        Buff += FSerialPort->readAll();
    }
    // получили буфер и обработали
}

Помогите разобраться почему себя так ведет бит паритета и как добиться адекватной передачи данных?

Qt 5.15.2 - не могу использовать более старшие версии т.к. нужна поддержка Win 7


Ответы (0 шт):