[Intel AI SW 아카데미] 시리얼 통신, 라즈베리파이 SD card 이미지 복제하고 재설치

Jimeaning·2024년 2월 2일
0

Intel AIoT

목록 보기
30/38

2024.2.2 (금)

Serial 통신 (UART)

6번(GND) -> usb 케이블 흑색(GND)
8번(TXD) -> usb 케이블 흰색(RXD)
10번(RXD) -> usb 케이블 초록색(TXD)

시리얼 통신이란

  • 병렬 데이터의 형태를 직렬 방식으로 전환하여 데이터를 전송하는 컴퓨터 하드웨어의 일종
  • 통신에는 직렬 통신과 병렬 통신의 2가지 방식이 존재한다. 시리얼(Serial)은 직렬이라는 뜻으로, 패러럴(Parallel)과 반대되는 단어이다. 직렬 통신데이터를 보낼 때 한 데이터 선(lane)에서 데이터를 보내는 방식이고, 병렬 통신여러 개의 선(lane)에서 보내고자 하는 데이터를 나눠서 보내는 것이다.

Uart(Universal Asynchrounous serial Receiver and Transmitter)

  • 비동기식(Asynchronous) 통신. 데이터 수신의 타이밍을 위하여 Clock 라인을 사용하지 않음.
  • 비동기식 통신이기 때문에 보내는 데이터를 어떻게 해석할지가 중요하다. 데이터 해석을 위해서는 아래와 같은 정보가 필요하다. 송수신 측에서는 아래와 같은 규칙들을 지정하고 데이터를 해석하다.
    • Baud Rate(보레이트)라고 하며 초당 많은 심볼(Symbol, 의미 있는 데이터 묶음)을 얼마만큼 전송할지에 대한 정보이다.
    • 데이터 길이 : 송수신 데이터 길이(8bit or 7bit)
    • 패리티 비트 : 패리티 비트 사용 X, Even(짝수) 패리티 사용, Odd(홀수) 패리티 사용
    • 정지 비트 : 정지 비트(1 or 2개)

I2C

  • 동기식(Synchronous) 시리얼 통신 방식. 데이터 수신의 타이밍을 위하여 Clock 라인을 사용
  • 필립스에서 개발한 직렬 버스로 마더보드, 임베디드 시스템, 휴대 전화 등에 저속의 주변 기기를 연결하기 위해 사용된다.
  • I²C 는 풀업 저항이 연결된 직렬 데이터(SDA)와 직렬 클럭(SCL)이라는 두 개의 양방향 오픈 컬렉터 라인을 사용합니다. 최대 전압은 +5 V이며, 일반적으로 +3.3 V 시스템이 사용되지만 다른 전압도 가능합니다.
  • 마스터(Master)와 슬레이브(Slave)가 존재
  • 아래와 같은 2가지 선으로 이루어져 있다.
    • SDA : Data 송수신
    • SCK : Clock 전송
  • 슬레이브마다 지정된 주소 값을 가지고 데이터를 주고 받는다. 데이터를 주고 받을 때 반드시 주소 값을 붙여서 보내야 한다.
  • SPI가 여러 개의 선이 필요한 것과 달리 2개의 선만 가지고 통신이 가능하다.

Putty로 시리얼 통신

연결 > 시리얼 > 접속할 시리얼 라인, 속도 수정
세션 > 연결 형식 : Serial

$ sudo vi /boot/config.txt


맨 아래쪽에 추가해 주기

$ sudo vi /boot/cmdline.txt

pi에서

$ sudo reboot

해주기

그러면 아래와 같이 뜸!

오타났을 때 아래 경로로 들어 가 수정할 수 있다

라즈베리파이 SD card 이미지 복제하고 재설치하기

Linux PC의 설치 준비

$ sudo apt install gparted pv dcfldd

Disk image 만들기

$ sudo umount /dev/sdb1
$ sudo umount /dev/sdb2
$ sudo dd if=/dev/sdb of=sdimage.img status=progress

image 용량 줄이기

$ sudo chown ubuntu:ubuntu sdimage.img
-rw-r--r-- 1 ubuntu ubuntu 31914983424  22 12:46 sdimage.img
$  sudo fdisk -l sdimage.img
Disk sdimage.img: 29.74 GiB, 31914983424 bytes, 62333952 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x88794313

Device       Boot   Start      End  Sectors  Size Id Type
sdimage.img1         8192  1056767  1048576  512M  c W95 FAT32 (LBA)
sdimage.img2      1056768 62333951 61277184 29.2G 83 Linux

df로 현재 쓰고 있지 않은 loop 선택
리눅스 환경에서 아래 명령 실행하기 (GUI라서 text 기반으로는 실행 불가)

$ sudo losetup /dev/loop12 sdimage.img
$ sudo partprobe /dev/loop12
$ sudo gparted /dev/loop12



마우스 오른쪽 클릭하고 Resize 선택 > New size : 7168

$ sudo losetup -d /dev/loop12
$ fdisk -l sdimage.img
$ truncate --size=$[(15736831+1)*512] sdimage.img

리눅스 프로그래밍 기초

Vim 기본 설정

파일을 다음 파일로 복사하는 코드

  1 #include <unistd.h>				// 유닉스 표준 시스템 콜을 위한 헤더 파일
  2 #include <fcntl.h>
  3 #include <stdio.h>				// perror() 함수
  4 #include <sys/stat.h>
  5 #include <sys/types.h>
  6
  7 int main(int argc, char **argv)
  8 {
  9     int n, in, out;
 10     char buf[1024];
 11
 12     if (argc < 3) {				// 명령행 인수로 복사할 파일명이 없는 경우 에러를 출력하고 종료
 13         write(2, "Usage : copy file1 file2\n", 25);
 14         return -1;
 15     }
 16
 17     if ((in = open(argv[1], O_RDONLY)) < 0) {		// 복사의 원본이 되는 파일을 읽기 모드로 연다
 18         perror(argv[1]);
 19         return -1;
 20     }
 21
 22     if ((out = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR    )) < 0) {		// 복사할 결과 파일을 쓰기 모드(새로운 파일 생성 | 기존에 파일 내용 지움)로 연다
 23         perror(argv[2]);
 24         return -1;
 25     }
 26
 27     while ((n = read(in, buf, sizeof(buf))) > 0)		// 원본 파일의 내용을 읽어 복사할 파일에 쓴다
 28         write(out, buf, n);
 29
 30     close(out);				// 열린 파일들을 닫는다
 31     close(in);
 32
 33     return 0;
 34 }

TCP 기반 서버, 클라이언트 함수 호출

$ cp /srv/samba/hello_*.c .
$ gcc hello_server.c -o hello_server
$ gcc hello_client.c -o hello_client
$ ./hello_server
$ ./hello_client 127.0.0.1 5000
Message from server: Hello World!
profile
I mean

0개의 댓글