Введение в c# sharp: программирование простым языком arduino+

Введение в C# (C Sharp): программирование простым языком

Начинаем писать статьи направленные на формирование представления о простейших составляющих написания кода для людей. Сегодня материал для тех, кто только начавших изучение языка C# Sharp (Си Шарп). Всяк ступивший на стезю сотворения алгоритма да не убоится неизвестности, бардака и самозабвения.

О языке программирования C#

Каждый человек, решивший обучиться написанию кода рано или поздно сталкивается с необходимостью посмотреть в справочнике информацию касательно какой-либо функции. И в большинстве случаев издание очень расстраивает из-за своей научности.

Создается впечатление, что умные книжки существуют для особой касты людей, в то время как для простых смертных их содержание – тайна за семью печатями. Но все люди постигают новое, главное не отчаиваться.

И подобрать себе подходящую литературу, в которой доступным для осознания языком описаны все тонкости составления алгоритмов. Эта статья призвана ввести в мир компьютерного кода C# Sharp, доказав возможность осознавать назначение каждого элемента программного кода.

С# (С Sharp, Си Шарп) – объектно-ориентированный язык программирования. Что это означает? Объект – участок кода, содержащий в себе данные и инструкции по их обработке.

Пример

Объект «попугай» содержит в себе данные о сытости и настроении, действия «есть», «подражать голосу хозяина» и «кусаться». Будет птица дразниться или кусаться зависит от текущего настроя: если питомец весел, то он скорее будет играть, чем травмировать своего кормильца.

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

Это автономный участок кода, в котором написано, что перед нами такое и что оно может. Объектная ориентированность подразумевает, что код программы представляет из себя блок связанных друг с другом частей, способных к самостоятельному существованию по отдельности.

Алгоритмы и компиляторы

Алгоритм, записанный на одном из существующих языков, являет собой интересное сочетание механики и гибкости. Как и все другие изобретенные человеком языки, он позволяет побудить к действию, описать красоту реального мира подобно тексту художественной литературы.

Однако от языков общения между людьми, программа отличается высокими требованиями к синтаксису, то есть порядку написания, критериям содержания абзацев.

Прежде всего, компиляторы (программы, в которой пишутся программы) очень чувствительны к регистру. Все операторы, переменные и команды нужно запоминать и писать в точности так, как они написаны в справочниках. То есть, переменная a и переменная A – совершенно разные переменные, а если будет написана строчка console.writeline(“”); вместо Console.WriteLine(“”); то будет выведена ошибка и, если повезет, правильно указано ее местоположение.

Пунктуация

Следующий «подводный камень» – пунктуация. Ситуация сравнима с диктантом по русскому языку у придирчивого преподавателя. Пропустите знак хоть в одном месте – программа откажется работать.

Излишество также не приветствуется. Стоит сделать оговорку, что существуют некоторые места в теле кода, где ошибка не является фатальной, но это уже тонкости.

Для начала разберемся с основными значками:

  • Знак «;»
  • Знаки «//» и пара «/*» и «*/»
  • Знаки «< >»
  • Знаки «” “»

Знак «;» прописывается в конце строки. Он обозначает для компьютера конец команды и разрешение приступить к следующей. Его смысл аналогичен точке в конце предложения: «Я есть Грут; Грут самый лучший юморист; Правда ли он симпатяга;».

Да, с эмоциями здесь натянуто. Впрочем, можно высказаться внутри знаков «//» и «/* */». Первый используется для заметок размером в одну строку, второй нужен для более распространенного текста. Они говорят компьютеру, что содержимое внутри пространства, обрамленного такими значками, не имеет к нему никакого отношения. Программист заключает в них комментарии, помогающие при отладке кода. «< >» нужны для обозначения границ конкретно взятого объекта.

Грубо говоря, их можно сравнить с обложкой тетради. Их функция – заключения внутри себя участка кода. Они являются привычным атрибутом многострочного программного текста, заключенного внутри команды. А парочка «” “» используется внутри текстовых операторов для помещения непосредственно текста для выведения на экран.

Начало программы

Каждая программа начинается со строк using. Это библиотека. Если перевести на понятный язык, using присоединяет к программе особую библиотеку, в которой хранятся команды с описанием выполняемых действий по запросу.

Так, Console.WriteLine хранится в библиотеке System.Text, в которой сказано, что программа должна вывести на экран текст внутри кавычек. Минимальный набор выглядит таким образом:

Следующая немаловажная деталь – Main(). В переводе с английского «главный», что прямо намекает на его назначение. Исполнение алгоритма начинается с кода, заключенного внутри Main().

Текст внутри данного оператора можно сравнить с главной страницей сайта. Сюда записывается основная последовательность действий, сопроводительная информация и ссылки в другие части программы. В показанном примере главное тело присутствует с характеристикой void.

Это включение предполагает, что программа, исполнив свою инструкцию, удалит все данные. Напоминает вывеску в столовой: «Поел – убрал за собой». Напоследок можно разобрать две простейшие команды: Console.WriteLine и Console.ReadLine.

Console.WriteLine(“”); призвана вывести на экран текст, заключенный внутри кавычек. Пример с этим оператором разобран в скриншоте выше, поэтому сразу перехожу к другой команде.

Console.ReadLine() приказывает принять информацию, введенную пользователем с клавиатуры и записать в отсек памяти с возможностью дальнейшей обработки другими методами, в том числе выведения на экран.

Заключение

Подытожим. Теперь нам известны основные правила синтаксиса, а также мы получили образное представление о базовых элементах кода. Неплохо для одного дня. Для тех кто программирует Ардуино нужно понимать, что этот микроконтроллер программируется языком C++. Но мы все знаем, что изучив даже один язык программирования довольно легко выучить и другие. Всем хорошего настроения. Дорогу осилит идущий.

Введение в C#

Язык C# и платформа .NET Core

На сегодняшний момент язык программирования C# один из самых мощных, быстро развивающихся и востребованных языков в ИТ-отрасли. В настоящий момент на нем пишутся самые различные приложения: от небольших десктопных программок до крупных веб-порталов и веб-сервисов, обслуживающих ежедневно миллионы пользователей.

По сравнению с другими языками C# достаточно молодой, но в то же время он уже прошел большой путь. Первая версия языка вышла вместе с релизом Microsoft Visual Studio .NET в феврале 2002 года. Текущей версией языка является версия C# 8.0, которая вышла в сентябре 2019 года вместе с релизом .NET Core 3.

C# является языком с Си-подобным синтаксисом и близок в этом отношении к C++ и Java. Поэтому, если вы знакомы с одним из этих языков, то овладеть C# будет легче.

C# является объектно-ориентированным и в этом плане много перенял у Java и С++. Например, C# поддерживает полиморфизм, наследование, перегрузку операторов, статическую типизацию. Объектно-ориентированный подход позволяет решить задачи по построению крупных, но в тоже время гибких, масштабируемых и расширяемых приложений. И C# продолжает активно развиваться, и с каждой новой версией появляется все больше интересных функциональностей, как, например, лямбды, динамическое связывание, асинхронные методы и т.д.

Роль платформы .NET

Когда говорят C#, нередко имеют в виду технологии платформы .NET (Windows Forms, WPF, ASP.NET, Xamarin). И, наоборот, когда говорят .NET, нередко имеют в виду C#. Однако, хотя эти понятия связаны, отождествлять их неверно. Язык C# был создан специально для работы с фреймворком .NET, однако само понятие .NET несколько шире.

Как-то Билл Гейтс сказал, что платформа .NET – это лучшее, что создала компания Microsoft. Возможно, он был прав. Фреймворк .NET представляет мощную платформу для создания приложений. Можно выделить следующие ее основные черты:

Поддержка нескольких языков . Основой платформы является общеязыковая среда исполнения Common Language Runtime (CLR), благодаря чему .NET поддерживает несколько языков: наряду с C# это также VB.NET, C++, F#, а также различные диалекты других языков, привязанные к .NET, например, Delphi.NET. При компиляции код на любом из этих языков компилируется в сборку на общем языке CIL (Common Intermediate Language) – своего рода ассемблер платформы .NET. Поэтому мы можем сделать отдельные модули одного приложения на отдельных языках.

Кроссплатформенность . .NET является переносимой платформой (с некоторыми ограничениями). Например, последняя версия платформы на данный момент .NET Core поддерживается на большинстве современных ОС Windows, MacOS, Linux. Используя различные технологии на платформе .NET, можно разрабатывать приложения на языке C# для самых разных платформ – Windows, MacOS, Linux, Android, iOS, Tizen.

Мощная библиотека классов . .NET представляет единую для всех поддерживаемых языков библиотеку классов. И какое бы приложение мы не собирались писать на C# – текстовый редактор, чат или сложный веб-сайт – так или иначе мы задействуем библиотеку классов .NET.

Разнообразие технологий . Общеязыковая среда исполнения CLR и базовая библиотека классов являются основой для целого стека технологий, которые разработчики могут задействовать при построении тех или иных приложений. Например, для работы с базами данных в этом стеке технологий предназначена технология ADO.NET и Entity Framework Core. Для построения графических приложений с богатым насыщенным интерфейсом – технология WPF и UWP, для создания более простых графических приложений – Windows Forms. Для разработки мобильных приложений – Xamarin. Для создания веб-сайтов – ASP.NET и т.д.

Также еще следует отметить такую особенность языка C# и фреймворка .NET, как автоматическая сборка мусора. А это значит, что нам в большинстве случаев не придется, в отличие от С++, заботиться об освобождении памяти. Вышеупомянутая общеязыковая среда CLR сама вызовет сборщик мусора и очистит память.

.NET Framework и .NET Core

Стоит отметить, что .NET долгое время развивался премущественно как платформа для Windows под названием .NET Framework. В 2019 выщла последняя версия этой платформы – .NET Framework 4.8. Она больше не развивается

С 2014 Microsoft стал развивать альтернативную платформу – .NET Core, которая уже предназначалась для разных платформ и должна была вобрать в себя все возможности устаревшего .NET Framework и добавить новую функциональность. Поэтому следует различать .NET Framework, который предназначен преимущественно для Windows, и кросплатформенный .NET Core. В данном руководстве речь будет идти о C# в связке с .NET Core, поскольку это актуальная платформа.

Также стоит упомянуть о платформе Mono, которая была создана еще в 2004 году и представляла опенсорс-версию платформы .NET Framework для Linux и MacOS. Используя Mono, можно было создавать кросплатформенные приложения на C#.

Управляемый и неуправляемый код

Нередко приложение, созданное на C#, называют управляемым кодом (managed code). Что это значит? А это значит, что данное приложение создано на основе платформы .NET и поэтому управляется общеязыковой средой CLR, которая загружает приложение и при необходимости очищает память. Но есть также приложения, например, созданные на языке С++, которые компилируются не в общий язык CIL, как C# или VB.NET, а в обычный машинный код. В этом случае .NET не управляет приложением.

В то же время платформа .NET предоставляет возможности для взаимодействия с неуправляемым кодом..

JIT-компиляция

Как выше писалось, код на C# компилируется в приложения или сборки с расширениями exe или dll на языке CIL. Далее при запуске на выполнение подобного приложения происходит JIT-компиляция (Just-In-Time) в машинный код, который затем выполняется. При этом, поскольку наше приложение может быть большим и содержать кучу инструкций, в текущий момент времени будет компилироваться лишь та часть приложения, к которой непосредственно идет обращение. Если мы обратимся к другой части кода, то она будет скомпилирована из CIL в машинный код. При том уже скомпилированная часть приложения сохраняется до завершения работы программы. В итоге это повышает производительность.

По сути это все, что вкратце надо знать о платформе .NET. А теперь создадим первое приложение.

Введение в C#

C# (читается как “си шарп”) – простой, мощный, статически типизированный, объектно ориентированный язык программирования от компании Microsoft. C# входит в семейство языков программирования C, синтаксис языка покажется знакомым программистам, которые работали с C, C++, Java и JavaScript.

Первая версия языка C# была создана в 1998-2001 годах, группой инженеров Microsoft под руководством Андреса Хейлсберга и Скотта Вильтаумота, как основной язык программирования платформы Microsoft .Net.

C# вобрал в себя лучшие свойства языков C, C++, Modula, Object Pascal, опираясь на опыт их практического использования. Некоторые проблемные модели, которые до этого использовались в языках программирования, к примеру множественное наследование классов(используется в С++), были сознательно выключены.

Во многих отношениях язык C# очень похож на Java, это сходство заметно в синтаксисе и основных понятиях этих языков программирования.

История появления

Название C# толкуется как следующее поколение развития С++, а символ # – обозначает “++++”. Изначально в языке фигурировал диез – “♯”(на английском sharp), однако из-за отсутствия этого символа на клавиатуре, используется знак для обозначения номера “#”. В общем название языка можно обозначать обеими символами.

Разработка языка C# началась в декабре 1998 года и готовилась к выпуску вместе с продуктами группы Millenium. Проект имел название COOL(C-style Object Oriented Language) и разрабатывался как аналог Java от компании Oracle. C# был анонсирован, в 2000 году, как основной язык платформы Microsoft .Net Framework. В этом же году, появилась первая общедоступная бета версия.

Первая финальная версия языка программирования C# была выпущена в 2002 году вместе со средой интегрированной разработки программного обеспечения Visual Studio .Net.

Подобно к Java, C# получил следующие концепции:

  • виртуальная машина – платформа .Net исполняет программу подобно виртуальной машине Java;
  • байт-код – программный код компилируется в промежуточный язык MSIL(Microsoft Intermediate Language), и только потом преобразуется в машинный язык, в зависимости от платформы на которой запускается программа;
  • управляемый код – поскольку программы, написанные на C#, запускаются исключительно в виртуальной среде CLR(Common Language Runtime), то можно контролировать их выполнение и останавливать их в любой момент, а также контролировать использование памяти, при необходимости – выделять или удалять части памяти, которые использует программа.

Версии языка C#

Версия 1

В первую версию языка вошли:

  • свойства – конструкции подобные полям класса, основным отличием от последних есть то, что при обращении к свойствам вызываются методы get set;
  • индексаторы – похожи на свойства, но на вход принимают индекс, как это реализовано в массивах;
  • события – парадигмы программирования, в которых исполнение программы зависит от действий пользователя(взаимодействие со средствами ввода), сообщений полученных от других программ, потоков или операционной системы;
  • циклы – конструкции, которые позволяют многократно повторять части кода;
  • делегаты – классы, которые хранят в себе ссылки на методы;
  • структуры – типы данных, которые могут содержать наборы значений соответственных типов.

Кроме приведенных, язык получил некоторые возможности, которые отсутствовали в Java:

  • беззнаковые типы данных;
  • оператор goto;
  • перегрузку(переопределение) операторов;
  • передача в метод параметров по ссылке;
  • методы с разным числом параметров(реализуется путем перегрузки метода);

В C# также осталась возможность, хоть и очень ограниченная, использовать указатели.

Версия 2

В эту версию языка вошли такие нововведения:

  • возможность разделить один класс на несколько физических файлов;
  • nullable типы данных, которые обозначаются как тип?, например double? d = null;
  • обобщенные типы данных, или generics, которые поддерживаются на уровне CLR;
  • итератор yield;
  • анонимные методы;
  • новый оператор “??”, который является упрощенной формой тернарного оператора, для проверки объекта на null. Записи x = o1 != null ? o1 : o2; и x = o1 ?? o2 идентичны;

Версия 3

  • поддержка LINQ(language integrated query) – синтаксиса, который позволяет выполнять запросы, подобные до SQL, к разным типам данных;
  • создание объектов с одновременной инициализацией полей;
  • лямбда выражения;
  • неявная типизация, путем введения ключевого слова var;
  • анонимные типы данных;
  • методы расширения;

Версия 4

Самым важным нововведением стал тип данных dynamic, который позволил реализовать позднее связывание объектов, для использования с:

  • динамически типизированными языками Python, Ruby;
  • автоматизацией продуктов Microsoft Office с использованием COM-объектов;

Кроме этого в язык вошли следующие возможности:

  • библиотека для работы с параллельными задачами;
  • класс MemoryCache для кэширования даних;
  • классы мульти-поточных коллекций в System.Collections.Concurrent;

Версия 5

Эта версия расширилась набором классов для работы с асинхронными операциями. Появились новые ключевые слова async, await, а также TAP шаблон(Task-based Asynchronous Pattern).

Версия 6

Все изменения, которые вошли в эту редакцию языка С#, являются синтаксическим сахаром – упрощают написание конструкций.

  • инициализация свойств со значениями (public int Number < get; set; >= 42;);
  • интерполяция строк, позволила использовать имена переменных при построении строк (text = $“Hello );
  • лямбда-выражения для упрощенной записи методов (public int Sqr(int a) => a*a;);
  • импорт статических классов;
  • инициализация Dictionary;
  • Элвис (null условный) оператор – “?.”
  • оператор nameof – возвращает имя параметра, который в него передан;
  • await в catch и finally блоках;
  • фильтры исключений.

Версия 7

  • бинарные литералы – для записи чисел в двоичной системе счисления (0b0001);
  • локальные функции;
  • кортежи (tuples), позволяют методу возвращать несколько значений одновременно;
  • сопоставление с шаблоном (pattern matching) – позволяет писать конструкции if(x is int i);
  • возможность возвращать из методы ссылку на объект.

Платформа .Net

Как Вы видите, язык C# и платформа .Net постоянно развиваются, вбирая в себя лучшие практики использования языков программирования.

Многоязычность

Кроме C#, среда CLR поддерживает много других языков программирования, в частности Microsoft разрабатывают Visual Basic .Net и F#. Кроме этого существуют .Net реализации языков: Delphi.Net, IronPython, IronRuby, Boo, PascalABC.Net.

Кроссплатформенность

.Net позволяет разрабатывать программное обеспечение под разные операционные системы: Windows, MacOS, Linux, Android, iOS. Mono – реализация .Net для Linux. Среды разработки: Visual Studio, Visual Studio Code, Unity3D, Xamarin, SharpDevelop, MonoDevelop покрывают все операционные системы и технологии, и позволяют делать мобильные, настольные(desktop), Web, встроенные(embedded) приложения и сервисы.

Работа с Arduino из C# приложения

В этой статье я хотел бы рассказать о том, как можно считывать данные и управлять платой Arduino, подключенной через USB порт, из .Net приложения и из приложения UWP.

Делать это можно без использования сторонних библиотек. Фактически, используя только виртуальный COM порт.

Давайте сначала напишем скетч для Arduino. Мы будем отправлять на порт строку с текстом, содержащим в себе значение переменной, которая у нас будет постоянно изменятся в цикле (таким образом имитируя данные снятые с датчика). Также будем считывать данные с порта и в случае если получим текст «1», то включим встроенный в плату светодиод. Он расположен на 13-ом пине и помечен на плате латинской буквой L. А если получим «0», то выключим его.

WPF приложение

Теперь создадим WPF приложение. Разметку сделаем довольно простой. 2 кнопки и метка для отображения текста полученного с порта это все что необходимо:

Добавим 2 пространства имен:

И в области видимости класса 2 переменные с делегатом:

Реализуем событие Window_Loaded. В нем мы пройдемся по всем доступным портам, прослушаем их и проверим не выводится ли портом сообщение с текстом «Info from Arduino». Если найдем порт отправляющий такое сообщение, то значит нашли порт Arduino. В таком случае можно установить его параметры, открыть порт и запустить таймер.

Для снятия данных с порта и сравнения их с искомыми я использовал функцию ArduinoDetected:

Теперь осталось реализовать обработку события таймера. Метод OnTimedEvent можно сгенерировать средствами Intellisense. Его содержимое будет таким:

Мы считываем значение с порта и выводим его в виде текста метки. Но так как таймер у нас работает в потоке отличном от потока UI, то нам необходимо использовать Dispatcher.BeginInvoke. Вот здесь нам и пригодился объявленный в начале кода делегат.

После окончания работы с портом очень желательно его закрыть. Но так как мы работаем с ним постоянно, пока приложение открыто, то закрыть его логично при закрытии приложения. Добавим в наше окно обработку события Closing:

Готово. Теперь осталось сделать отправку на порт сообщения с текстом «1» или «0», в зависимости от нажатия кнопки и можно тестировать работу приложения. Это просто:

Получившийся пример доступен на GitHub.

Кстати, WinForms приложение создается еще быстрее и проще. Достаточно перетянуть на форму из панели инструментов элемент SerialPort (при наличии желания можно перетянуть из панели инструментов и элемент Timer). После чего в нужном месте кода, можно открыть порт, считывать из него данные и писать в него примерно как и в WPF приложении.

UWP приложение

Для того чтобы разобраться с тем как работать с последовательным портом я рассмотрел следующий пример: SerialSample
Для разрешения работы с COM портом в манифесте приложения должно быть такое вот объявление:

В коде C# нам понадобятся 4 пространства имен:

И одна переменная в области видимости класса:

При загрузке считаем в нее значение id порта к которому подключена плата Arduino:

Следующий Task считает 64 байта с порта и отобразит текст в поле с именем txtPortData

В UWP приложениях на C# отсутствует метод SerialPort.DiscardInBuffer. Поэтому один из вариантов, это считывать данные открывая каждый раз порт заново, что и было продемонстрировано в данном случае. Если вы попробуете, то сможете заметить, что отсчет каждый раз идет с единицы. Примерно то же самое происходит и в Arduino IDE при открытии Serial Monitor. Вариант, конечно, так себе. Открывать каждый раз порт это не дело, но если данные необходимо считывать редко, то этот способ сойдет. Кроме того, таким образом записанный пример выглядит короче и понятнее.

Рекомендуемый вариант это не объявлять каждый раз порт заново, а объявить его один раз, например, при загрузке. Но в таком случае необходимо будет регулярно считывать данные с порта, чтобы он не заполнялся старьем и данные оказывались актуальными. Смотрите как это сделано в моем примере UWP приложения. Я так полагаю, что концепт отсутствия возможности очистить буфер состоит в том, что постоянно асинхронно снимаемые данные, не особо нагружают систему. Как только необходимое количество байт считывается в буфер, выполняется следом написанный код. Есть плюс, в том, что при таком постоянном мониторинге ничего не пропустишь, но некоторым (и мне в том числе) не хватает привычной возможности один раз «считнуть» данные.

Для записи данных в порт можно использовать схожий код:

Вы можете заметить, что после инициализации порта и установки параметров добавлены паузы по 1 секунде. Без этих пауз заставить Arduino среагировать не получилось. Похоже, что serial port действительно не терпит суеты. Опять же, напоминаю, что лучше открыть порт один раз, а не открывать/закрывать его постоянно. В таком случае никакие паузы не нужны.
Упрощенный вариант UWP приложения, который аналогичен рассмотренному выше WPF .Net приложению доступен на GitHub

В результате я пришел к выводу, что работа в UWP с Arduino напрямую через виртуальный COM порт хоть и непривычна, но вполне возможна и без подключения сторонних библиотек.
Замечу, что Microsoft довольно тесно сотрудничает с Arduino, поэтому различных библиотек и технологий коммуникации, упрощающих разработку, множество. Самая популярная, это конечно же работающая с протоколом Firmata библиотека Windows Remote Arduino.

Источники:

http://metanit.com/sharp/tutorial/1.1.php

http://programm.top/c-sharp/tutorial/introduction/

http://habr.com/post/275439/

http://arduinoplus.ru/vyborcoptera/

Ссылка на основную публикацию