В прошлом эксперименте я подтянул приложение с помощью 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\
Добрый день
можете выложить проект к этой статье
или сбросить на Listunov27@gmail.com
Пожалуйста https://www.dropbox.com/s/lbat3u6mccsmcpl/RsTest.rar