Я новичок, по ссылке
http://cs.tealeaf.su/serial-port-gui.html попробовал создать программу для опроса ком-порта. У меня в принципе все получилось, все работает. Теперь немного хочу доработать программу, то есть чтобы таймер не сразу гнал данные в порт, а только после нажатия кнопки, и после нажатия другой соответственно останавливался. Думал сделать это через глобальные переменные. и написал так:
это main.cpp
#include "mainwindow.h"
#include <QApplication>
int i;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
extern int i;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
в h файле прописал extern, то есть вроде как объявил глобальную переменную.
Дальше
файл mainwindow.cpp
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// создали таймер, привязали его к форме
// если ругается на QTimer ставим на него курсор и нажимаем Alt+Enter
// чтоб на автомате добавить #include <QTimer>
QTimer *timer = new QTimer(this);
// подключили сигнал timeout, к слоту нажатия на кнопку
connect(timer, SIGNAL(timeout()), this, SLOT(on_pushButton_4_clicked()));
// запускаем со значением вызывать раз в 300мс
if(i >0)
{
timer->stop();
}else
{
timer->start(300);
}
foreach (const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts())
{
ui->cmbPort->addItem(serialPortInfo.portName());
}
}
MainWindow::~MainWindow()
{
delete ui;
}
здесь подразумеваю что глобальная переменная 0 и программа каждые 300 мс как бы нажимает кнопку и получает данные это все работает.
ниже кнопка.
void MainWindow::on_pushButton_4_clicked() //получение данных с датчика
{
QSerialPort serialPort;
serialPort.setPortName(this->ui->cmbPort->currentText());
serialPort.setBaudRate(QSerialPort::Baud9600);
if (!serialPort.open(QIODevice::ReadWrite)) {
// QMessageBox::warning(this, "Ошибка", "Не удалось подключится к порту");
return;
}
serialPort.write("e");
serialPort.waitForBytesWritten();
// ВСЕ ЧТО ВЫШЕ ЭТОГО НЕ ТРОГАЕМ
QByteArray data; // специальный тип QT для хранения последовательности байтов
while (serialPort.waitForReadyRead(10)) {
// вместо холостого чтения накапливаем результат в переменную data
data.append(serialPort.readAll());
}
// добавляем строку с содержимым data в поле txtOutput
ui->txtData->append(data);
serialPort.close();
}
тут все работает, теперь дальше кнопка остановки
void MainWindow::on_pushButton_5_clicked() //прекращение получения данных
{
i++;
} как я думал, глобальная переменная становится больше на 1 и таймер в соответствии с условием выше должен остановиться.
if(i >0)
{
timer->stop();
}else
{
timer->start(300);
}
Но нет как гнал он данные так и гонит. В чем может быть ошибка?
Еще может кто нибудь подсказать как мне очистить окно от полученных данных. То есть по нажатию кнопки?
Возможно вопросы мои наивные но я только начинаю в это входить.