QSerialPort проблемы с динамическим изменением паритета
Реализую протокол получения данных от датчика давления.
Протокол следующий:
- Устройству отсылается байт адреса. Отсылка производится с паритетом Mark (типа 9-й бит данных)
- Затем, два байта адреса на странице памяти устройства. Отсылка производится с паритетом Space
- Устройство должно ответить 4-мя байтами данных. Тоже с паритетом Space.
Все данные и адреса посылаются с кодом Хэмминга в младшей тетраде.
Посылаю два запроса:
- Адрес: 77 Адрес на странице: 2E 4D
- Адрес: 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