## 임베디드 시스템 C/C++ 실습 강의 노트: 데이터 통신 마스터하기


### 1. 시리얼 통신 기초 (UART)


**UART 개요**


* 비동기식 시리얼 통신 방식

* 송신 (TX), 수신 (RX) 두 개의 핀으로 데이터 전송

* 시작 비트, 데이터 비트, 패리티 비트 (옵션), 정지 비트로 구성된 프레임 단위 전송

* 보드 레이트 (Baud Rate): 초당 전송되는 비트 수 (bps)


**C/C++ 코드 예시 (Arduino)**


```c++

#include <SoftwareSerial.h>


SoftwareSerial mySerial(10, 11); // RX, TX 핀 설정


void setup() {

  mySerial.begin(9600); // 시리얼 통신 초기화 (9600 bps)

}


void loop() {

  if (mySerial.available()) { // 수신 데이터 확인

    char data = mySerial.read(); // 데이터 수신

    // 수신된 데이터 처리

  }


  // 센서 값 등 데이터 전송

  mySerial.println("Hello, Embedded World!");

}

```


**실습 과제**


1. 시리얼 모니터를 통해 문자열을 주고받는 프로그램 작성

2. 센서 값을 시리얼 통신으로 전송하고, 시리얼 플로터로 그래프 그리기


### 2. SPI (Serial Peripheral Interface) 통신


**SPI 개요**


* 동기식 시리얼 통신 방식

* 마스터-슬레이브 구조

* MOSI (Master Out Slave In), MISO (Master In Slave Out), SCK (Serial Clock), SS (Slave Select) 핀 사용

* 빠른 데이터 전송 속도


**C/C++ 코드 예시 (Arduino)**


```c++

#include <SPI.h>


const int slaveSelectPin = 10;


void setup() {

  SPI.begin(); // SPI 통신 초기화

  pinMode(slaveSelectPin, OUTPUT);

  digitalWrite(slaveSelectPin, HIGH); // SS 핀 비활성화

}


void loop() {

  digitalWrite(slaveSelectPin, LOW); // SS 핀 활성화


  // SPI 데이터 전송

  byte data = 0xAB;

  SPI.transfer(data);


  digitalWrite(slaveSelectPin, HIGH); // SS 핀 비활성화

  delay(100);

}

```


**실습 과제**


1. SPI 통신으로 SD 카드 데이터 읽고 쓰기

2. SPI 통신으로 디지털 센서 값 읽기


### 3. I2C (Inter-Integrated Circuit) 통신


**I2C 개요**


* 동기식 시리얼 통신 방식

* 마스터-슬레이브 구조

* SDA (Serial Data), SCL (Serial Clock) 핀 사용

* 주소 지정 방식으로 여러 슬레이브 장치 연결 가능


**C/C++ 코드 예시 (Arduino)**


```c++

#include <Wire.h>


const int deviceAddress = 0x68; // 장치 주소


void setup() {

  Wire.begin(); // I2C 통신 초기화

}


void loop() {

  Wire.beginTransmission(deviceAddress); // 데이터 전송 시작

  Wire.write(0x00); // 레지스터 주소

  Wire.endTransmission(); // 전송 종료


  Wire.requestFrom(deviceAddress, 2); // 2 바이트 데이터 요청

  while (Wire.available()) {

    char c = Wire.read(); // 데이터 수신

    // 수신된 데이터 처리

  }

}

```


**실습 과제**


1. I2C 통신으로 EEPROM 데이터 읽고 쓰기

2. I2C 통신으로 RTC (Real-Time Clock) 모듈 시간 설정 및 읽기


### 4. 데이터 전송 모델링 및 오류 처리


**데이터 전송 모델**


1. 센서 값 읽기

2. 데이터 변환 및 패킷 구성

3. 체크섬 계산

4. 시리얼 통신으로 데이터 전송

5. 수신 확인 및 오류 처리


**오류 처리 기법**


* 패리티 비트

* 체크섬

* CRC (Cyclic Redundancy Check)


**실습 과제**


1. 체크섬을 이용하여 데이터 오류 검출 기능 추가

2. 흐름 제어 (예: XON/XOFF) 구현


### 5. 프로젝트: IoT 센서 데이터 수집 및 전송


**프로젝트 개요**


1. 온도 및 습도 센서 값을 I2C 통신으로 읽기

2. 데이터를 특정 형식으로 패킷 구성 (JSON 등)

3. Wi-Fi 모듈을 통해 MQTT 프로토콜로 클라우드 서버에 데이터 전송


**참고 자료**


* Arduino 공식 홈페이지: [https://www.arduino.cc/](https://www.arduino.cc/)

* 임베디드 시스템 관련 서적 및 온라인 강의


이 실습 강의 노트는 임베디드 시스템 C/C++ 프로그래밍의 기초를 다지고, 데이터 통신 기능을 구현하는 데 필요한 핵심 개념과 실습 과제를 제공합니다. 


궁금한 점은 언제든지 질문해주세요.