Первая программа на C — урок 1

Как создать программу на компьютере самому с нуля

+7 (499) 444-90-36 Отдел заботы о пользователях

Москва, Ленинский проспект, дом 6, строение 20

  • Участник Skolkovo
  • Премии Рунета 2018, 2019, 2020

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies ?

Создание проекта

Для Visual Studio

Откройте меню «Файл → Создать → Проект». Перейдите на вкладку «Общие» и выберите «Пустой проект». Придумайте проекту любое название, например «lesson1» и нажмите «OK».

В окне обозревателя решений (обычно он находится в левом верхнем углу) щелкните правой кнопкой на папке «файлы исходного кода». В диалоговом окне выберите пункт меню «Добавить → Создать элемент». Введите название для нового файла — main.cpp и нажмите кнопку «Добавить».

Для GCC

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

Ошибки компиляции

Теперь попробуем составить неправильную программу. Например, уберём символ ; в конце единственной инструкции:

Скриншот

Запустите компиляцию снова. Вы увидите ошибку компиляции, примерно такую:

Компилятор достаточно умён, чтобы показать вам точное место ошибки и способ её исправления! Именно поэтому сообщения от компиляторов C/C++ следует внимательно читать.

Теперь попробуем внедрить другую ошибку: точку с запятой вернём на место, а в названии cout перепутаем две буквы: “cuot”

Скриншот

Запустите компилятор и прочитайте сообщение. Оно должно быть таким:

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

Не ведитесь на рекламу

Используйте то, что является для вас наилучшим. Если ваша продуктивность высока на PHP, то и работайте с PHP. Конечно, иногда технологии на самом деле способны увеличить продуктивность или дать другие существенные преимущества, но я не преувеличу, если скажу о том, что это огромная редкость – такое встречается, пожалуй, раз или два в десятилетие.

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

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

Дизайн пользовательского интерфейса – это тяжелая работа, и использование MVC на стороне клиента не сотворит для вас магии.

Учимся писать компьютерные программы для автоматизации.

Когда мне захотелось написать свою программу для компа, автоматизирующую некоторые процессы, с удивлением обнаружил что на эту тему не так много статей, в частности недостаточно освещена тема работы с датчиками DS18B20. Постараюсь заполнить этот пробел и начну с самых основ разработки программ, чтобы было понятно даже тем, кто далек от программирования. Но тем не менее базовые знания информатики не помешают, потому что я не стану объяснять что такое биты, байты, переменные, их типы, структуры, а также процедуры и т. д. При необходимости, ответы на эти вопросы даст любой поисковик.
Итак, приступим. Для начала я расскажу как сделать простую программу, которая может считывать температуру с DS18B20 и показать ее в окне. Отмечу что я не программист и возможно не все написанное будет верным.
Для начала нам понадобится среда программирования. Это такая же программа как и другие, но предназначена она для создания программ. Я выбрал среду PureBasic версии 5.24, для которой имеется библиотека функций для работы с 1-Wire устройствами, к которым принадлежит датчик DS18B20. Описание функций библиотеки можно найти в журнале Радио 2015 № 1.
Скачать PureBasic можно по этой ссылке. http://rghost.net/8mQNDGH8S Это potrable версия не требующая установки. Архив необходимо распаковать в любую папку в которой есть права на чтение и запись. Если не знаете о чем речь, распаковывайте в папку с документами. Нужно найти в распованых файлах «PureBasic Portable.exe» и создать его ярлык на рабочем столе.
Программа русифицирована. Но справка на английском. В сети можно найти русские справки от предыдущих версий. http://purebasic.ucoz.com/PB_rar/PureBasic_rus.rar
Онлайн справка. http://web.archive.org/. 104&lng=rus

Запускаем PureBasic кликнув по ярлыку на рабочем столе и видим такую картину.

Учимся писать компьютерные программы для автоматизации

Учимся писать компьютерные программы для автоматизации. Автоматика.

Перед нами редактор кода с пустым файлом. Сохраняем его под именем «TestTemp 1.0.pb». Теперь создадим окно. В меню «Формы» кликаем по «Новая форма» и перед нами появится макет окна.

Учимся писать компьютерные программы для автоматизации

Учимся писать компьютерные программы для автоматизации. Автоматика.

Теперь нужно наполнить окно содержимым. Потребуются несколько текстовых надписей (TextGadget), список для портов (ComboBoxGadget) и область где будет отображаться температура (StringGadget). Находим их на вкладке «Инструменты» окна «Формы». Кликаем и перемещаем курсор мышки в область макета окна. Зажимаем левую кнопку мышки в той области где нужно расположить компонент, и не отпуская кнопки перемещаем мышку. Таким образом обозначим координаты и размеры компонента. Для изменения надписей, кликаем по компоненту в макете окна и в окне «Формы» пишем свой текст в поле «Текст». Чтобы добавить имена портов в список, нужно после его размещения в окне, кликнуть по меню правой кнопкой мышки и в меню выбрать «Править элемент». В появившемся окне, добавляем имена портов.
Если все равно непонятно объяснил, смотрите видео.
В конечном итоге должно получиться следующее.

Учимся писать компьютерные программы для автоматизации

Учимся писать компьютерные программы для автоматизации. Автоматика.

Кликнув по «Код/Дизайнер форм» в меню «Формы» можно увидеть код окна.

Учимся писать компьютерные программы для автоматизации

Учимся писать компьютерные программы для автоматизации. Автоматика.

Окно готово. Сохраняем его в файл под именем «Окно.pbf» туда же, куда сохранили файл с кодом программы. Теперь начинается самое интересное — будем писать код программы. Нам понадобится файл «OWire_Module.pbi», который нужно скопировать в туже папку где находятся остальные файлы программы. Взять этот файл можно из архива ftp://ftp.radio.ru/pub/2015/01/OWire.zip
Он расположен в папке «LibrarySrc«.

Теперь пишем код. В начало исходника нужно добавить строки.

Первые две строки добавляют код из указанных файлов в эту программу, а последняя нужна для доступа к функциям работы с датчиками из файла «OWire_Module.pbi». То что находится после точки с запятой, это комментарии. Они нужны для того чтобы мы лучше понимали что делает код, а комп их игнорирует. Другими словами, компу без разницы есть комментарии или нет, на работу программы они не влияют.
Теперь необходимо добавить вызов процедуры создания окна и его обработчик событий.

Учимся писать компьютерные программы для автоматизации

Учимся писать компьютерные программы для автоматизации. Автоматика.

Строка OpenWindow_0() это вызов процедуры создания окна. На скрине выше где показан код окна можно увидеть эту процедуру. У ее имеется несколько параметров со значениями по умолчанию, т. е. которые не обязательно передавать в параметрах процедуры. Во время вызова, выполняется код между командами Procedure и EndProcedure. В данном случае, там находятся функции создания окна и его компонентов.

Далее по коду находится цикл Repeat – Until, внутри которого будет выполняться код до тех пор пока условие в Until не станет верным, т. е. до тех пор пока в переменной с именем Event не окажется код #PB_Event_CloseWindow. Это произойдет когда закроют окно. При каждом выполнении кода цикла, в переменную Event копируется текущий код события программы. Ее может может быть другим, но обычно ее так называют чтобы понятней было что она хранит события. События это например закрытие окна, клики по гаджетам (компонентам окна) или меню и т. д.
Теперь в коде присутствует все необходимое для работы программы и ее можно запустить кликнув в меню «Компилятор» по «Компиляция/Запуск». Появится окошко программы.

Учимся писать компьютерные программы для автоматизации

Учимся писать компьютерные программы для автоматизации. Автоматика.

Основа программы готова. Осталось научить программу открыть COM порт выбранный в списке и читать температуру с датчика. Начнем с первого. Как писал выше, клик по компоненту окна – гаджету, которым является список портов, создаст событие программы и его код функция WaitWindowEvent() запишет в переменную Event. Значит необходимо как-то проверить что находится в переменной Event и если там код события гаджета, выполнить кое-какие действия. Для сравнения предназначено ключевое слово If. Если кто-то не знает, оно с английского переводится как «Если». Кроме того необходимо еще проверить в каком именно гаджете произошло события. В окне этой программы их четыре. Кажется что все это сложно, но на деле это не так.

Учимся писать компьютерные программы для автоматизации

Учимся писать компьютерные программы для автоматизации. Автоматика.

В первом ключевом слове If. Проверяется чтобы в переменной Event был код события #PB_Event_Gadget, не что-то другое. Если там что-то другое, будет пропущен код внутри блока If и выполнение перейдет на парное ему ключевое слово EndIf в строке 15. У него такой же размер отступа. Вообще отступы в коде носят декоративный характер и не влияют на работу программы. Они нужны для нас, разработчиков программ и позволяют быстрее найти парные ключевые слова.
Если же в переменной Event будет именно код #PB_Event_Gadget, тогда выполнится еще одна проверка в строке 12, где проверяется что событие произошло именно в гаджете с идентификатором #Combo_0, а не в каком-то другом. Названия идентификаторов гаджетов видны на скине с кодом окна. Если присмотреться, видно что такой у ComboBoxGadget, т. е. у списка с COM портами. Если в списке выбрали порт, то это условие верно и будет выполнено код из процедуры OW_OpenPort, а параметром ей передается текст из выбранной строки списка портов, т. е. если выбрали COM2, этот текст передается процедуре. Она расположена в файле OWire_Module.pbi (в дальшейшем чтобы я не повторялся, все процедуры имя которых начинается с » OW_» находятся в этом файле) и если говорить о ней кратко, она открывает COM порт, к которому предполагается что подключены датчики температуры. Более подробно о процедурах файла OWire_Module.pbi можно прочитать в Радио 2015 № 1.

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

Учимся писать компьютерные программы для автоматизации

Учимся писать компьютерные программы для автоматизации. Автоматика.

В 7 строку добавил функцию AddWindowTimer. В ее первом (слева) параметре необходимо указать идентификатор окна, к которому привязывается таймер. Узнать его можно в файле «Окно.pbf». Второй параметр это идентификатор таймера, который нужен чтобы можно было как-то отличать таймеры, ведь их может быть много. Я выбрал число 2, но оно может быть любым целым положительным. Третий параметр это промежутки времени в миллисекундах, через которые будут происходить события.
В 18 строку добавил проверку события таймера, а строкой ниже уточняется что событие именно таймера с идентификатором 2, а не какого-то другого. Можно было бы не уточнять, ведь в программе один таймер, вот если бы было больше одного, такая проверка была бы обязательной.

Теперь программа умеет выполнять код через заданные промежутки времени, в нашем случае, через каждую секунду. Но выполняемого кода как такового пока нет (комментарий не считается кодом). Его еще предстоит написать. Но перед этим нужно изучить даташит на датчик DS18B20 чтобы понять как с ним общаться. Его можно скачать на официальном сайте. https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
Но мне больше нравится вариант даташита, переведенный на русский. На родном языке намного понятней. https://cdn.homedistil.ru/fs/1510/22/44768.84589.pdf

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

Код производящие эти действия показан на скриншоте (строки от 41 до 68 ).

Учимся писать компьютерные программы для автоматизации

Учимся писать компьютерные программы для автоматизации. Автоматика.

Если внимательно присмотреться к коду, видно что действия выполняются в другом порядке. Сначала действия 4 и 5 (чтение данных из датчика), потом 1 и 2 (запуск измерения температуры), а действия 3 (задержка на 750 миллисекунд) вообще не видно. Но на самом деле это не так. Для действия 3 применена не фиксированная задержка в коде, а интервал между событиями таймера, который составляет 1 секунда.
Рассмотрим код подробнее. В строке 41 производится проверка наличия ошибки при выполнении действий 1 и 2, т. е. при предыдущем запуске измерения температуры. Если в переменной ErrCode будет число 0, значит ошибок не было. В противном случае, читать данные из датчика не имеет смысла и код чтения пропускается. Если не было ошибок, выполняется код процедуры OW_SkipROM, отправляющей команду датчику пропустить проверку серийного номера. Если при выполнении этой процедуры не было ошибок, выполнится функция OW_ReadRAM, читающая из датчика данные и помещающая их в экземпляр структуры OW_RAM с именем RAM. Структура это такой контейнер, объединяющий в себе несколько переменных.
Она объявлена в файле «OWire_Module.pbi» и имеет вид.

Далее, в случае успешного выполнения кода процедуры OW_ReadRAM, производится преобразование температуры и она отображается в окне с точностью до десятых долей градуса.
В строках 62 – 68 выполняются действия 1 и 2, т. е. запускается процесс измерения температуры.

Вот как-то так работает эта программа. Теперь ее можно считать законченной и использовать как термометр. Чтобы она не требовала для работы среду PureBasic, нужно ее скомпилировать. Это просто. В меню «Компилятор» кликаем по «Создать приложение» и выбираем имя файла и место его сохранения. Получаем небольшой исполняемый файл с размером 39 КБ, который работает не только на современных версиях Windows, но и на Windows 95 OSR 2.
Сделал скрин работы проги в ней.

Учимся писать компьютерные программы для автоматизации

Учимся писать компьютерные программы для автоматизации. Автоматика.

Посл. ред. 24 Окт. 15, 11:12 от Semo

Один датчик – хорошо, а много — еще лучше. Следующим этапом будет доработка программы, позволяющая ей считывать температуру с множества датчиков. Для начала отредактируем окно. Нужно удалить надпись «Температура» (TextGadget) и область отображения температуры (StringGadget). Чтобы это сделать, необходимо выделить компонент кликом левой кнопкой мышки, а затем кликнуть правой кнопкой и в меню кликнуть по «Удалить.»

Учимся писать компьютерные программы для автоматизации

Учимся писать компьютерные программы для автоматизации. Автоматика.

Теперь в окно нужно добавить кнопку (ButtonGadget) и таблицу (ListIconGadget). Как это делать, писал в предыдущий раз. Кнопка нужна для поиска датчиков, а таблица для отображения температуры. После добавления таблицы, необходимо выделить ее и кликнув правой кнопкой по ней, выбрать в меню пункт «Править колонку». В окне правки, необходимо переименовать имеющуюся колонку в «Идентификатор» и добавить новую с именем «Температура». После чего закрыть окно правки колонок. Получилось следующее.

Учимся писать компьютерные программы для автоматизации

Учимся писать компьютерные программы для автоматизации. Автоматика.

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

Учимся писать компьютерные программы для автоматизации

Учимся писать компьютерные программы для автоматизации. Автоматика.

Так как датчиков будет много и заранее неизвестно сколько, для хранения информации о них потребуется особая переменная, вмещающая в себя столько информации, сколько потребуется. В PureBasic для таких целей предназначен двусвязный список. Что это такое и для чего нужен можно узнать из википедии. https://ru.wikipedia.org/wiki/Связный_список
Каждая ячейка списка эквивалентна отдельной переменной вмещающей одно значение. Но этого мало. В списке необходимо сохранить идентификатор датчика (его имя, на которое он откликается), а также температуру, считанную с него и другие данные. Можно было бы создать столько списков, сколько нужно для этих данных, но это не совсем рационально и ненаглядно. Программа станет менее понятной. Намного лучше, в качестве типа переменной ячеек списка указать структуру (ранее писал что структура это контейнер для переменных) и получить список структур. Таким не хитрым способом получим список, ячейки которого могут содержать больше одной переменной.

Учимся писать компьютерные программы для автоматизации

Учимся писать компьютерные программы для автоматизации. Автоматика.

Двусвязный список создается в строке 12 командой NewList. Команда Global делает видимым список по всему коду (без нее, список недоступен в процедурах) Имя списка — DS_List, а его тип — DS, т. е. структура, описанная в строках 6 – 10. Первая переменная структуры с именем ID, это другая структура OW_SN находящаяся в файле «OWire_Module.pbi». В ней будет находиться идентификатор датчика. Вторая переменная необходима для хранения температуры, а третья для кода ошибки.
Также в программу был добавлен обработчик события клика по кнопке поиска датчиков. Он находится в строке 50. И были добавлены две процедуры с именами Find и Timer. Первая вызывается в строке 51 при поиске датчиков, а вторая в строке 56 при событии таймера с идентификатором 2. В процедурах пока нет кода. Сейчас его напишем. Начнем с поиска датчиков. Среди множества команд, датчик DS18B20 содержит команду SEARCH ROM (код F0h) предназначенную для поиска датчиков и чтения их серийных номеров. Это наверное самая сложная для понимания команда и я до конца не понял всего алгоритма поиска. Он довольно запутанный. Но это и не нужно. В файле «OWire_Module.pbi» есть несколько процедур для поиска датчиков, что значительно упрощает программу.
Код процедуры поиска датчиков.

Учимся писать компьютерные программы для автоматизации

Учимся писать компьютерные программы для автоматизации. Автоматика.

Прежде чем искать датчики, производится проверка наличия открытого COM порта. Если он закрыт, появится окно, уведомляющее об этом и дальше код процедуры выполняться не будет.
Если порт открыт, тогда очищается связный список и таблица, находящаяся в окне. Далее вызывается процедура OW_SearchROM_Reset(), очищающая историю поиска что позволит начать его заново. После этого в цикле While – Wend вызывается процедура OW_SearchROM_Enum копирующая в структуру ID идентификатор очередной найденной 1-Wire микросхемы. Если тип микросхемы 28 или 10 (это DS18B20 или DS1820 соответственно), данные добавляются в связный список. Иначе они игнорируются. Также добавляется строка в таблицу в окне, содержащая идентификатор датчика. Код в цикле выполняется столько раз, сколько раз функция OW_SearchROM_Enum вернет #True как результат своего выполнения. Что-то другое она может вернуть если произошла ошибка, или по окончанию поиска.

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

Отличие только в действии 4. Так как датчиков много, сначала необходимо выбрать тот из которого требуется прочитать данные. Иначе одновременно ответят все датчики и данные исказятся. Также возможно использование команды «MATCH ROM» в действии 1. Это необходимо если не все датчики должны одновременно измерять температуру или не все 1-Wire микросхемы совместимы по командам с DS18B20 и неизвестно как они отреагируют на команду «CONVERT T».
Теперь разберем код считывания температуры из датчиков.

Учимся писать компьютерные программы для автоматизации

Учимся писать компьютерные программы для автоматизации. Автоматика.

Ячейки связного списка DS_List() перечисляются в цикле ForEach – Next. Перечисление происходит от начала к концу. Код в цикле выполняется столько раз, сколько ячеек в списке, но при каждом его выполнении активной будет другая ячейка. Функция OW_SelectROM отправляет датчикам идентификатор и после этого на команды будет реагировать только выбранный датчик, а остальные их проигнорируют. Затем функция OW_ReadRAM прочитает данные из выбранного датчика и поместит их структуру с именем RAM. После этого функция OW_GetCRC проверяет контрольную сумму данных. Функция PeekW читает два байта из структуры RAM, в которых находятся данные о температуре и помещает ее к переменную Temp текущей ячейки связного списка. Далее происходит преобразование температуры – для DS18B20 температура делится на 16, а для DS1820 или DS18S20 делится на 2. Это необходимо потому что в DS18B20, 4 младших разряда содержат дробную часть температуры. Нужно делить на 16 потому что 2 в 4 степени равно 16. В DS1820 или DS18S20 под дробную часть выделен 1 разряд и необходимо делить на 2.
В 107 строке анализируется наличие признака ошибки. Если ее нет (в переменной ErrCode списка, число 0), в таблицу расположенную в окне записывается температура, прочитанная из датчика. Если же была ошибка (в переменной не 0), тогда в таблице вместо температуры отображается ее описание.
По завершению чтения температуры с датчиков, в строке 118 им передаются команды пропуска проверки идентификатора и запуска измерения температуры.

Программа закончена. Теперь ее можно скомпилировать, т. е. создать исполняемый exe файл. В меню «Компилятор» кликаем по «Создать приложение» и выбираем имя файла и место его сохранения.
Скриншот окна программы.

Учимся писать компьютерные программы для автоматизации

Учимся писать компьютерные программы для автоматизации. Автоматика.

Оцените статью
Fobosworld.ru
Добавить комментарий

Adblock
detector