Pull to refresh

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

Reading time 3 min
Views 5.2K
В данной стать я приведу пример использования 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 программа будет выводить через указанный промежуток времени дату и время в консоль.

Всем спасибо за внимание.
Tags:
Hubs:
+5
Comments 27
Comments Comments 27

Articles