C언어 C++ Programming

[C#]아두이노 시리얼 통신 GUI 만들기(Arduino, Serial Communication, 윈도우)

끄적끄적아무거나 2024. 1. 3. 08:52
반응형

 

목차

     

     

     

     

     

    C#으로 시리얼 GUI 만들기

     

    이번 포스트에서는 C# 프로그래밍을 활용하여 Arduino에서 보내는 데이터를 읽는 간단한 GUI(Graphical User Interface) 프로그램을 만들 것입니다. 이 과정을 통해, Visual Studio에서 C#을 사용하는 기본적인 방법들을 살펴보겠습니다. 이 프로그램은 Arduino에서 센서 또는 다른 장치로부터 데이터를 받아, 사용자 친화적인 인터페이스에 표시할 것입니다.

     

    C#은 .NET 프레임워크와 잘 통합되어 있으며, 이를 통해 강력하고 유연한 GUI 애플리케이션을 쉽게 개발할 수 있습니다. Visual Studio는 이러한 개발을 위한 다양한 도구와 라이브러리를 제공하여, 효율적인 코딩 환경을 조성합니다. 우리는 이번 프로젝트에서 Serial 통신을 사용하여 Arduino와 PC 간의 데이터 송수신을 구현할 예정입니다.

     

    프로젝트의 핵심 단계는 다음과 같습니다.

     

    1. Arduino 설정: 먼저 Arduino에 적절한 센서나 장치를 연결하고, 데이터를 보낼 수 있도록 코딩합니다.
    2. C# 프로젝트 설정: Visual Studio에서 C# Windows Forms 애플리케이션 프로젝트를 생성합니다.
    3. Serial 통신 구현: C#에서 SerialPort 클래스를 사용하여 Arduino와의 Serial 통신을 설정합니다.
    4. GUI 디자인: Windows Forms를 사용하여 데이터를 표시할 사용자 인터페이스를 디자인합니다.
    5. 데이터 읽기 및 표시: Arduino에서 보낸 데이터를 읽고, 그것을 GUI에 실시간으로 표시합니다.

     

     

    이 프로세스를 통해, C#과 Arduino의 통합 사용, Serial 통신의 기초, 그리고 GUI 기반 애플리케이션 개발에 대한 이해를 깊게 할 수 있을 것입니다. 이러한 기술은 다양한 종류의 프로젝트와 애플리케이션에서 활용될 수 있으며, 특히 IoT(Internet of Things) 관련 작업에 유용하게 사용될 수 있습니다.

     

     

     

     

     

    C#으로 시리얼 GUI 만들기 실습

     

     

    1. 아래와 같이 코드를 작성하고 아두이노 보드에 업로드 합니다. 0.5초 간격으로 hello와 숫자를 보내 줍니다. 이 코드를 아두이노 보드에 업로드하면, 아두이노는 연결된 컴퓨터의 시리얼 모니터를 통해 "hello"와 함께 순차적인 숫자를 보여줄 것입니다. 숫자는 각 반복마다 1씩 증가하며, 각 메시지 사이에는 0.5초의 간격이 있을 것입니다.

     

    void setup() {
      // 시리얼 통신을 시작합니다. 9600 보드레이트로 설정합니다.
      Serial.begin(9600);
    }
    
    void loop() {
      static int counter = 0; // 숫자를 저장할 변수를 선언합니다.
    
      // "hello"와 순차적인 숫자를 시리얼 포트를 통해 보냅니다.
      Serial.print("hello ");
      Serial.println(counter);
    
      counter++; // 숫자를 1 증가시킵니다.
      
      delay(500); // 0.5초 동안 대기합니다.
    }

     

    참고로 변수에 static을 붙힌 이유는 아래와 같습니다.

     

    • 변수의 지속성: loop() 함수는 아두이노 프로그램이 실행되는 동안 지속적으로 반복 실행됩니다. static을 사용함으로써, counter 변수는 loop() 함수가 새로 시작될 때마다 초기화되지 않고, 마지막으로 저장된 값을 유지합니다. 이것은 counter가 각 반복에서 1씩 증가할 수 있도록 해줍니다.
    • 메모리 절약: static 변수는 프로그램의 전역 메모리 영역에 저장됩니다. 함수 내에 static으로 선언된 경우, 이 변수는 프로그램 실행 중 한 번만 메모리 공간을 할당받고, 함수 호출이 끝난 후에도 그 메모리 공간을 계속 차지합니다. 이는 프로그램의 효율적인 메모리 사용에 도움이 됩니다.

     

     

     

    2. Visual Studio를 실행하고 New Project에서 Windows Forms App 을 아래 그림과 같이 선택합니다.

     

     

     

     

    3. 아래와 같이 SerialPort를 Toolbox에서 선택하고 더블 클릭하면 해당 속성이 생기고 우측 하단과 가팅 Properties 창에서 확인이 가능 합니다.

     

     

     

    4. Toolbox에서 Textbox를 선택해서 더블 클릭하거나 드래그로 원하는 위치에 텍스트 창을 입력 합니다. 그리고 우측 하단에 Text에 COM을 미리 입력 합니다.

     

     

     

     

    5. 툴박스에서 버튼을 가져와서 아래와 같이 붙여 줍니다.  속성에서 text 값을 "연결" 로 바꿔 줍니다.

     

     

     

    6. 아래 그림과 같이 이번에는 Listbox를 툴박스에서 가져옵니다. 

     

     

     

    7. 버튼을 더블 클릭하면 아래와 같이 버튼 클릭에 대한 함수가 cs 파일에 자동으로 생성 됩니다.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
    
            private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
    
            }
    
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
    
            }
        }
    }

     

     

     

     

    8. 아래 그림과 같이 serialPort1을 클릭하고 Property에서 DataRecived를 클릭하면 cs 파일에 해당 함수가 생성됩니다.

     

     

     

    9. 앞서 5번과 마찬가지로 Disconnect를 위한 버튼을 만들어 줍니다. 

    10. 최종적으로 아래와 같이 코드를 작성합니다.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.IO.Ports; // SerialPort를 사용하기 위한 네임스페이스
    
    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
    
            private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                string port = textBox1.Text;
                serialPort1.PortName = port;
    
                if (serialPort1.IsOpen)
                {
    
                }
                else
                {
                    serialPort1.Open();
                }
            }
    
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                if (serialPort1.IsOpen)
                {
                    string input = serialPort1.ReadLine();
                    string currentTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); // 현재 시간을 문자열로 가져옵니다.
    
                    // listBox1에 현재 시간과 입력값을 추가합니다. UI 스레드에서 실행되어야 합니다.
                    this.Invoke((MethodInvoker)delegate
                    {
                        listBox1.Items.Add($"{currentTime}: {input}");
                    });
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                if (serialPort1.IsOpen)
                {
                    serialPort1.Close();
                }
            }
        }
    }

     

     

     

    11. 아래와 같이 결과가 나왔음을 확인할 수 있습니다.

     

     

     

    해당 프로젝트는 아래 링크를 통해 다운 받으시면 됩니다.

    WindowsFormsApp1.zip
    0.06MB

     

     

     

    반응형