PIC мк. Эксперимент N19. Пишем приложение для COM порта с помощью QT

В прошлом эксперименте я подтянул приложение с помощью C++ Builder. Но такая реализация мне мягко говоря не нравилась. И тут я наткнулся на статью.  Все более менее логично и прозрачно, не то что эти потоки и прочая хренотень.

Итак для начала скачиваем Qt SDK и устанавливаем его. Затем нужно взять отсюда qt.gitorious.org/qt/qt/trees/4.7/src/corelib/kernel файлы qwineventnotifier_p.h и qwineventnotifier_p.cpp и положить их в QtSDKDesktopQt4.7.4mingwincludeQtCoreprivate

Также качаем библиотеку для работы с Com портом. Вот и все, подготовительный этап завершен.

По поводу настроек проекта все расписано по вышеприведенной ссылке, я же опишу, что конкретно делал я. Будем последовательно решать задачи.

Задача 1. Установить соединение с нужным COM портом.

Сначала нарисуем обертку:

Как видим здесь всего по минимуму: выпадающий список с выбором порта, выпадающий список с выбором скорости и кнопка открытия. Переходим непосредственно к коду, который вызывается при нажатии на кнопку Open:

*Подразумевается, что статья из сообщества прочитана и проанализирована и сделаны нужные вставки в код проекта

void RsTest::on_pbOpen_clicked()
{
    if (this->serial->isOpen())
    {
        serial->close();
        ui->cbBaud->setEnabled(true);  //Разрешаем выбирать скорость
        ui->cbPort->setEnabled(true);   //Разрешаем выбирать порт
        ui->pbOpen->setText("Open");  //Текст на кнопке
    }
    else
    {
            serial->setDeviceName(ui->cbPort->currentText()); // порт на открытие
            if (serial->open(AbstractSerial::ReadWrite)) {
                qDebug() << "Port " << serial->deviceName() << " opened in " << serial->openMode() << " mode";   //вывод в режиме отладки                 serial->setBaudRate(ui->cbBaud->currentText());       // Скорость
                serial->setDataBits(AbstractSerial::DataBits8);
                serial->setParity(AbstractSerial::ParityNone);
                serial->setStopBits(AbstractSerial::StopBits1);
                serial->setFlowControl(AbstractSerial::FlowControlOff);
               ui->cbBaud->setEnabled(false);
                ui->cbPort->setEnabled(false);
               ui->pbOpen->setText("Close");
                ui->pbSend->setEnabled(true);
            } else
            {
                qDebug() << "Error opened serial device " << serial->deviceName();   //Ошибка открытия
            }
    }
}

Результат:

Задача 2. Научить нашу программу посылать байты в порт.

Чтобы не зашивать в контроллер новую программу, я взял туже прошивку, что и в 18 эксперименте. То есть при отсылке с компа 1, 2, 3 или 4 на devboarde будут загораться соответствующие светодиоды. Но мы расширим немножко задачу и позволим отсылать любой символ. Допилим форму до следующего вида:

На форму добавилось два новых элемента lineEdit и pushButton, в первую помещаем то, что мы хотим передать в порт,  а по нажатию второго происходит собственно отсылка. Код обработки события нажатия кнопки “Send”:

void RsTest::on_pbSend_clicked()
{
        QByteArray data; //Переменная для наших данных
        data.clear();      //Очищаем массив
        data.append(ui->leSend->text()); //Добавляем данные из строки в массив
        serial->write(data); //отсылаем данные в порт
}

Тестируем!

Задача 3. Научить нашу программу читать данные из порта.

Сначала нужно подумать куда будем выводить наши данные, тут в принципе можно что угодно использовать, я использовал qDebug + изменял TextLabel, доделываем интерфейс:

Подключаем наш конвертер уровней и закорачиваем линии RX и TX. Текстовая метка Reading будет изменяться на то что прилетает в порт, сразу же как только туда что то прилетит 🙂

Код:

void RsTest::serialRecieve()     //прерывание по попаданию каких либо данных в порт
{
    QByteArray temp_data = serial->readAll();   //readAll() стандартная функция abstractserial.h
    qDebug() << "Reading data is: " << temp_data;   //вывод в отладочном режиме     ui->labelRead->setText(temp_data);  //вывод на текстовую метку
}

Приложение в работе:

Напоследок хочу уточнить, что если у вас не статическая сборка Qt, то для работы приложения не из под qt придется в папку с ним докинуть пару файлов, которые вы всегда можете взять из %qtdir%\Desktop\Qt\4.7.4\mingw\bin\

PIC мк. Эксперимент N19. Пишем приложение для COM порта с помощью QT: 2 комментария

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.