8-logoНа всякий случай может кому пригодится. Требуется написать простую программку отправляющую байты по юарту, C# не тру, поэтому выбор пал на Qt Creator.

Все просто и примеров куча, а ничего не работает. После Visual C# не привычно чуть менее чем полностью. В общем наковырял, работает, проверено.

Непосредственно для работы с портом нужно включить либу, было много разных мнений что то докачивать, доустанавливать шаманскими методами, в итоге оказалось все в комплекте из коробки, достаточно подцепить инклуд

#include <QtSerialPort/QSerialPort>

Аналогично для получения информации о количестве доступных портов

#include <QtSerialPort/QSerialPortInfo>

Единственное шаманское, что нужно сделать — в файл с расширением .pro нужно добавить

greaterThan(QT_MAJOR_VERSION, 4) {
    QT       += widgets serialport
} else {
    include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf)
}

Далее там где это необходимо открываем порт для чтения

serial.Open(QSerialPort::WriteOnly);

Настраиваем нужные скорости и прочие плюшки

serial.setBaudRate(QSerialPort::Baud2400);
serial.setDataBits(QSerialPort::Data8);
serial.setParity(QSerialPort::NoParity);
serial.setStopBits(QSerialPort::OneStop);
serial.setFlowControl(QSerialPort::NoFlowControl);

Доступные варианты настроек удобнее смотреть нажатием Ctrl+Space, когда начинаешь что то печатать

Для отправки байта

serial.putChar(0xEA);

Для отправки нескольких байт

serial.write("hello");

Для того чтобы определить какое то действие для кнопки, щелкаем правой кнопкой мыши по ней в редакторе-перейти к слоту. В слотах выбираем то что нужно, если это щелчок мыши, то ищем clicked();. Далее в основном коде появляется обработчик нечто вроде void MainWindow::on_pushButton_2_clicked()

qserial

Небольшой пример:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QString>
 
 
QSerialPort serial;
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    //read avaible comports
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
            ui->comboBox->addItem(info.portName());
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
//button send
void MainWindow::on_pushButton_clicked()
{
    //string for lineedit text
    QString str2 = ui->lineEdit->text();
 
    serial.write(str2.toUtf8());
 
}
 
//connect
void MainWindow::on_pushButton_2_clicked()
{
    //select name for our serial port from combobox
    if (serial.portName() != ui->comboBox->currentText())
    {
          serial.close();
          serial.setPortName(ui->comboBox->currentText());
    }
 
    //setup COM port
    serial.setBaudRate(QSerialPort::Baud2400);
    serial.setDataBits(QSerialPort::Data8);
    serial.setParity(QSerialPort::NoParity);
    serial.setStopBits(QSerialPort::OneStop);
    serial.setFlowControl(QSerialPort::NoFlowControl);
    serial.open(QSerialPort::WriteOnly);
 
}
 
void MainWindow::on_pushButton_3_clicked()
{
    //close
    serial.close();
}

Что отправили из приложения, то видим в терминале.
qserial2

66 комментариев: QT serial port

  • Проблема в кодировке, очевидно

  • Странно. У меня все идёт нормально.

  • Спасибо всем за помощь !!!!Проекти работают!!!а как кодировать??? з чем ето связано??

  • Скинь скриншот экрана с вопросами.

  • куда скинуть?? здесь немогу прикрепить скриншот!!

  • Ну хоть на Яндекс, а сюда ссылку.

  • киньте почту !!!! я всьо скину на почту!!

  • Приложение работает! Спасибо!
    Подскажите пожалуйста, как Вы пользуетесь Tera Term одновременно с работой программы?

  • tera term и qt сидят на разных ком портах, соединены виртуальным мостом com0com

  • Вы не могли бы выложить весь проект, QT поставил (4.8 — под XP новая что-то не ставится) библиотеку поставил вот отсюда -x, все поставилось , прилагаемые к библиотеке тестовые примеры собираются, Ваш чего-то никак. Никак не могу понять в чем дело 👿

  • Да в прилагаемых к библиотеке примерах, все вроде также но… 🙂

  • Библиотека идет в комплекте с QT, поэтому ничего ставить дополнительно не нужно.

  • Не, в 4.8 она ставится отдельно, это в пятой она интегрирована. Поэтому и проблемы-) Вроде встала и собралась, но часть примеров не работает вот я и пытаюсь разобраться в чем дело-)))

  • как проявляется то что не работает?

  • Не собираются сонсольнве примеры, а в Вашем что-то типа — G:\Qt\Projects\com__\mainwindow.cpp:20: error: undefined reference to `_imp___ZN15QSerialPortInfo14availablePortsEv’ говорит, хотя оконные собираются и работают.
    У меня сложилось пока мнение , что ей не нравится как у Вас объявлен (или где) экземпляр serial.

  • Конкретно ошибки горят на
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    ui->comboBox->addItem(info.portName());
    и на
    QSerialPort serial;

  • если проекты собираются значит проблема не в либе. это в pro файл добавлено?
    greaterThan(QT_MAJOR_VERSION, 4) {
    QT += widgets serialport
    } else {
    include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf)
    }

    сравните pro файл примера со своим

  • Пробовал и так, и писать полный путь к файлу- ни шиша-((( Видимо придется копать глубжее-)

  • Попробовал последний раз на удачу, добавил как написано тут — » x » CONFIG += serialport
    LIBS += -lserialport
    на LIBS говорит нет файла — выбросил, оставил только строчку с CONFIG и , о чудо! — собралось и заработало…. С тоской вспоминаю питон))))
    на всякий случай рабочий файл —
    »
    QT += core gui

    greaterThan(QT_MAJOR_VERSION, 4) {
    QT += widgets serialport
    } else {
    include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf)
    }

    TARGET = com__
    TEMPLATE = app

    SOURCES += main.cpp\
    mainwindow.cpp

    HEADERS += mainwindow.h

    FORMS += mainwindow.ui
    CONFIG += serialport

    «

  • Спасибо!

  • Да, с этой строчкой CONFIG += serialport в pro файле заработали и консольные примеры. Нда… неужели такие танцы на qt всегда(((((

  • это только начало 🙂 беда в том что альтернативы этому нет

  • Щас только вспомнил-) но вроде есть эклипс, может быть с тех пор как я его видал в последний раз и что-нибудь изменилось, но тогда он мне показался еще сложнее- пробовал кажется си++ на контроллерах — настройка и установка на целую страницу.

  • Может под винду он и ничего…

  • возможно, не ковырял

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

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

Последние комментарии
  • Загрузка...
Счетчик
Яндекс.Метрика