Разработка приложения для Windows для начинающих

Mach, популярные и не очень CAD, CAM. Обсуждение и разработка программ для управления станками.
Woodmaster
Опытный
Сообщения: 112
Зарегистрирован: 10 сен 2011, 18:18
Репутация: 11
Контактная информация:

Разработка приложения для Windows для начинающих

Сообщение Woodmaster »

Доброго дня! Возможно тема немного не "тему", но наверно самый подходящий раздел.

Надо написать простое приложения для Windows, которое будет общаться с контроллером через СОМ-порт - отправлять введенные данные и отображать принятые.
Конечно можно найти кого-то кто напишет все что-надо, но хочется "повысить свою квалификацию".
С написанием приложений для ПК не сталкивался (очень давно-давно на Паскале писал простые программки под DOS, но это уже не актуально).
Работаю пока только с контроллерами и знаю С.

Вопрос для новичка : на чем сейчас актуально писать программы для ПК? с чего начинать изучать?

Сейчас смотрю на Visual Studio C++, но очень много непонятного. И самое главное, пока непонятно где что искать и что смотреть.
Прошу помочь кто-чем может!
Заранее благодарен!
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6192
Откуда: Казахстан.
Контактная информация:

Re: Разработка приложения для Windows для начинающих

Сообщение aftaev »

Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4604
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1621
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Разработка приложения для Windows для начинающих

Сообщение selenur »

В качестве среды разработки С# сейчас стал очень популярен, примеров очень много, используя совместно с МК AVR или STM
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
romanru1
Мастер
Сообщения: 584
Зарегистрирован: 22 фев 2013, 22:31
Репутация: 177
Откуда: Первоуральск
Контактная информация:

Re: Разработка приложения для Windows для начинающих

Сообщение romanru1 »

ИМХО С# самый перспективный и популярный для windows.
Woodmaster писал(а):Прошу помочь кто-чем может!
В первую очередь скачайте и установите Microsoft Visual Studio Express 2013 для Windows Desktop .
Создайте проект windows forms . ( Появится главное окно будущей программы )
перетащите на окно компонент BUTTON ( КНОПКА ).
перетащите на окно компонент COMPORT .
Кликните по кнопке созданной и переместитесь в код обработчик нажатия на кнопку .
Пишите код.
— Мы месяц по Галактике «маму» попоём — и планета у нас в кармане.
Woodmaster
Опытный
Сообщения: 112
Зарегистрирован: 10 сен 2011, 18:18
Репутация: 11
Контактная информация:

Re: Разработка приложения для Windows для начинающих

Сообщение Woodmaster »

Спасибо за ответы!
Вчера скачал Visual Studio Express 2010 C++. По примерам с сайта Microsoft сделал простое "приложение" с двумя кнопками "инкремент" и "декремент", и полем отображения переменной, которая изменяется кнопками. Для первого для изучения пока все :)

На С# пока не смотрел. А что "проще" для новичка С++ или С#? Есть сильные различия в написании программ?

Еще важный вопрос - приложение должно работать начиная с Win XP, и на WIn 7 и 8.
Если работать в Visual Studio Express 2013 - приложение будет совместимо с XP или надо использовать предыдущие версии Visual Studio?
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4604
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1621
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Разработка приложения для Windows для начинающих

Сообщение selenur »

С# интуитивно проще, при написании программы используется framework 2 или 3 или 4 версии, в зависимости от параметров при создании проекта. Так вот что-бы программа работала в любой версии виндовс, достаточно что-бы на машине был установлен фрейморк нужной версии.
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Woodmaster
Опытный
Сообщения: 112
Зарегистрирован: 10 сен 2011, 18:18
Репутация: 11
Контактная информация:

Re: Разработка приложения для Windows для начинающих

Сообщение Woodmaster »

Aftaev Спасибо за видео пример! Вот бы еще исходники на это посмотреть "в живую". В инете искал, ничего не нашел :(
romanru1
Мастер
Сообщения: 584
Зарегистрирован: 22 фев 2013, 22:31
Репутация: 177
Откуда: Первоуральск
Контактная информация:

Re: Разработка приложения для Windows для начинающих

Сообщение romanru1 »

ВОТ C#
Обработчик события "кнопка клик" ( кнопка соединения / разъединения с портом )

Код: Выделить всё



    private void button1_Click(object sender, EventArgs e)
        {
       
            if (serialPort1.IsOpen)    // если порт открыт      
            {
                serialPort1.Close();     // закрыть

                label1.BackColor = Color.Red;    // изменить цвет элемента ЛЭЙБЛ на красный
                label1.Text = "disconnected";   // изменить надпись элемента ЛЭЙБЛ на  disconnected 
            }
                
            else {                                                // если закрыт , открываем 

                serialPort1.BaudRate = 115200;
                serialPort1.DataBits = 8;
                serialPort1.Parity = 0;
                serialPort1.StopBits = System.IO.Ports.StopBits.One;
         

                

                serialPort1.Open();   // открываем


                if (serialPort1.IsOpen)
                {
                    label1.BackColor = Color.Green;
                    label1.Text = "connected";
                }
                else
                {
                    label1.BackColor = Color.Red;
                    label1.Text = "disconnected";
                }
            }
        }

обработчик события кнопка клик , отсылает в порт то что написал в контроле comboBox1

Код: Выделить всё


private void button2_Click(object sender, EventArgs e)
        {
            if(serialPort1.IsOpen){    // если порт открыт 
             
     
                var tt = comboBox1.Text.ToArray();  // создаем переменную с автоматическим присвоением типа ( int , char , double ,array char  сама определится кем быть )
     
                if (serialPort1.IsOpen) { serialPort1.Write(tt,0,comboBox1.Text.Length);}  // если порт опен пишем в него массив tt , 
                                                                                                                                       // начиная с нулевого элемента и 
                                                                                                                                    /// длинной полученной из comboBox1.Text.Length 


               
              
            }
— Мы месяц по Галактике «маму» попоём — и планета у нас в кармане.
Woodmaster
Опытный
Сообщения: 112
Зарегистрирован: 10 сен 2011, 18:18
Репутация: 11
Контактная информация:

Re: Разработка приложения для Windows для начинающих

Сообщение Woodmaster »

Спасибо, затвра буду вникать!
Листинг на С# значительно проще, чем на С++ в тех примерах что я видел.
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4604
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1621
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Разработка приложения для Windows для начинающих

Сообщение selenur »

При разработке компьютерной программы для работы с устройством с использованием КОМ-порта, необходимо как-то эмулировать само устройство (если его нет), и для этого можно воспользоваться следующим методом:
1) Скачать и установить программу http://sourceforge.net/projects/com0com/ данная программа на компьютере создает 2 программных ком-порта, которые соединены между собой.
2) Скачать https://sites.google.com/site/terminalbpp/ это лучшая на сегодня терминальная программа, хотя можно использовать и гипер-терминал, и путти...

После установки первой программы мы увидим следующее: У меня появилось 2 ком-порта 7 и 8.
Для примера я запустил 2 терминальные программы, а в твоем случае, одна будет твоя программа а вторая терминальная. На картинке видим что отправив данные с ком-порта 7, они получены на ком-порте 8, и наоборот :-)
Думаю это немного упростит вам разработку.

И ещё добавлю к предыдущему посту, у компоненты Последовательного порта есть событие, которое происходит когда приходят с ком-порта данные, код выглядит примерно так:

Код: Выделить всё

 private static void DataReceivedHandler( object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();        
    }
В переменную indata помещаются полученные данные, если например получено не все сообщение, то можно завести специальную переменную, в которой накапливать полученные данные пока не дойдем до окончания сообщения.
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
romanru1
Мастер
Сообщения: 584
Зарегистрирован: 22 фев 2013, 22:31
Репутация: 177
Откуда: Первоуральск
Контактная информация:

Re: Разработка приложения для Windows для начинающих

Сообщение romanru1 »

selenur писал(а):если например получено не все сообщение, то можно завести специальную переменную
А еще вот например тоже самое ,но данные кладутся в переменную если принята " строка целиком " с символами конец строки возврат каретки

Код: Выделить всё

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
     
  {
          
             message = serialPort1.ReadLine();
            

     // listBox1.Items.Add(message);  // но вот здесь при попытке написать принятое в лист бокс РУГАЕТСЯ что лист бокс создан в другом потоке и нет доступа

             f1();  // пришлось делать ТАК, делегаты долбанные  
        }
         

Код: Выделить всё


public void f1()
        {
            if (listBox1.InvokeRequired)
            {
                MethodInvoker mi = delegate
                {
                    f1();                                
                };
                listBox1.Invoke(mi);
            }
            else
            {
                listBox1.Items.Add(message);
                
            }
        }
— Мы месяц по Галактике «маму» попоём — и планета у нас в кармане.
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4604
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1621
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Разработка приложения для Windows для начинающих

Сообщение selenur »

Для эмуляции ком-портов есть более интуитивно понятная программа, и с большим функционалом Virtual Serial Ports Emulator скачать можно тут: http://www.eterlogic.com/Downloads.html
Выглядит так: Для работы с элементами формы из другого потока можно сделать проще, вот так:

Код: Выделить всё

                   
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
     message = serialPort1.ReadLine();

     this.Invoke((MethodInvoker)delegate {
          listBox1.Items.Add(message);              
     });


Но нужно понимать что при большом объеме входящих данных, визуальная часть будет виснуть :-)
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
romanru1
Мастер
Сообщения: 584
Зарегистрирован: 22 фев 2013, 22:31
Репутация: 177
Откуда: Первоуральск
Контактная информация:

Re: Разработка приложения для Windows для начинающих

Сообщение romanru1 »

selenur писал(а):другого потока можно сделать проще, вот так:
Класс !
Вот кстати интересная " засада " :
При попытке отправлять в STM32 число ( float ) из контрола numericUpDown его конвертируеш в строку , а она зараза вместо точек ставит запятую .
И естественно на стороне STM32 функция ATOF ничего с этой байдой сделать не смогет.
Приходилось принудительно менять запятые на точки .

Код: Выделить всё



private void numericUpDown1Pgain_ValueChanged(object sender, EventArgs e)
        {
            var s = numericUpDown1Pgain.Value.ToString();
            if (serialPort1.IsOpen) { serialPort1.WriteLine(("pg"+s.Replace(",", ".") + "!")); }
— Мы месяц по Галактике «маму» попоём — и планета у нас в кармане.
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4604
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1621
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Разработка приложения для Windows для начинающих

Сообщение selenur »

Точка, или запятая, да хоть тире, или другой символ в качестве разделителя задается тут:
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
aaleksander
Мастер
Сообщения: 577
Зарегистрирован: 23 авг 2013, 18:04
Репутация: 118
Откуда: г. Ухта
Контактная информация:

Re: Разработка приложения для Windows для начинающих

Сообщение aaleksander »

selenur писал(а):Точка, или запятая, да хоть тире, или другой символ в качестве разделителя задается тут:
А потом объясняй всем пользователям, почему у него ничего не работает и где этот диалог найти.

Это делается в самом приложении:

Код: Выделить всё

            CultureInfo ci = new CultureInfo("ru-RU", true);
            ci.NumberFormat.NumberDecimalSeparator = ".";
            Thread.CurrentThread.CurrentCulture = ci;
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4604
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1621
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Разработка приложения для Windows для начинающих

Сообщение selenur »

aaleksander писал(а):
selenur писал(а):Точка, или запятая, да хоть тире, или другой символ в качестве разделителя задается тут:
А потом объясняй всем пользователям, почему у него ничего не работает и где этот диалог найти.

Это делается в самом приложении:

Код: Выделить всё

            CultureInfo ci = new CultureInfo("ru-RU", true);
            ci.NumberFormat.NumberDecimalSeparator = ".";
            Thread.CurrentThread.CurrentCulture = ci;
Это конечно самый правильный способ, если в программе много мест, работы с числом, а так можно и форматнуть строку :-)
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Ответить

Вернуться в «Windows / Mach»