Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QSerialPort и Parity
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
TestUser013
Доброго времени суток.
Пытаюсь разобраться с СОМ портом. Возникла проблема...
Нужно отправлять байты изменяя бит четности. Если верить документации, то следующий код должен отправить байт 08 сначала с битом четности 1, а потом с битом четности 0.

void MainWindow::on_pushButton_clicked()
{
    QByteArray paket;
    paket.resize(1);
    paket[0] = 0x08;
    int temp;

    port.setParity(QSerialPort::MarkParity);
    ui->log->setPlainText(ui->log->toPlainText()+tr("Parity %1.\n").arg(port.parity()));
    temp = port.write(paket);
    ui->log->setPlainText(ui->log->toPlainText()+tr("Packet send. Size = %2 byte.\n").arg(temp));

    port.setParity(QSerialPort::SpaceParity);
    ui->log->setPlainText(ui->log->toPlainText()+tr("Parity %1.\n").arg(port.parity()));
    temp = port.write(paket);
    ui->log->setPlainText(ui->log->toPlainText()+tr("Packet send. Size = %2 byte.\n").arg(temp));
}



В PlainText выводится верная информация
Цитата
Parity 5.
Packet send. Size = 1 byte.
Parity 4.
Packet send. Size = 1 byte.


А вот на экране осциллографа совсем другая ситуация.


Вот фотография, когда сначала идет Mark, а потом Space.


Вот фотография, когда сначала идет Space, а потом Mark.



Если посылать в режиме только Mark или только Space, то все хорошо. Вот фото.
Mark:


Space:


Собственно 2 вопроса, почему так происходит и как правильно сделать?
TestUser013
Разобрался. Если кому-то пригодится привожу ответ.

Метод port.write() гарантирует только то, что данные будут записаны во внутренний буффер класса, и все. Реальная отправка будет позже. В приведенном коде метод on_pushButton_clicked() отправит сразу два пакета с паритетом SpaceParity. Т.к. цепочка из двух port.write(paket) просто добавит данные во внутренний буффер класса (т.е. там будет два пакета сразу). И по выходе из on_pushButton_clicked() отправятся все данные сразу (с SpaceParity - т.к. он был последним).

Разобрался. Если кому-то пригодится привожу ответ.

Метод port.write() гарантирует только то, что данные будут записаны во внутренний буффер класса, и все. Реальная отправка будет позже. В приведенном коде метод on_pushButton_clicked() отправит сразу два пакета с паритетом SpaceParity. Т.к. цепочка из двух port.write(paket) просто добавит данные во внутренний буффер класса (т.е. там будет два пакета сразу). И по выходе из on_pushButton_clicked() отправятся все данные сразу (с SpaceParity - т.к. он был последним).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.