Russian Qt Forum

Qt => Общие вопросы => Тема начата: ryazancity от Декабрь 15, 2012, 15:01



Название: Считывание данных из com порта
Отправлено: ryazancity от Декабрь 15, 2012, 15:01
Ребят,помогите нужно что бы прога считывала с com порта либо 1 либо 0 с трех датчиков, данные приходят в виде 1 0 1 т.е просто через пробел. И вся Фишка в том что бы при единичках в первых двух должно выводиться предупреждение,а при единичке в третьем числе,компьютер должен аварийно отключаться,либо с сохранением,либо без сохранения параметров(на усмотрение пользователя)


Название: Re: Считывание данных из com порта
Отправлено: skandinavijos от Декабрь 15, 2012, 15:15
Вопрос в чем? как работать с портом или как вычленить значения?


Название: Re: Считывание данных из com порта
Отправлено: ryazancity от Декабрь 15, 2012, 15:35
И в том и в том)))


Название: Re: Считывание данных из com порта
Отправлено: skandinavijos от Декабрь 15, 2012, 16:07
C ком портом можно работать через WinAPI, boost, QSerialPort и т.д. Я предпочитаю последнее. Он унаследован от QIODevice и работа с ним похожа на работу с QFile. Короче самое простое, что может быть. В комплекте примеры идут, там все просто. Далее вешаешь свой слот на его сигнал readyRead(), который срабатывает, когда в порту данные есть. В слоте обрабатываешь. Например: если в буфере меньше трех байт, то return, иначе cчитываешь три байта, например QByteArray = port.read(3) и далее все просто, сравниваешь байты этого QByteArray'я с нулями или чего тебе там надо


Название: Re: Считывание данных из com порта
Отправлено: ryazancity от Декабрь 15, 2012, 20:27
а если я полный ноль в qt??? Не поможете с кодом?


Название: Re: Считывание данных из com порта
Отправлено: Bepec от Декабрь 15, 2012, 21:49
С С++ знаком? Если да, то поможем, да и ты сам справишься. Если нет, начинать надо с простого.


Название: Re: Считывание данных из com порта
Отправлено: ryazancity от Декабрь 16, 2012, 22:18
С с++ знаком на начальном уровне,а с этой штукой нужно в краткие сроки разобраться...((((


Название: Re: Считывание данных из com порта
Отправлено: Bepec от Декабрь 16, 2012, 22:25
Если очень срочно, то выкидывай в объявления с ценой.

Если не очень, то смотри примеры QSerialport. Они внятные и простые.

Хотя будет трудно с наскоку понять Qt.


Название: Re: Считывание данных из com порта
Отправлено: ryazancity от Декабрь 16, 2012, 22:27
Пасиб,сейчас придумаем что-нть


Название: Re: Считывание данных из com порта
Отправлено: ctin от Декабрь 17, 2012, 14:47
Два варианта: сделать вручную поэтапно или воспользоваться библиотекой и экземплом к ней.
Лично я начал со второго.

Можешь писать мне в скайп ctinka1


Название: Re: Считывание данных из com порта
Отправлено: ryazancity от Декабрь 17, 2012, 19:23
вот такая фигня, как избавиться не пойму
:59 строка serial->setBaudRate(baudRate);ошибка при сборке invalid conversion from 'int' to 'const char*'
 и тут же initializing argument 1 of 'QString::QString(const char*)'


Название: Re: Считывание данных из com порта
Отправлено: ryazancity от Декабрь 17, 2012, 19:25
а еще один вопрос.  if(initSerial(tr("/dev/ttyUSB0"), 9600) == false) это для UBUNTU а для WINDOWS что написать? какой путь????


Название: Re: Считывание данных из com порта
Отправлено: ryazancity от Декабрь 17, 2012, 19:45
#include "mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    widget = new QWidget();
    grid = new QGridLayout();
    button_show = new QPushButton("Show");
    button_hide = new QPushButton("Hide");
    button_blink = new QPushButton("Blink");
    button_blink_n = new QPushButton("Blink 0");
    editLine = new QLineEdit("0");

    /* connect signals to slots */
    connect(editLine, SIGNAL(textChanged(QString)), this, SLOT(setButtonBlinkN(QString)));
    connect(button_show, SIGNAL(clicked()), this, SLOT(ShowLigth()));
    connect(button_hide, SIGNAL(clicked()), this, SLOT(HideLigth()));
    connect(button_blink, SIGNAL(clicked()), this, SLOT(Blink()));
    connect(button_blink_n, SIGNAL(clicked()), this, SLOT(BlinkN()));

    /* only 0..9 number   */
    editLine->setInputMask("9");
    grid->addWidget(button_show, 0, 0);
    grid->addWidget(button_hide, 0, 1);
    grid->addWidget(button_blink, 0, 2);
    grid->addWidget(editLine, 0, 3);
    grid->addWidget(button_blink_n, 0, 4);

    widget->setLayout(grid);

    setCentralWidget(widget);

    /* init QByteArray */
    ba.clear();
    ba.resize(1);

    if(initSerial(tr("/dev/ttyUSB0"), 9600) == false)
    {
        qDebug() << "Error initSerial";
        exit(-1);
    }
}

void MainWindow::setButtonBlinkN(QString n)
{
    button_blink_n->setText("Blink " + n);
}

/* init serial port, set baud rate */
bool MainWindow::initSerial(QString dev, int baudRate)
{
    serial = new AbstractSerial();
    serial->setDeviceName(dev);

    /* open or return false */
    if(serial->open(AbstractSerial::ReadWrite))
    {
        serial->setBaudRate(baudRate);
        /* if ready read call ReadData() */
        connect(serial, SIGNAL(readyRead()), this, SLOT(ReadData()));
    }
    else
    {
        return false;
    }

    return true;
}

/* Send data */
void MainWindow::send(QByteArray &ba)
{
    serial->write(ba);
}

/* Not light :) */

void MainWindow::ShowLigth()
{
    ba[0] = 'S';
    send(ba);
}

void MainWindow::HideLigth()
{
    ba[0] = 'H';
    send(ba);
}

void MainWindow::Blink()
{
    ba[0] = 'B';
    send(ba);
}

void MainWindow::BlinkN()
{
    ba[0] = 'N';
    send(ba);
    ba[0] = (char)editLine->text().toLocal8Bit().at(0);
    send(ba);
}

/* Read data */
void MainWindow::ReadData()
{
    qDebug() << serial->readAll();
}

MainWindow::~MainWindow()
{
    serial->close();
    delete serial;

    delete widget;
    delete grid;
    delete button_show;
    delete button_hide;
    delete button_blink;
    delete button_blink_n;
    delete editLine;
}


Название: Re: Считывание данных из com порта
Отправлено: kuzulis от Декабрь 17, 2012, 20:18
ryazancity, ты не ту либу смотришь, она уже давно устарела.

Вот что тебе нужно: QtSerialPort (http://qt-project.org/wiki/QtSerialPort_Russian)



Название: Re: Считывание данных из com порта
Отправлено: Bepec от Декабрь 17, 2012, 20:25
И научись пользовать тегом
Код:
code
. Диез кнопочка.


Название: Re: Считывание данных из com порта
Отправлено: ryazancity от Декабрь 18, 2012, 08:13
Вас понял


Название: Re: Считывание данных из com порта
Отправлено: ctin от Декабрь 18, 2012, 09:36
для WINDOWS нужно "\\\\.\\COM3"
дикое количество слешей - системное расположение порта. Без них будут работать только порты до 9го


Название: Re: Считывание данных из com порта
Отправлено: Bepec от Декабрь 18, 2012, 10:00
QtSerialPort надо задавать тупо COMN, где N номер порта.


Название: Re: Считывание данных из com порта
Отправлено: ryazancity от Декабрь 18, 2012, 14:17
А еще вопрос,как сделать что бы при срабатывании одного из датчиков компьютер аварийно отключался без сохранения параметров???


Название: Re: Считывание данных из com порта
Отправлено: Bepec от Декабрь 18, 2012, 15:35
Эм. Робот с проводом в руке выдёргивает его из розетки?

Зависит от операционной системы и прав пользователя.


Название: Re: Считывание данных из com порта
Отправлено: ryazancity от Декабрь 18, 2012, 16:19
Для винды с правами админа


Название: Re: Считывание данных из com порта
Отправлено: Dancing_on_water от Декабрь 18, 2012, 16:32
Консольная команда на выключение shutdown -s. Смекаем? :)


Название: Re: Считывание данных из com порта
Отправлено: ryazancity от Декабрь 18, 2012, 19:16
не катит она


Название: Re: Считывание данных из com порта
Отправлено: Bepec от Декабрь 18, 2012, 20:57
аргументируйте чем не катит.