Использование контроллера Arduino для прерываний

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

В данной стать я приведу пример использования arduino контроллера для вызова прерываний программы на C#.

Стоит отметить, что в WindowsForms присутствует элемент Timer который включается и выполняет код через определенный промежуток времени.



Я решил реализовать подобное используя микроконтроллер Arduino UNO.

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

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

void setup(){
Serial.begin(9600);//Открыть последовательный порт
}
int str=0;
int interval=0;
String text;
void loop()
{


	while(str==0)
	 str=Serial.parseInt();//Ждать прихода данных
  if (str==1)//Если поступила команда запуска таймера
  {
	 while(interval==0)
	   interval=Serial.parseInt();//получить интервал
	 text=String(interval);
	 text+="!";
	 while(str!=2){
		delay(interval);//Подождать указанный промежуток времени 
		
		Serial.println(text);//Отправить данные в последовательный порт
		
		 str=Serial.parseInt();//Ждать следующей комнды
	 }
	 interval=0;
  }

}

Также контроллер принимает команды запуска(1) и остановки(2) таймера. (Аналог методов start и stop для таймера windowsforms).

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.IO.Ports;
using System.IO;
using System.Net;
namespace ConsoleApp33
{
    class Program
    {
        private static SerialPort ard = new SerialPort("COM13", 9600);//Название порта к которому подключен контроллер и скорость обмена данными с портом.
        private static Thread stop_thread = new Thread(Stop);
        private static bool sost = true;
       [MTAThread]
        static void Main(string[] args)
        {
           
            SerialDataReceivedEventHandler handler = new SerialDataReceivedEventHandler(Serial_interrupt);//Метод выполняемый при приходе данных
            ard.DataReceived += handler;
            //Задать интервал задержки
            int interval = int.Parse(Console.ReadLine());
            //Открыть последовательный порт
            while (ard.IsOpen != true)
                ard.Open();
            //Запустить контроллер
            ard.WriteLine("1");
            Thread.Sleep(10);
            ard.WriteLine(interval.ToString());
            Console.WriteLine(ard.ReadLine());
            //Запуск потока остановки контроллера
            stop_thread.IsBackground = true;
         
            stop_thread.Start();
         
            while (sost) Thread.Sleep(1);//Приостановить поток
        }
        public enum Comand
        {
          Start = 1,//Запуск таймера
         Stop = 2   //Остановка таймера
        }
        private static System.DateTime dateTime;
        public static void Serial_interrupt(object sender,SerialDataReceivedEventArgs e)
        {
            //Вывести дату и время в консоль
            dateTime = DateTime.Now;
            Console.WriteLine(dateTime.ToString());
        }
        public static void Stop()
        {
            if ((int)Console.ReadKey().Key == 27)//Если нажата клавиша Esc выключить контроллер
            {
                ard.WriteLine(Comand.Stop.ToString());//Выклюить контроллер
                sost = false;//Завершить Main
            }
            Thread.Sleep(10);
        }
      
    }
}

Программа на C# открывает соединение с портом и при приходе данных возникает событие

ard.DataReceived += handler;

вызывающее метод Serial_interrupt(), который выводит в консоль дату и время компьютера.

Также присутствует поток stop_thread который завершает программу и отправляет на контроллер команду выключения когда нажимается клавиша Esc.

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

Всем спасибо за внимание.
Источник: https://habr.com/ru/post/511516/


Интересные статьи

Интересные статьи

Продолжу выкладывание примеров использования GitHub'а как инструмента обучения.Рассмотрим версию работы нескольких команд над одним большим проектом с подпроектами. ...
Всем доброго времени суток! После того, как разбился мой старый Galaxy s7 пришлось купить новый самсунг. При покупке я не придал значения, что в новом аппарате нет светодиодного и...
Важная часть управления уязвимостями состоит в том, чтобы хорошо понимать и обеспечить безопасность цепочки поставок тех компонентов ПО, из которых строятся современные системы. Команды, практику...
Когда деревья были чуточку выше, трава зеленее, солнце ярче, а я учился в институте, у меня была социальная карта студента. Она мне нравилась своей функциональностью и продуманностью, но, как и в...
Если Вы используете в своих проектах инфоблоки 2.0 и таблицы InnoDB, то есть шанс в один прекрасный момент столкнуться с ошибкой MySQL «SQL Error (1118): Row size too large. The maximum row si...