Страница 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/ это лучшая на сегодня терминальная программа, хотя можно использовать и гипер-терминал, и путти...
После установки первой программы мы увидим следующее:
У меня появилось 2 ком-порта 7 и 8.
Для примера я запустил 2 терминальные программы, а в твоем случае, одна будет твоя программа а вторая терминальная.
На картинке видим что отправив данные с ком-порта 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
Выглядит так:
Для работы с элементами формы из другого потока можно сделать проще, вот так:
Код: Выделить всё
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
Точка, или запятая, да хоть тире, или другой символ в качестве разделителя задается тут:
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;
Это конечно самый правильный способ, если в программе много мест, работы с числом, а так можно и форматнуть строку
