Вторая версия основной программы на языке С++
/****************^
* TOC o "1-3" h z Copyright (С) 2006 by Vladimir Gololobov *
* vgololobov@yandex. ru *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
************************************************
#include <qlabel. h>
#include <posix_qextserialport. h>
Iinclude ^qextserialbase. h>
Tinclude "barbywidget. h"
Char command_on[7] = "R14$1N"; char command_of[7] = "R14$1F";
Posix_QextSerialPort comPort("/dev/ttySO"); // Это позволяет использовать готовый класс.
BarbyWidget::barbyWidget(QWidget* parent, const char* name, WFlags fl)
: barbyWidgetBase(parent, name, fl) {
Light->setEnabled(FALSE);//Здесь light - этикетка с
Желтой картинкой. }
BarbyWidget::-barbyWidget() {}
/* $SPECIALIZATION$ */
Void barbyWidget::port_open_clicked() {
ComPort. setName("/dev/ttySO"); // Далее следуют установки порта СОМІ.
ComPort. setDataBits(DATA_8); comPort. setStopBits (STOPJL); comPort. setBaudRate (BAUD2400); comPort. open(0);
If (comPort. іsOpen()) {
Label->setText( "port open" ); // Это переделанная этикетка. void barbyWidget::port_close_clicked() {
ComPort. close();
If (!comPort. isOpen())
Label->setText( "port close" );
}
Void barbyWidget::light_on_clicked() {
ComPort. wrіteBlock(command_on, 6); light->setEnabled(TRUE);
}
Void barbyWidget::light_off_clicked() {
ComPort. writeBlock(command_of, 6) ; light->setEnabled(FALSE);
}
#include "barbywidget. moc"
Файл заголовка barbywidget. h: /***************^
* Copyright (C) 2006 by Vladimir Gololobov *
* vgololobov@yandex. ru *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
★Л*****************************************»************/
#ifndef _BARBYWIDGET_H_ tdefine _BARBYWIDGET_H_
#include "barbywidgetbase. h" tinclude <posix_qextserialport. h> #include <qextserialbase. h>
Class barbyWidget : public barbyWidgetBase {
Q_OBJECT public:
BarbyWidget (QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); - barbyWidget() ; /*$PUBLIC_FUNCTIONS$*/
Public slots: /* $ PUBLIC_SLOTS $ */
Virtual void port_open_clicked(); // Это бывшая клавиша buttorn.
Virtual void port_close_clicked(); // Далее добавленные клавиши.
Virtual void light_on_clicked(); virtual void light_off__clicked() ; protected:
/* $PROTECTED_FUNCTIONS$ */
Protected slots: Г* $PROTECTED_SLOTS $ */
};
#endif
После запуска программы, щелчка кнопки СОМІ открыть и кнопки Свет включить получаем вид программы, показанный на рис. П. 16.
Рис. П. 16. Вид работающей программы |
Первая неожиданность - программа работает, но модуль не реагирует на команды. Ситуация повторяет начало работы с портом в части проверки конвертера. Первое, что удается проверить с помощью мультиметра, - наличие изменений сигналов на входе конвертера. Если поменять порт (то есть /dev/ttySl), напряжение на сигнальном выводе останется неизменным. Это хорошо. Но плохо, что модуль не реагирует на команды. На всякий случай я возвращаюсь к программе на Visual Basic и проверяю работу модуля. Сомнений не Остается - модуль отрабатывает команды.
Пользуясь тем, что модуль работает, проверяю сигналы интерфейса RS485 в программе, работающей с Visual Basic. Затем я перезагружаю операционную систему и запускаю программу из KDevelop. Спустя некоторое время, удается заметить, что сигнал RTS на S выводе микросхемы МАХ1483 сбрасывается в «О» при открытии порта. Добавление в программу в разделе настроек после открытия порта исправляет ситуацию. Модуль выполняет команды.
ComPort. open(0);
ComPort. setRts (FALSE); // Добавленная строка
Теперь остается разобраться с командами запроса статуса реле. Модифицированная программа выглядит следующим образом:
Iinclude <qlabel. h> iinclude <posix__qextserialport. h> #include <qextserialbase. h> iinclude "barbywidget. h"
Char command_on[7] = "R14$1N"; char command_of[7] = "R14$1F"; char command_st[7] = "R14$1S"; char answer_st[19] = " int і = 0;
Posix_QextSerialPort comPort("/dev/ttySO") ;
BarbyWidget::barbyWidget(QWidget* parent, const char* name, WFlags fl)
: barbyWidgetBase(parent, name, f1) {
Light->setEnabled(FALSE); }
BarbyWidget::-barbyWidget() {}
/* $ SPECIALIZATI0N$ */
Void barbyWidget::port_open_clicked() {
ComPort. setName("/dev/ttySO"); comPort. setDataBits(DATA_8); comPort. setStopBits (ST0P_1);
ComPort. setBaudRate (BAUD2400); comPort. open(0); comPort. setRts (FALSE); answer->setText(" ") ;
І f (comPort. і sOpen()) {
Label->setText( "port open" ); }
Void barbyWidget::port_close_clicked() {
ComPort. close();
If (!comPort. іsOpen())
Label->setText( "port close" );
Answer->setText(" ") ;
}
Void barbyWidget::light_on_clicked() {
ComPort. writeBlock(command_on, 6) ; comPort. writeBlock(command_st, 6) ; while (і comPort. atEnd()); for (i=0;i<100000000;++І); comPort. readBlock(answer_st, 18); answer->setText(answer_st); if (answer_st [17] == "N")
Light->setEnabled(TRUE); }
Void barbyWidget::1іght_off„clicked() {
ComPort. writeBlock(command_off 6) ; comPort. writeBlock(command_st, 6) ; while (!comPort. atEnd()); for (i=0;i<100000000;++i); comPort. readBlock(answer_st, 18); answer->setText(answer_st); if (answer_st[17] == "F")
Light->setEnabled(FALSE); }
#include "barbywidget. moc"
В основном, изменения касаются чтения ответа в буфер порта после отправки запроса:
While (!comPort. atEnd()) ; for (i=0;i<100000000;++i); comPort. readBlock(answer_st, 18);
Втр 23 Май, 13:37 Ч |
Пустой цикл for добавлен, чтобы ответ был полностью получен. Массив char answer_st [19] служит для чтения буфера ввода порта, и сохраняемые им команды содержат все, что было отправлено (рис. П. 17).
I* Пряяожвим* П.*.*, Сист—^в^^Ф1 % і
DATE |
J |
||
. Сеет включмп» І |
Сеет выключить | |
||
Кооэи |
- fito-Zr'/ho. Ь fpWum Обе». **> шктт Ово». GI ■» Рис. П. 17. Прием ответа модуля в программе |
В правом нижнем углу формы отображается содержание этого массива. Поэтому в проверке его содержимого я проверяю только последний символ:
If (answer_st [17] == "N")
Возможно, не лучшим образом, но механизм работает. По команде выключения света свет на картинке выключается.
Ha макете, естественно, по команде включения света загорается индикатор, который гаснет по команде выключения света.
Запланированная часть работы выполнена.