통신

00·2025년 2월 8일

C#

목록 보기
148/149

C# 프로그램과 시리얼 통신

C# 프로그램이 실행되는 컴퓨터와 아두이노 사이에 데이터를 주고 받는 가장 기본적인 방법은 시리얼 통신입니다. 시리얼 통신은 컴퓨터와 아두이노에 연결된 USB 케이블을 통해 데이터를 주고 받습니다. 0과 1로 구성된 데이터가 순차적으로 전달된다는 의미에서 시리얼 통신 또는 직렬 통신이라고 부릅니다. 시리얼 통신을 하려면 컴퓨터에는 C# 프로그래밍 언어로 만든 프로그램아두이노에는 스케치(Sketch) 언어로 만든 프로그램이 있어야 합니다.

C# 프로그램으로 아두이노를 제어하기 위해, 먼저 아두이노에서 동작하는 스케치 프로그램을 만들어야 합니다. 스케치 프로그램은 아두이노 통합개발환경을 통해 편집과 컴파일, 업로드할 수 있습니다.

  • 드라이버 설치
    CH340드라이버는 아두이노 우노와 나노 호환보드에 많이 사용이 되고,
    CP2102드라이버는 ESP32보드에 많이 사용됩니다.
  • 아두이노 스케치 코드
// C++ code
//
void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000); // Wait for 1000 millisecond(s)
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000); // Wait for 1000 millisecond(s)
}

스케치 코드는 내부적으로 C++ 코드로 변환 후 기계어로 전환됩니다. 따라서 아두이노의 라이브러리는 C++ 코드로 작성된 경우가 많습니다.

// 기호는 C#에서와 동일하게 주석을 의미합니다. 스케치 코드는 2 개의 함수로 구성되는데, setup() 함수는 아두이노에 전원이 공급되면 가장 먼저 호출되는 함수입니다. setup() 함수는 한 번 호출됩니다. 그리고 loop() 함수가 호출되는데, loop() 함수는 실행이 완료되면 다시 무한히 반복해서 호출되는 함수입니다. 따라서 보통 초기화 코드를 setup() 함수 내부에 작성하고, 실행하는 코드를 loop() 함수 내부에 작성합니다.

setup() 함수에 pinMode() 함수가 호출된 것을 볼 수 있습니다. pinMode() 함수는 디지털 핀의 목적을 결정합니다. 아두이노 보드에는 0 ~ 13번 까지 총 14개의 디지털 핀이 있습니다. 디지털 핀은 입력과 출력 모두 사용할 수 있기에 어떤 목적으로 쓸지 코드에서 결정해야 합니다.

매개변수 중 하나인 LED_BUILTIN은 상수 13과 같습니다. 즉, 13번 핀을 출력(OUTPUT) 목적으로 사용하기 위한 코드가 setup() 함수 내부에 작성한 것입니다.

loop() 함수 내부에는 LED를 1초 간격으로 깜빡이게 만드는 코드가 작성되었습니다. digitalWrite() 함수는 디지털 핀에 신호를 내보내는 함수입니다.
매개변수로 LED_BUILTIN은 13을 의미하므로 13번 핀에 HIGH 신호와 LOW 신호를 전달하는 내용이 코드로 선언합니다. 디지털 핀에 HIGH 신호를 전달하면 전류가 공급되어 LED가 켜지고, LOW 신호를 전달하면 전류가 차단되어 LED가 꺼집니다. 그 사이에 delay() 함수는 특정 밀리초(millisecond) 동안 잠시 쉬고 다음 코드를 실행하라는 의미입니다. delay() 함수의 매개변수 값으로 1000은 1초를 말합니다.
▲출처: Do it! C# 프로그래밍 입문

TCP/IP 통신 vs TCP/IP 소켓 통신

결론

TCP/IP 통신과 TCP/IP 소켓 통신은 엄밀히 말하면 같은 말은 아니지만, 깊은 연관이 있습니다. TCP/IP 소켓 통신은 TCP/IP 통신을 구현하는 한 가지 방법이며, 소켓 API를 사용하여 TCP/IP 통신을 구현할 수 있습니다.

TCP/IP 통신은 인터넷 프로토콜 스위트(Internet Protocol Suite) 중 하나인 TCP/IP 프로토콜을 사용하여 데이터를 주고받는 통신 방식을 의미합니다.

TCP/IP 소켓 통신은 TCP/IP 프로토콜을 기반으로 소켓(Socket)이라는 개념을 사용하여 통신하는 방식입니다. 구체적으로 TCP/IP 프로토콜을 기반으로 응용 프로그램이 네트워크를 통해 데이터를 주고받을 수 있도록 하는 API (Application Programming Interface)를 사용하는 통신 방식입니다. 즉, 소켓 통신은 TCP/IP 통신을 구현하는 한 가지 방법이라고 할 수 있습니다.
소켓은 네트워크 통신에서 엔드포인트(endpoint)를 나타내는 추상적인 개념(두 응용 프로그램 간의 연결 지점을 나타내는 추상적인 개념)으로, 두 응용 프로그램이 소켓을 통해 연결되어 데이터를 주고받습니다.

비유

TCP/IP 통신"택배" 라고 생각할 수 있습니다. 택배는 물건을 보내는 사람과 받는 사람, 그리고 물건을 운반하는 시스템으로 이루어져 있습니다. TCP/IP 프로토콜은 택배 시스템과 같이 데이터를 보내는 컴퓨터와 받는 컴퓨터, 그리고 데이터를 전달하는 네트워크로 이루어져 있습니다.

TCP/IP 소켓 통신"택배 상자" 라고 생각할 수 있습니다. 택배 상자는 물건을 담아 보내는 도구입니다. 소켓 API는 택배 상자와 같이 데이터를 담아 네트워크를 통해 전송하는 도구입니다.

즉, TCP/IP 소켓 통신은 TCP/IP 통신의 구체적인 구현 방식 중 하나라고 볼 수 있습니다. TCP/IP 통신은 TCP/IP 프로토콜을 사용하는 모든 통신을 포괄하는 개념이고, TCP/IP 소켓 통신은 그 중에서도 소켓을 사용하는 통신 방식을 의미합니다.

API

  • 정의: API(Application Programming Interface)는 응용 프로그램에서 운영 체제나 다른 응용 프로그램의 기능을 사용할 수 있도록 제공되는 인터페이스입니다.
    즉, 프로그램들이 서로 상호 작용하는 것을 돕는 매개체입니다. 쉽게 말해, 프로그램들이 서로 상호 작용하기 위한 규칙과 명세라고 할 수 있습니다.

  • 역할: API는 프로그램 개발자가 복잡한 기능을 직접 구현하지 않고도 이미 만들어진 기능을 활용할 수 있도록 하여 개발 시간을 단축하고 생산성을 높여줍니다.

  • 구성 요소: API는 함수, 클래스, 메서드, 변수 등 다양한 요소로 구성됩니다.

  • 예시:

    • Windows API: Windows 운영 체제에서 제공하는 API로, 창 생성, 파일 읽기/쓰기, 네트워크 통신 등 다양한 기능을 제공합니다.
    • OpenCV API: OpenCV 라이브러리에서 제공하는 API로, 이미지 처리, 객체 인식, 영상 분석 등 다양한 기능을 제공합니다.
    • Google Maps API: 구글 지도 서비스에서 제공하는 API로, 지도 표시, 경로 검색, 위치 정보 검색 등 다양한 기능을 제공합니다.

API 사용 예시 (C#)

using System.Net.Sockets;

// 소켓 생성
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

// 서버에 연결
socket.Connect("127.0.0.1", 80);

// 데이터 전송
byte[] buffer = System.Text.Encoding.UTF8.GetBytes("Hello, world!");
socket.Send(buffer);

// 데이터 수신
byte[] receiveBuffer = new byte[1024];
int bytesReceived = socket.Receive(receiveBuffer);

// 소켓 닫기
socket.Close();

이 코드는 System.Net.Sockets 네임스페이스에 정의된 Socket 클래스를 사용하여 TCP/IP 소켓 통신을 수행하는 예시입니다. Socket 클래스는 소켓을 생성하고 연결하고 데이터를 주고받는 등 다양한 기능을 제공하는 API입니다.


API vs .NET의 네임스페이스, 클래스

API는 .NET의 네임스페이스나 클래스와 직접적인 관련은 없습니다.

  • 네임스페이스: 클래스, 구조체, 인터페이스 등을 논리적으로 묶어서 관리하기 위한 단위입니다.
  • 클래스: 객체를 생성하기 위한 템플릿입니다.

API는 이러한 .NET 요소들을 사용하여 구현될 수 있지만, API 자체는 프로그램들이 서로 상호 작용하기 위한 규칙과 명세를 의미합니다. 즉, API는 .NET의 네임스페이스나 클래스가 아니라, .NET을 포함한 다양한 프로그래밍 환경에서 사용되는 더 포괄적인 개념입니다.

예를 들어, OpenCvSharp 라이브러리는 OpenCV API를 C#에서 사용할 수 있도록 .NET 클래스와 메서드로 구현한 것입니다. 즉, OpenCvSharp는 OpenCV API를 .NET 환경에서 사용하기 위한 래퍼(wrapper) 역할을 합니다.


1. 시리얼 통신

  • 정의: 컴퓨터와 주변 장치 간에 데이터를 한 번에 한 비트씩 순차적으로 전송하는 통신 방식입니다.
  • 사용 이유:
    • 간단한 구현: 비교적 적은 수의 선으로 통신을 구현할 수 있어, 비용 효율적이고 구현이 간편합니다.
    • 넓은 활용 범위: 다양한 장치와 시스템에서 널리 사용됩니다. (예: 아두이노, 센서, GPS 모듈, 산업용 장비)
  • 아두이노와의 연관성: 아두이노는 Serial 클래스를 통해 시리얼 통신을 지원합니다. 컴퓨터와 아두이노 간에 데이터를 주고받거나, 아두이노와 다른 시리얼 장치 간에 통신할 때 사용됩니다.
  • 아두이노로 학습하는 방법:
    • 아두이노 IDE의 Serial Monitor를 사용하여 컴퓨터와 아두이노 간에 데이터를 주고받는 예제를 실습합니다.
    • 아두이노와 GPS 모듈, 온도 센서 등 시리얼 통신을 지원하는 외부 장치를 연결하여 데이터를 읽고 쓰는 실습을 합니다.
  • PC 제어와의 연관성: PC에서 시리얼 통신을 사용하여 아두이노 또는 다른 외부 장치를 제어할 수 있습니다. C#, Python 등의 언어에서 시리얼 통신 라이브러리를 사용하여 프로그램을 개발할 수 있습니다.

2. I/O 제어

  • 정의: Input/Output 제어의 약자로, 컴퓨터 시스템이 외부 장치와 데이터를 주고받고 제어하는 것을 의미합니다.
  • 사용 이유:
    • 외부 장치 활용: 컴퓨터 시스템이 센서, 액추에이터, 모터, 디스플레이 등 다양한 외부 장치를 활용하고 제어할 수 있도록 합니다.
    • 시스템 확장: I/O 제어를 통해 컴퓨터 시스템의 기능을 확장하고 다양한 작업을 수행할 수 있습니다.
  • 아두이노와의 연관성: 아두이노는 디지털 I/O, 아날로그 I/O, PWM 등 다양한 I/O 기능을 제공합니다. 이를 통해 LED, 버튼, 센서, 모터 등 다양한 외부 장치를 제어할 수 있습니다.
  • 아두이노로 학습하는 방법:
    • 아두이노에 LED, 버튼, 센서, 모터 등을 연결하여 제어하는 예제를 실습합니다.
    • 아두이노를 사용하여 데이터를 수집하고 처리하는 프로젝트를 진행합니다.
  • PC 제어와의 연관성: PC에서 I/O 제어를 사용하여 아두이노 또는 다른 외부 장치를 제어할 수 있습니다. PC에서 I/O 제어 프로그램을 개발하여 외부 장치의 동작을 제어하고 데이터를 주고받을 수 있습니다.

3. Motion 제어

  • 정의: 모터의 움직임을 제어하는 것을 의미합니다.
  • 사용 이유:
    • 자동화: 로봇, CNC 머신, 3D 프린터 등 다양한 자동화 장비에서 모터의 정밀한 제어가 필요합니다.
    • 정밀 제어: 모션 제어를 통해 모터의 속도, 위치, 토크 등을 정밀하게 제어할 수 있습니다.
  • 아두이노와의 연관성: 아두이노는 PWM, 서보 모터 라이브러리, 스테퍼 모터 라이브러리 등을 통해 모션 제어 기능을 제공합니다. 이를 통해 DC 모터, 서보 모터, 스테퍼 모터 등 다양한 모터를 제어할 수 있습니다.
  • 아두이노로 학습하는 방법:
    • 아두이노에 DC 모터, 서보 모터, 스테퍼 모터 등을 연결하여 제어하는 예제를 실습합니다.
    • 아두이노를 사용하여 로봇 팔, 자동차 등 모션 제어가 필요한 프로젝트를 진행합니다.
  • PC 제어와의 연관성: PC에서 모션 제어 프로그램을 개발하여 아두이노 또는 모션 보드를 통해 모터를 제어할 수 있습니다.

4. TCP/IP

  • 정의: 인터넷에서 데이터를 전송하기 위한 통신 규약 (프로토콜)입니다.
  • 사용 이유:
    • 인터넷 통신: 인터넷에서 데이터를 주고받는 모든 통신은 TCP/IP를 기반으로 이루어집니다.
    • 네트워크 연결: 컴퓨터, 스마트폰, 서버 등 다양한 장치를 네트워크로 연결하여 통신할 수 있도록 합니다.
  • 아두이노와의 연관성: 아두이노는 Ethernet Shield, Wi-Fi Shield 등을 사용하여 TCP/IP 통신을 지원합니다. 이를 통해 아두이노를 네트워크에 연결하고, 웹 서버, 클라이언트 등으로 활용할 수 있습니다.
  • 아두이노로 학습하는 방법:
    • 아두이노에 Ethernet Shield 또는 Wi-Fi Shield를 연결하고, 웹 서버를 구축하는 예제를 실습합니다.
    • 아두이노를 사용하여 네트워크를 통해 데이터를 주고받는 프로젝트를 진행합니다.
  • PC 제어와의 연관성: PC에서 TCP/IP 통신을 사용하여 아두이노 또는 다른 네트워크 장치를 제어할 수 있습니다.

5. RS232C

  • 정의: 시리얼 통신의 한 종류로, 컴퓨터와 주변 장치 간에 데이터를 전송하기 위한 표준 인터페이스입니다.
  • 사용 이유:
    • 과거 주변 장치 연결: 과거에는 프린터, 모뎀 등 다양한 주변 장치를 컴퓨터에 연결하는 데 널리 사용되었습니다.
    • 현재 산업용 장비: 현재는 산업용 장비, 과학 장비 등에서 주로 사용됩니다.
  • 아두이노와의 연관성: 아두이노는 USB-to-Serial 컨버터를 사용하여 RS232C 통신을 할 수 있습니다.
  • 아두이노로 학습하는 방법:
    • 아두이노에 USB-to-Serial 컨버터를 연결하고, RS232C 통신을 사용하는 외부 장치와 통신하는 예제를 실습합니다.
  • PC 제어와의 연관성: PC에서 RS232C 통신을 사용하여 아두이노 또는 다른 외부 장치를 제어할 수 있습니다.

6. Ethernet

  • 정의: 컴퓨터 네트워크를 구축하기 위한 기술 표준입니다.
  • 사용 이유:
    • 유선 네트워크 구축: 컴퓨터, 서버, 스위치, 라우터 등 다양한 장치를 연결하여 유선 네트워크를 구축합니다.
    • 안정적인 통신: Ethernet은 Wi-Fi보다 안정적인 통신을 제공합니다.
  • 아두이노와의 연관성: 아두이노는 Ethernet Shield를 사용하여 Ethernet 통신을 지원합니다.
  • 아두이노로 학습하는 방법:
    • 아두이노에 Ethernet Shield를 연결하고, 네트워크 통신을 하는 예제를 실습합니다.
  • PC 제어와의 연관성: PC에서 Ethernet 통신을 사용하여 아두이노 또는 다른 네트워크 장치를 제어할 수 있습니다.

참조

0개의 댓글