Russian Qt Forum
Ноябрь 26, 2024, 13:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: работа с qt serial port  (Прочитано 11660 раз)
Eugene1911
Гость
« : Февраль 13, 2014, 11:11 »

Здравствуйте Улыбающийся

Пытаюсь разобраться с передачей данных в qt serial port.
Мне надо написать следующую программу: в qt designer'e есть строка lineEdit, данные из которой надо передать устройству. Посмотрев примеры из справки, не до конца понял, где надо задавать конфигурацию файла и организовывать передачу Непонимающий. В конце концов, попытался сделать так:

файл pro:
Код:
QT       += core gui

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

TARGET = port_des_exm
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp \
    masterthread.cpp

HEADERS  += mainwindow.h \
    masterthread.h

FORMS    += mainwindow.ui

mainwindow.h:
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp:
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "masterthread.h"
#include <QtSerialPort/QtSerialPort>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    int a=0, b=0;
    if (ui->radioButton->isChecked()){
        a = a + 10;
    }
    else if (ui->radioButton_2->isChecked()){
        b = b + 15;
    }
     ui->lineEdit->setText(QString("%1 %2").arg(a, 0, 16).arg(b, 0, 16));
     m_writeData = a + b;
}

void SerialPortWriter::write(const QByteArray &writeData)
{
    m_writeData = writeData;

    qint64 bytesWritten = m_serialPort->write(writeData);

    if (bytesWritten == -1) {
        m_standardOutput << QObject::tr("Failed to write the data to port %1, error: %2").arg(m_serialPort->portName()).arg(m_serialPort->errorString()) << endl;
        QCoreApplication::exit(1);
    } else if (bytesWritten != m_writeData.size()) {
        m_standardOutput << QObject::tr("Failed to write all the data to port %1, error: %2").arg(m_serialPort->portName()).arg(m_serialPort->errorString()) << endl;
        QCoreApplication::exit(1);
    }
    m_timer.start(5000);
}

main.cpp:
Код:
#include "mainwindow.h"
#include <QApplication>
#include <QtSerialPort/QSerialPort>

#include <QTextStream>
#include <QCoreApplication>
#include <QFile>
#include <QStringList>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    QSerialPort serialPort;
    QString serialPortName = argumentList.at(1);
    serialPort.setPortName(serialPortName);

    if (!serialPort.open(QIODevice::WriteOnly)) {
        standardOutput << QObject::tr("Failed to open port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl;
        return 1;
    }

    int serialPortBaudRate = (argumentCount > 2) ? argumentList.at(2).toInt() : QSerialPort::Baud9600;
    if (!serialPort.setBaudRate(serialPortBaudRate)) {
        standardOutput << QObject::tr("Failed to set 9600 baud for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl;
        return 1;
    }

    if (!serialPort.setDataBits(QSerialPort::Data8)) {
        standardOutput << QObject::tr("Failed to set 8 data bits for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl;
        return 1;
    }

    if (!serialPort.setParity(QSerialPort::NoParity)) {
        standardOutput << QObject::tr("Failed to set no parity for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl;
        return 1;
    }

    if (!serialPort.setStopBits(QSerialPort::OneStop)) {
        standardOutput << QObject::tr("Failed to set 1 stop bit for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl;
        return 1;
    }

    if (!serialPort.setFlowControl(QSerialPort::NoFlowControl)) {
        standardOutput << QObject::tr("Failed to set no flow control for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl;
        return 1;
    }

    QFile dataFile;
    if (!dataFile.open(stdin, QIODevice::ReadOnly)) {
        standardOutput << QObject::tr("Failed to open stdin for reading") << endl;
        return 1;
    }

    return a.exec();
}

Qt выдает 12 ошибок. Может ли кто-нибудь популярно объяснить мне, как надо организовать передачу данных в этом случае? Или, может быть, есть более простые примеры, чем даны в справке?

Да, уточняю: версия qt - 5.2.0, компилятор MinGW, windows 7
« Последнее редактирование: Февраль 13, 2014, 11:53 от Eugene1911 » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Февраль 13, 2014, 12:40 »

Цитировать
Да, уточняю: версия qt - 5.2.0, компилятор MinGW, windows 7

1. Нужно проверить что модуль QtSerialPort установлен в твоей Qt5. Если нет - то установить (он в addons, нужно галочку выбрать).
2. Для подключения модуля QtSerialPort в Qt5 достаточно прописать в *.pro файл твоего проекта:

Цитировать
QT += serialport

Т.е. после п.1 ты можешь взять сорсник любого примера из QtSerialPort, заменить в нем строку как в п.2. И пересобрать и пользоваться.

ЗЫ: И да, лучше обновиться до Qt5.2.1 (а еще лучше - взять последние сорцы QtSerialPort пересобрать и установить самотоятельно).

« Последнее редактирование: Февраль 13, 2014, 12:41 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.121 секунд. Запросов: 22.