Перейти к содержанию

Borland C++ Простейшие Задачи (Опрос Кнопок , Ввод/вывод Данных)


Рекомендуемые сообщения

Добрый день дорогие друзья! Помогите пожалуйста "стартонуть" в этой области программирования.

До этого несколько лет пишу на Си для микроконтроллеров. В общих чертах Си++ не вызывает проблем и удивления у меня. :)

Вот сегодня решил попробовать решить простейшую задачу.

Алгоритм:

опрос кнопок и вывод данных (текста) в определенной области окна приложения.

Но возникли трудности...

Данные не отображаются.

Что хотелось бы узнать (уверен что не одному мне)

Как выводить текст при нажатии кнопки?

Как читать данные с COM порта по RS232 и выполнять действия?

Как получать данные (клавиатура , COM порт) и их записывать в файл, например .TXT

Думаю эта тема будет интересна многим начинающим программистам!

Вот пример того что я пытаюсь сделать:

//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#pragma hdrstop
using namespace std;
int z,y,x;
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
 : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
z=1; y=1; x=0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
z=1; y=0; x=1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
z=0; y=1; x=1;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Panel1Click(TObject *Sender)
{
if(x==0) cout << "Привет! нажата кнопка 1" ;
if(y==0) cout << "Привет! нажата кнопка 2" ;
if(z==0) cout << "Привет! нажата кнопка 3" ;
}
//---------------------------------------------------------------------------

Изменено пользователем artos5

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Привет.

Прога ваша не на VC++, но попытаюсь в общих чертах обрисовать...

1. Приложение у Вас явно не консольное. Значит, "просто так" Вы cout не увидите. Тут 2 варианта - запустить прогу с переназначением в файл. 1.exe > out.txt. В файле поимеете ваш cout .... Но если делать "по-нормальному", то Вам надо вешать обработчик на событие WM_KEYPRESSED (если не ошибся :) ) и там аргументом придёт код символа. Плюс тонкости с фокусом ввода. Если, например, на форме есть textbox и у него фокус ввода, то WM_KEYPRESSED придёт ему, а не форме .....

2. Имена обработчиков ...Click наталкивают меня на мысль, что это вообще не клавиатура, а мыша ... Я прав или нет?

Изменено пользователем hd44780
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

В программировании под ОС Windows главный справочник - MSDN.

Для работы с файлами и COM-портом - CreateFile,WriteFile,ReadFile.

Обработка нажатий клавиш... применительно к указанной среде разработки - есть обработчик события onkeypress, onkeydown, onkeyup.

Если же нужно просто ввести текст и вывести в окно, есть т.н. контролы: поля ввода, метки для статического текста и т.д.

По приведённому Вами коду:

if(x==0) cout << "Привет! нажата кнопка 1" ;
if(y==0) cout << "Привет! нажата кнопка 2" ;
if(z==0) cout << "Привет! нажата кнопка 3" ;

Так выводится строка на печать в консольном приложении.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

А есть простой пример кода на Си++ чтоб вывести текст или переменную?

Вот на картинке я отобразил :)

И как пользоваться командами чтения/записи COM порта ? Я так понимаю надо библиотеку подключать? Тогда какую?

Привет.

Привет! Не ожидал Тебя тут увидеть :)

post-59941-0-90986800-1354010628_thumb.gif

Изменено пользователем artos5

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Допустим есть поле Edit1 и кнопки Button1, Button2, Button3

// вывод строки
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit1->text = "Hello";
}

// очистка поля ввода
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Edit1->text = "";
}

// вывод переменной
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Edit1->text = IntToStr(x);
}

А для чтения/записи COM-порта вызываются функции (приводил выше).

Можно, например, здесь почитать:

http://multitest.semico.ru/mtext1.htm

http://softelectro.ru/rs232prog.html#M30

http://articles.org.ru/cfaq/index.php?qid=2468&catid=48

Ссылка на комментарий
Поделиться на другие сайты

Какой из этих компонентов выбрать чтоб вывести текст или переменную туда. И где надо прописать вывод текста/переменной? В функции Button или в той что является окном для отображения данных?

post-59941-0-52336300-1354012300.gif

Изменено пользователем artos5

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Попробую объяснить пошагово...

Создаёте проект что-то типа "приложение Windows" должно быть. Появится главное окно будущего приложения. Ставите на него контрол Edit (возможно подписан как "text", у меня нет Borland C++, негде проверить). Добавляете три кнопки. На одной из них делаете двойной щелчёк - открывается окно редактора кода с функцией обработки нажатия кнопки

void __fastcall TForm1::Button1Click(TObject *Sender)
{

}

в промежутке между фигурными скобками пишете Edit1->Text = "this is string";

Или можно вместо Edit поставить Label и вписать Label1->Caption = "This is string";

Когда после Edit или Label вводите -> должен появиться список свойств. там можно выбрать текст для эдит или caption для метки.

Сохранить, запустить... проверить.

Изменено пользователем Diversant
Ссылка на комментарий
Поделиться на другие сайты

Не ожидал Тебя тут увидеть :)

Да работаю я программистом - .NET, C#, c++. Ну и там, что ещё начальство повесит ...

А контроллеры и прочее железо - просто хобби. Для себя :) .

Какой из этих компонентов выбрать чтоб вывести текст или переменную туда.

Тот, где большая буква A. Это Label. Остальное - Diversant нормально написал.

А про sprintf, я думаю, ты знаешь. Она такая же, как и в МК ....

Изменено пользователем hd44780
Ссылка на комментарий
Поделиться на другие сайты

> А про sprintf, я думаю, ты знаеш.

Да, знаю :)

А проще нету выражения?

Например как в консоле:

cout << data_byte << "переменная";

Спасибо за подсказки! Прописал, скомпилировал, запустил, Работает! : )))

Теперь еще вопрос:

Где прописывать чтобы "алгоритм крутился" как в бесконечном цикле и выполнял какие то действия. И что то переодически отображал на экране .?

К примеру я получаю данные с COM порта обрабатываю их и вываливаю на экран.

Спасибо за ссылки! Если бы было возможным поставить больше одного спасибо, я-бы Вам поставил 2-ва спасибо :)

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

А проще нету выражения?

Например как в консоле:

cout << data_byte << "переменная";

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

Ещё есть функции типа itoa, ltoa - одну переменную в строку. Хотя, я всегда пишу sprintf :) .

Где прописывать чтобы "алгоритм крутился" как в бесконечном цикле и выполнял какие то действия. И что то переодически отображал на экране .?

К примеру я получаю данные с COM порта обрабатываю их и вываливаю на экран.

Про бесконечные циклы забудь. Они применяются только в потоках, хотя и там они не бесконечные ... Тебе, похоже рановато в это лезть :) .

Если ты в какой-то кнопке сделаешь вечный цикл, ты банально "повесишь" прогу. У тебя даже твоя форма обновляться не будет без спец ухищрений типа принудительного Reresh-a ...

Бесконечного здесь вообще ничего никогда быть не должно.

Считай, что бесконечный цикл уже реализован где-то глубоко в недрах винды (точнее стандартных библиотек) и он иногда вызывает твои функции, типа "клик мыши по кнопке". Я могу это разжевать, если хочешь... Или поискать, где почитать об этом.

Этот цикл называется "цикл обработки собщений". Всё построено на сообщениях.

Все операции выполняются по событиям. Для COM-порта тоже есть событие прихода данных. Как прерывание в МК.

Можно ещё сделать таймер, он будет вызывать твой обработчик с определённым интервалом и проверяй там буфер порта, есть там что-то или нет.

Посмотри, может в твоём билдере есть готовые компоненты для этого. Чтобы не влезать с руками и ногами в WinApi для работы с портом ....

Изменено пользователем hd44780
Ссылка на комментарий
Поделиться на другие сайты

Про бесконечные циклы забудь

Вот я это понимаю :)

Просто все повиснет.

Для COM-порта тоже есть событие прихода данных. Как прерывание в МК.

Я так и догадывался. Но как это связать.... ума пока не приложу :)

В МК это все просто :)

А что можно делать с GroupBox - ом ?

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Я так и догадывался. Но как это связать.... ума пока не приложу :)

В МК это все просто :)

Дело привычки. Я начинал на MS-DOS, там тоже всё на вечном цикле и опроса клавиатуры и прочего по сути построено...

Прерывания тоже были, но мало :) ...

Когда винда пошла, немало времени прошло, пока проникся этой парадигмой событийной модели программирования :) .

Насчёт COM-порта - поищи в инете.

Просто я делал это на VC++, а с билдером дел не имел. Поэтому рассказывать не хочу, только запутаю тебя ....

А что можно делать с GroupBox - ом ?

Да ничего. Просто рамка. Для визуального выделения логически связанных контролов...

Единственный случай (по моему :) ), где она на что-то влияет - Radiobuttons.

Проведи эксперимент - накидай на форму 2-3 radiobuttons. Тупо накидай, безо всего остального - без обработчиков, кода какого-то ...

Потом накидай их в GroupBox.

Запусти и сравни их поведение :) .

Изменено пользователем hd44780
Ссылка на комментарий
Поделиться на другие сайты

Да ничего. Просто рамка. Для визуального выделения логически связанных контролов...

Единственный случай (по моему :) ), где она на что-то влияет - Radiobuttons.

Проведи эксперимент - накидай на форму 2-3 radiobuttons. Тупо накидай, безо всего остального - без обработчиков, кода какого-то ...

Потом накидай их в GroupBox.

Запусти и сравни их поведение :) .

Что то не совсем вкурил я... GroupBox

Я понимаю как: "Группа бокса" или "Группа в боксе"

То есть куча каких то функций в этой рамке..

Так, radiobutton я понял что это. Это как переключатель :)

Но я попробовал тупо накидать "radio кнопок" в groupbox . И ничего не работает... просто рамка болтается groupbox - a

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Еще вопросик..

Что надо выбрать чтобы с клавы читать данные и потом их отображать? И как создать простой таймер? Чтобы он "тикал".

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

"Читать данные" - стандартный контрол TextBox

Таймер - фукция SetTimer в WinAPI - http://msdn.microsof...6(v=vs.85).aspx

Может в борланде что-то готовое (в смысле некий "облегчённый вариант") есть ..

Изменено пользователем hd44780
Ссылка на комментарий
Поделиться на другие сайты

Путем насилования "гугля" понял (в общих чертах) как работает приложение в ОС Windows.

Приложение как прерывание. В котором каждое событие тоже как мини-прерывание, которое необходимо контролировать.

Правильно ли я понимаю?

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

В главной функции приложения есть такой цикл (привожу упрощённо, без обработки ошибок):

while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

Называется циклом обработки сообщений. Он выполняется на протяжении всего времени работы приложения. Такой конвеер: приём сообщения (нажатие клавиши, мышь над окном двинули, кликнули, окно передвинули и т.д. и т.п.), обработка, посылка в функцию окна. А в функции окна уже может быть описан обработчик этого сообщения. В средах разработки от Borland этот код скрыт для упрощения. Пишутся сразу обработчкики сообщений. Хотя есть возможность и написания приложения "с нуля".

По поводу таймера, либо функция api как посоветовал hd44780, либо готовый компонент должен быть, так и называется Timer. Посмотрите вкладки компонентов, либо Advanced либо System...

Ссылка на комментарий
Поделиться на другие сайты

Допустим есть поле Edit1 и кнопки Button1, Button2, Button3


// вывод переменной
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Edit1->text = IntToStr(x);
}

Добрый день Вам! Попробовал Ваш пример вывода переменной. Почему то выдает ошибку. Не можете пояснить что не так?

Буду Вам очень признателен!

Хочу попробовать сделать простейшие часы

Вот код:

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
sek_++;
if(sek_>59)
{
sek_=0;
min_++;
}
if(min_>59)
{
min_=0;
h++;
}
if(h>23)
{
h=0;
min_=0;
sek_=0;
}
Edit1->Text = "sek ; min ; h";
Edit2->text = IntToStr(sek_);
Edit3->text = IntToStr(min_);
Edit4->text = IntToStr(h);
}

post-59941-0-71034700-1354174638_thumb.gif

Изменено пользователем artos5

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Автору. Никаких тут 250...200 ватт у этой китайской бздюшки нет в помине. Тем паче на таком подобии радиатора Катушки даже на выходе нет-плохо  
    • Повторюсь - НЕТ, так как у вас там крутилки, что приведет к искажениям при работе в мостовой схеме. Если бы вы "могли" то вам нужно было разорвать выход с темброблока и вход усилителей и впаять (можно навесом) вот такую схему:
    • Все верно, вы почти все что нужно сделали.  Только не нужно было добавлять это b=UDR; Сразу после старта сбросить флаг flags = 0; А в основном цикле ждать установки флага FLAG_END_RX. И если он установлен, проверять на совпадение строки в буфере (rx_buf) с вашей строкой (AT+QM \ r \ n .....   .....  AT+MP \ r \ n) При совпадении вызывать выполнение нужного алгоритма.
    • У меня до саба ещё дело не дошло, только сейчас думаю купить амп на полкиловатта, но так можно, при условии, что на входе будет моно, и будет срез частот
    • Про флаг Т: если он не используется в основной программе, а у меня он постоянно в деле. для меня меня отложенная обработка прерывания обычное дело, нужно лишь правильно расставить приоритеты частей программы. И обычное дело: выставляешь частоту задающего генератора побольше, делишь его до получения частоты 1000 Гц каким либо таймером, загоняешь в прерывание с флагом. затем закольцовываешь основную программу с проверкой флага прерывания от таймера 1000Гц. загоняешь программу в Sleep. Получаешь кольцо обработки с образцовым интервалом в 1 мс. После любого прерывания проверяешь флаг от таймера, если он, то сбрасываешь флаг и начинаешь перебирать подпрограммы обработки индикаторов, клавиатуры, и тд. и тп, подпрограммы обработки флагов и др. После окончания обработки всех подпрограмм возвращаешься к Sleep. И так по кольцу. Если происходит прерывание не от таймера, программа выходит из Sleep, проверяется флаг от таймера, если не он (а это не он) обратно к Sleep. В большенстве программ использую этот алгоритм.   GPIOR1 и GPIOR2 в 88 условно можно использовать как флаги, но их адреса больше 0х1Е, на них не распространяются команды cbi, sbi, sbic, sbis, и их сначала нужно загрузить в общий регистр, промодифицировать, и заново сохранить. Эта последовательность длинная, и модифицирует SREG, что сводит на нет работу по сравнению с  классическим GPIOR.
    • @korsaj Сегодня попробовал сделать как ты посоветовал. Получился следующий код. #define F_CPU 7372800UL #define BAUND 9600L #define UBRRL_value (F_CPU/(BAUND*16))-1 #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdlib.h> void init_pin(void); #define C_PC0 (~PINC&(1<<PC0)) #define C_PC1 (~PINC&(1<<PC1)) #define LED_1_ON() PORTD|=(1<<PD2) #define LED_1_OFF() PORTD&=~(1<<PD2) #define LED_2_ON() PORTD|=(1<<PD3) #define LED_2_OFF() PORTD&=~(1<<PD3) #define FLAG_END_RX (1<<3) #define FLAG_ERR_RX (1<<4) #define BUF_SIZE 20 char rx_buf[BUF_SIZE]; char buf_index = 0; volatile start=1, flags; char b; ISR(USART_RXC_vect) { b=UDR; if(!(flags & FLAG_END_RX)) { rx_buf[buf_index]=UDR; if(rx_buf[buf_index] == 0x0D) { flags |= FLAG_END_RX; return; } buf_index++; if(buf_index >= BUF_SIZE) { buf_index = 0; flags |= FLAG_ERR_RX; } } } void init_UART() { UBRRL = UBRRL_value; UBRRH = UBRRL_value>>8; UCSRB|=(1<<TXEN); UCSRB|=(1<<RXEN); UCSRC|=((1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)); UCSRB|=(1<<RXCIE); sei(); flags = 0; } void send_UART(char value) { while(!(UCSRA&(1<<UDRE))); UDR=value; } int main(void) { init_pin(); init_UART(); while(1) { if (start==1) { _delay_ms(500); send_UART('O'); send_UART('K'); send_UART('!'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); start=0; } if (b == '0') { LED_1_ON(); LED_2_OFF(); send_UART('N'); send_UART('+'); send_UART('0'); send_UART('0'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '1') { LED_1_OFF(); LED_2_ON(); send_UART('N'); send_UART('+'); send_UART('0'); send_UART('1'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '2') { LED_1_ON(); LED_2_ON(); send_UART('N'); send_UART('+'); send_UART('0'); send_UART('2'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (b == '3') { LED_1_OFF(); LED_2_OFF(); send_UART('N'); send_UART('+'); send_UART('0'); send_UART('3'); send_UART(0x0D); send_UART(0x0A); _delay_ms(10); b=4; } if (C_PC0) { send_UART('P'); send_UART('C'); send_UART('0'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); } if (C_PC1) { send_UART('P'); send_UART('C'); send_UART('1'); send_UART(0x0D); send_UART(0x0A); _delay_ms(250); } } } void init_pin(void) { DDRC = 0b00000000; PORTC = 0b11111111; DDRD |= ((1<<2)|(1<<3)); PORTD &=~ ((1<<2)|(1<<3)); } Ну как сказать всё работает, но вот меня очень интересует приём команд на саму ATMEGA16. Он так и работает только с цифрами. Более ничего корректно принять не получается даже используя таблицу ascii. А мне нужно будет принимать команды и посложней чем просто буквенно - цифровые. Потому как возвращаясь к командам самого плеера там в этих командах хранятся различные данные. Вот примерно так это всё выглядит. AT+QM \ r \ n Запрос режима работы [0: Bluetooth], [1: MP3] AT+M1 \ r \ n Номер текущего файла AT+M2 \ r \ n Общее количество звуковых файлов AT+MD \ r \ n Источник музыки USB или SD Card AT+MT \ r \ n Общее время воспроизведения текущего файла AT+MK \ r \ n Время воспроизведения текущего файла AT+MP \ r \ n Текущее состояние плеера [0]Стоп, [1]Воспроизведение, [2]Пауза К примеру при отправке команды AT+M1 \ r \ n в ответ мы получим M1 + 000002 \ r \ n при этом здесь может быть любое число в hex формате. Мне же нужно каким то образом принять эти данные и обработать их соответствующим образом. Но при этом и нужно учитывать так же что плеер может сам отправить эти данные по началу воспроизведения трека. Вот в этом сейчас и стоит основная задача. Чего я и пытаюсь получить в итоге.
×
×
  • Создать...