## 임베디드 시스템 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++ 프로그래밍의 기초를 다지고, 데이터 통신 기능을 구현하는 데 필요한 핵심 개념과 실습 과제를 제공합니다.
궁금한 점은 언제든지 질문해주세요.
ㅇㅅㅇ