1. Нужно сначала открывать порт, а потом менять паритет и прочее (в приведенном примере я вообще не вижу чтобы он открывался).
2. Сразу после port.write() нельзя менять паритет, т.к. реально данные еще могут не отправиться. Метод port.write() гарантирует только то, что данные будут записаны во внутренний буффер класса, и все! Реальная отправка будет позже.
Для того чтобы проверить то, что данные были отправлены, можно косвенно использовать сигнал bytesWritten(qint64).
Но он также не гарантирует то, что все данные будут полностью переданы в линию (т.к. некоторые могут находится еще в SHIFT регисте микросхемы и прочее..). Этот сигнал гарантирует (вроде-как) то, что буфер драйвера опустел (т.е. из драйвера в микруху все передано).
3. В приведенном коде метод on_pushButton_clicked() отправит сразу два пакета с паритетом SpaceParity. Т.к. цепочка из двух port.write(paket) просто добавит данные во внутренний буффер класса (т.е. там будет два пакета сразу). И по выходе из on_pushButton_clicked() отправятся все данные сразу (с SpaceParity - т.к. он был последним).
В общем, для реализации того чего надо, надо примерно делать так:
C++ (Qt)
enum State { SendWithMark, SendWitchSpace };
State st = SendWithMark;
connect(port, SIGNAL(bytesWritten(qint64)), this, SLOT(checkByets(qint64)));
Foo::sendPacket(const Packet &pkt)
{
port->setParity(st == SendWitchSpace ? SpaceParity : MarkParity);
port->write(packet);
}
Foo::checkByets(qint64 bytes);
{
if (bytes < packet.size())
return; // do nothing
if (st == SendWithMark)
st = SendWitchSpace;
sendPacket(pkt);
}
void MainWindow::on_pushButton_clicked()
{
sendPacket(pkt);
}