Страница 1 из 1

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

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

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

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

Сейчас смотрю на Visual Studio C++, но очень много непонятного. И самое главное, пока непонятно где что искать и что смотреть.
Прошу помочь кто-чем может!
Заранее благодарен!

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

Добавлено: 10 мар 2014, 10:56
aftaev

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

Добавлено: 10 мар 2014, 11:01
selenur
В качестве среды разработки С# сейчас стал очень популярен, примеров очень много, используя совместно с МК AVR или STM

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

Добавлено: 10 мар 2014, 12:20
romanru1
ИМХО С# самый перспективный и популярный для windows.
Woodmaster писал(а):Прошу помочь кто-чем может!
В первую очередь скачайте и установите Microsoft Visual Studio Express 2013 для Windows Desktop .
Создайте проект windows forms . ( Появится главное окно будущей программы )
перетащите на окно компонент BUTTON ( КНОПКА ).
перетащите на окно компонент COMPORT .
Кликните по кнопке созданной и переместитесь в код обработчик нажатия на кнопку .
Пишите код.

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

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

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

Еще важный вопрос - приложение должно работать начиная с Win XP, и на WIn 7 и 8.
Если работать в Visual Studio Express 2013 - приложение будет совместимо с XP или надо использовать предыдущие версии Visual Studio?

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

Добавлено: 10 мар 2014, 13:09
selenur
С# интуитивно проще, при написании программы используется framework 2 или 3 или 4 версии, в зависимости от параметров при создании проекта. Так вот что-бы программа работала в любой версии виндовс, достаточно что-бы на машине был установлен фрейморк нужной версии.

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

Добавлено: 10 мар 2014, 13:12
Woodmaster
Aftaev Спасибо за видео пример! Вот бы еще исходники на это посмотреть "в живую". В инете искал, ничего не нашел :(

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

Добавлено: 10 мар 2014, 17:57
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 


               
              
            }

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

Добавлено: 10 мар 2014, 20:55
Woodmaster
Спасибо, затвра буду вникать!
Листинг на С# значительно проще, чем на С++ в тех примерах что я видел.

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

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

После установки первой программы мы увидим следующее:
(для просмотра содержимого нажмите на ссылку)
2014-03-10_233416.png (5589 просмотров) <a class='original' href='./download/file.php?id=25746&mode=view' target=_blank>Загрузить оригинал (280.05 КБ)</a>
У меня появилось 2 ком-порта 7 и 8.
Для примера я запустил 2 терминальные программы, а в твоем случае, одна будет твоя программа а вторая терминальная.
(для просмотра содержимого нажмите на ссылку)
2014-03-10_235045.png (5589 просмотров) <a class='original' href='./download/file.php?id=25747&mode=view' target=_blank>Загрузить оригинал (137.45 КБ)</a>
На картинке видим что отправив данные с ком-порта 7, они получены на ком-порте 8, и наоборот :-)
Думаю это немного упростит вам разработку.

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

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

 private static void DataReceivedHandler( object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();        
    }
В переменную indata помещаются полученные данные, если например получено не все сообщение, то можно завести специальную переменную, в которой накапливать полученные данные пока не дойдем до окончания сообщения.

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

Добавлено: 11 мар 2014, 06:51
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);
                
            }
        }

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

Добавлено: 11 мар 2014, 07:23
selenur
Для эмуляции ком-портов есть более интуитивно понятная программа, и с большим функционалом Virtual Serial Ports Emulator скачать можно тут: http://www.eterlogic.com/Downloads.html
Выглядит так:
(для просмотра содержимого нажмите на ссылку)
Снимок999.JPG (5560 просмотров) <a class='original' href='./download/file.php?id=25753&mode=view' target=_blank>Загрузить оригинал (65.22 КБ)</a>
Для работы с элементами формы из другого потока можно сделать проще, вот так:

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

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

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


Но нужно понимать что при большом объеме входящих данных, визуальная часть будет виснуть :-)

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

Добавлено: 11 мар 2014, 08:00
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(",", ".") + "!")); }

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

Добавлено: 11 мар 2014, 08:23
selenur
Точка, или запятая, да хоть тире, или другой символ в качестве разделителя задается тут:
(для просмотра содержимого нажмите на ссылку)
Снимок8888.JPG (5545 просмотров) <a class='original' href='./download/file.php?id=25754&mode=view' target=_blank>Загрузить оригинал (136.78 КБ)</a>

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

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

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

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

            CultureInfo ci = new CultureInfo("ru-RU", true);
            ci.NumberFormat.NumberDecimalSeparator = ".";
            Thread.CurrentThread.CurrentCulture = ci;

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

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

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

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

            CultureInfo ci = new CultureInfo("ru-RU", true);
            ci.NumberFormat.NumberDecimalSeparator = ".";
            Thread.CurrentThread.CurrentCulture = ci;
Это конечно самый правильный способ, если в программе много мест, работы с числом, а так можно и форматнуть строку :-)