Framework/IOT | Aduino

[IoT] Serial 통신에 대한 이해 및 주의 사항

깜태 2022. 4. 6. 17:30
728x90

시리얼 통신이란?

컴퓨터 과학에서 직렬(Serial) 통신은 병렬(Parallel) 통신과 대비되는 말이다.

왜냐하면 같은 데이터를 두고 전달하는 방법이 다르기 때문이다.

병렬인 경우 같은 시간에 데이터가 여러개 들어오는 반면,

직렬인 경우 같은 시간에 데이터가 1개씩 "연속적"으로 들어온다. (그래서 Serial이다)

위의 내용을 보았을 땐 당연하게 병렬이 좋겠지만, 하드웨어 설계나 비용 등의 경제성을 고려하면

직렬 통신을 사용하는 이유로 이어지게 되는데, 이런 이유로 IoT 분야에서는 직렬 통신을 더 애용하는 것 같다.

 

직렬 통신의 장점으로는 경제성이 있겠지만, 프로그래밍하는 입장에서는 데이터가 순차적으로 들어오는만큼

데이터에 대해 정해져있지 않으면 어디가 데이터의 시작이고 어디가 끝인지 알 수가 없다.

따라서 데이터 양식을 어떻게 할지 프로토콜이라는 약속으로 정의하여 데이터를 보내는 게 일반적이다.

조금 더 보태면 우리가 사용하는 인터넷 랜선도 시리얼 통신의 일종으로, 패킷이라는 단위로 헤더로 데이터를 나눈다.

이만큼 직렬 통신은 생각보다 대중적이기도 하고, 인터넷에서 패킷을 쓰는 이유를 생각해보면 그만큼 프로토콜이 중요하다는 의미이다.

패킷에 대한 구조

 

힌번 더 생각해보면 직렬통신은 "시간"에 영향을 많이 받는 것으로 생각할 수 있다.

인터넷을 예로 들어보면 우리는 생활 속에서 100Mbps, 500Mbps, 1Gbps, 10Gbps 라는 용어를 많이 들어봤다.

bps 라는 단어는 bit per sec 로 100Mbps의 경우 1초당 100 * Mega(10^6) bit per sec라는 의미로,

초당 얼만큼의 데이터 전송이 가능하냐는 의미인데, 이는 우리가 내는 요금에 따라 달라지게 된다는 것도 알고 있다.
IoT 기기들도 마찬가지로 각 디바이스마다 하드웨어 사양이 다르기 마련이다.

데이터를 전송하려는 하드웨어의 사양에 따라 전송속도도 달라지게 된다.

 

 

시리얼 통신 시 주의사항

위의 기본적인 개념을 이해하지 못해서 내가 겪은 실수를 주의사항으로 적어본다.

나는 바보기 때문에 실수하고 기록하지만, 이 글을 읽는 사람은 도움이 되었으면 좋겠다.

프로그래밍 하는 입장에서는 IoT 기기와 실시간으로 연동하여 내 컴퓨터로 데이터를 받아와 어떤 작업을 처리하곤 한다.

내가 만약 1ms 단위로 1 바이트(byte)의 데이터를 받고 싶다면, 최소 몇 bps 이상을 보장해야될까?

1바이트는 8비트고, 1ms 는 1/1000초이므로, 1초에 8000bit는 나와야 된다.

조금 변형해서 10ms 단위로 100바이트가 된다면, 80000bps는 나와야 된다.

내가 말하고 싶은 주의사항은 처리하고 싶은 단위시간에 따라 baudrate는 중요하다는 것이다.

(여담으로 이쯤되면 우리가 쓰는 인터넷은 도대체 얼마나 좋았던거야 싶은 생각도 드는데,

우리가 쓰는 인터넷은 랜카드가 하드웨어적으로 데이터를 송수신하는 역할을 해주고 있다.)

 

추가로 실시간으로 데이터를 받아오면서 데이터를 기반으로 어떤 작업을 해야한다면 어떻게 할까?

보통은 동시에 작업을 하면 멀티프로세스나 쓰레드를 돌린다.

IoT 분야의 초보자인 나는 쓰레드로 돌리면서 프로토콜의 바이트 개수만큼 받아서
바로 프로토콜과 비교하면 되는 줄 알았다.

나는 파이썬으로 읽었고 파이썬에서는 자체적으로 버퍼를 가지고 읽어줘서 편하게 썼었는데 잘못됐다는 걸 깨달았다.

pyserial read 함수 내부

왜냐하면 무선 환경이라던지 실제로 물리적으로 신호가 약하다던지 등의 이유로

읽은 데이터가 한번도 끊기지 않으리란 보장과 헤더가 내가 원하는 시점에 들어오리라는 보장은 어렵다.

신호는 무슨 이유로든 꼬일 수 있기 때문에 검증이 필요하다.

따라서 다음 주의사항은 데이터를 읽을 때는 1바이트씩 읽어야한다는 것이다.

직렬 통신을 쓰는 경우, 원형 큐로 1바이트를 읽으면서 프로토콜과 대조하는 게 에러를 피하는 좋은 방법인 것 같다.

 

 

하고싶은 말보다 서두가 더 길었던 거 같다.

 

요약

  1. 시리얼 통신은 시간과 연관이 깊으니 시간 단위에 대한 이해가 필요하다.
  2. 데이터에 대한 시작과 끝의 구분이 필요하므로 프로토콜을 잘 정의하는 것이 중요하다.
  3. 데이터가 끊길 수 있으므로 읽거든 1바이트씩 읽어서 비교하자.
728x90

'Framework > IOT | Aduino' 카테고리의 다른 글

[IOT] MQTT(Message Queue Telemetry Transport)란?  (0) 2022.02.24