서론
산업용 장비의 제어보드에는 STM32가 많이 사용되고 있습니다. 비교적 간단한 장비에서는 STM32에 Touch Screen을 직접 연결하여 HMI를 구성할 수 있지만, 상위 레벨의 Network이나 보다 복잡한 프로세싱이 필요한 경우에는 Raspberry Pi와 같은 싱글보드 컴퓨터를 함께 사용하기도 합니다.
이 경우 STM32와 상위 컴퓨터 사이에서 명령이나 장비 상태뿐만 아니라 설정 데이터, 생산 정보 등 비교적 큰 데이터를 주고받아야 할 수 있습니다. RS-232C와 같은 시리얼 통신은 구조가 단순하고 구현이 쉽지만, 데이터의 양이 증가하거나 보다 빠른 통신이 필요한 경우에는 속도와 확장성 측면에서 한계가 있습니다.
저도 실제 장비에서 HMI와의 통신 속도를 개선할 필요성을 느끼고 있었으며, STM32의 Ethernet 기능을 이용하여 기존의 RS-232C 통신을 Ethernet으로 변경했을 때 어느 정도의 데이터 전송이 가능한지 직접 확인해 보기로 하였습니다.
앞서 진행한 Wi-Fi에서는 Network 기능을 확인하기 위한 시험 환경으로 공유기와 DHCP를 사용하였습니다. 그러나 실제 장비 내부에서는 외부 Network 환경에 의존하지 않고 상위 컴퓨터와 STM32 제어보드가 독립적인 1:1 Network를 구성하여 직접 통신할 수 있어야 합니다.
따라서 이번에는 SBC(Single Board Computer)와 STM32를 Ethernet Cable로 직접 연결하여 1:1 Ethernet Network를 구성하고 TCP를 이용하여 50 KB 데이터를 전송해 보겠습니다. 또한 데이터가 정상적으로 전달되었는지 검증하고 그 결과를 ACK로 반환하는 과정까지 확인하겠습니다.
이번 시험은 단순히 50 KB 데이터를 전송하는 것에 그치지 않고, 향후 Checksum이나 CRC를 이용한 데이터 검증과 사용자 프로토콜을 적용할 수 있는 Ethernet 통신의 기본 구조를 구성하고 검증하는 것에 의미를 두고 진행하겠습니다.
전체 시스템 구성
아래는 전체 시스템 구성의 그림입니다.

이번 시험에서는 위 그림과 같이 Orange Pi와 NUCLEO-F429ZI를 Ethernet Cable로 직접 연결하여 1:1 Ethernet Network를 구성하였습니다. 별도의 Switch나 Router를 사용하지 않고 Orange Pi에는 192.168.10.1, STM32에는 192.168.10.2의 고정 IP를 설정하였습니다.
Orange Pi는 실제 장비에서 HMI를 담당하는 상위 컴퓨터를 가정하였으며, Python 프로그램을 이용하여 TCP Client로 동작하도록 하였습니다. NUCLEO-F429ZI는 제어보드의 역할을 담당하며 Zephyr RTOS 기반의 TCP Server로 동작합니다.
이번 시험에서는 Orange Pi에서 50 KB의 데이터를 STM32로 전송하고, STM32에서는 데이터의 수신과 Payload 검증을 완료한 후, 실제로 수신한 데이터의 길이와 수신 시간을 ACK에 포함하여 Orange Pi로 반환하도록 구성하였습니다.
여기서 HMI SBC로 Orange Pi를 사용한 것은 특별한 기술적 이유가 있어서라기보다는 현재 가지고 있는 장비를 활용하기 위한 것입니다. 실제 시스템에서는 Orange Pi에 한정할 필요가 없으며, Raspberry Pi를 비롯한 다른 SBC나 산업용 컴퓨터 등 Ethernet과 TCP/IP 통신을 지원하는 상위 시스템이라면 동일한 방식으로 구성할 수 있습니다.
50 KB 데이터 전송 및 검증
전체 시스템 구성을 완료한 후 Orange Pi에서 STM32로 50 KB의 데이터를 전송하고, 데이터가 정상적으로 전달되었는지를 확인하였습니다.
이번 시험에서는 단순히 TCP 연결이 이루어지고 데이터가 수신되는지만 확인하는 것이 아니라, 다음과 같은 전체 통신 과정을 하나의 흐름으로 검증하는 것을 목표로 하였습니다.
Orange Pi 데이터 생성 → TCP 전송 → STM32 데이터 수신 → Payload 검증 → 수신 시간 측정 → ACK 반환 → Orange Pi 결과 확인
데이터 전송 구조
Orange Pi의 Python 프로그램에서는 먼저 전송할 데이터의 길이와 50 KB의 Payload를 생성하여 STM32로 전송합니다.
STM32에서는 전달받은 데이터의 길이를 기준으로 전체 Payload를 수신하고, 실제 수신된 데이터의 크기가 전송하고자 한 크기와 일치하는지를 확인합니다.
이번에는 50 KB = 51,200 bytes의 데이터를 사용하였으며, Payload에는 데이터가 정상적으로 전달되었는지를 확인할 수 있도록 일정한 규칙의 Test Pattern을 사용하였습니다.
따라서 단순히 51,200 bytes가 수신되었다는 것뿐만 아니라, 수신된 Payload의 내용까지 송신 측에서 생성한 데이터와 일치하는지 확인할 수 있도록 하였습니다.
ACK를 이용한 결과 확인
STM32에서 Payload 검증까지 정상적으로 완료되면 다음 정보를 ACK에 포함하여 Orange Pi로 반환하도록 하였습니다.
- 실제 수신한 데이터 길이
- STM32에서 측정한 데이터 수신 시간
이를 통해 Orange Pi에서는 데이터를 전송한 후 ACK를 기다리고, STM32가 실제로 데이터를 정상 수신하여 검증까지 완료했는지를 다시 확인할 수 있습니다.
즉, 이번 시험은 단방향으로 데이터를 보내는 것에서 끝나는 것이 아니라,
데이터 전송 → 수신 확인 → 데이터 검증 → 결과 응답
까지 포함하는 하나의 통신 구조로 구성하였습니다.
검증 결과
검증 결과는 다음과 같습니다.

위 그림은 실제 50 KB 데이터 전송 결과입니다. Orange Pi의 Python 프로그램에서 51,200 bytes의 Payload를 STM32로 전송하였으며, STM32 Console에서도 Payload received successfully: 51200 bytes가 출력되어 전체 데이터가 수신되었음을 확인할 수 있습니다.
데이터의 크기만 확인한 것은 아닙니다. STM32에서 수신된 Payload의 Pattern을 검사한 결과 Payload data verification OK가 출력되어 전송된 데이터의 내용도 정상적으로 유지되었음을 확인하였습니다.
STM32에서 측정한 수신 시간은 37,651 μs였으며, Payload 검증이 완료된 후 ACK,51200,37651을 Orange Pi로 반환하였습니다. Orange Pi에서도 동일한 ACK를 수신함으로써 STM32가 51,200 bytes의 데이터 수신과 검증을 정상적으로 완료했다는 것을 송신 측에서도 확인할 수 있었습니다.
따라서 이번 시험에서는 단순한 TCP 연결 여부가 아니라 50 KB 데이터 전송 → 수신 길이 확인 → Payload 검증 → 수신 시간 측정 → ACK 반환까지 전체 통신 과정이 정상적으로 동작함을 확인하였습니다.
통신 프로토콜로의 확장
이번 시험에서는 데이터의 길이와 Payload를 전송하고, STM32에서 수신된 데이터의 길이와 Payload Pattern을 확인한 후 ACK를 반환하도록 구성하였습니다.
현재는 시험을 위해 정해진 Pattern을 이용하여 Payload가 정상적으로 전달되었는지를 확인하였지만, 실제 장비에서는 이를 Checksum이나 CRC를 이용한 데이터 무결성 검증 방식으로 대체할 수 있습니다.
또한 실제 시스템에서는 데이터 길이뿐만 아니라 명령, 데이터 종류, 상태 등의 정보가 필요할 수 있습니다. 이 경우 필요한 정보를 Header에 추가하여 다음과 같은 사용자 통신 프로토콜로 확장할 수 있습니다.
┌────────────┬──────────────┬──────────────┐
│ Header │ Payload │ Checksum/CRC │
└────────────┴──────────────┴──────────────┘
↓
ACK / NACK
따라서 이번에 확인한 데이터 전송 → Payload 검증 → ACK 반환 구조는 단순한 50 KB 데이터 전송 시험을 넘어, 향후 실제 장비에서 사용할 Ethernet 기반 사용자 통신 프로토콜을 구성하기 위한 기본 구조로 활용할 수 있습니다.
예제 프로젝트 다운로드 및 사용 방법
이번 글에서는 코드 자체의 상세한 설명보다는 Ethernet 통신의 전체적인 구조와 50 KB 데이터 전송 및 검증 결과를 중심으로 살펴보았습니다.
동일한 환경에서 직접 시험하거나 세부적인 구현 내용을 확인할 수 있도록 이번에 사용한 Zephyr 프로젝트와 Python Test Program을 함께 제공합니다.
아래 링크에서 다운로드 할 수 있습니다.
압축 파일에는 NUCLEO-F429ZI의 Board 설정과 Application Project가 포함되어 있습니다.
my_nucleo_f429zi_tcpdata-50kcack_R/
│
├── my_nucleo_f429zi/ # Board 설정
│
└── my_nucleo_f429zi_tcpdata-50kcack/ # Application Project
└── tools/ # Python Test Program
my_nucleo_f429zi 폴더를 사용합니다.Orange Pi와 STM32의 Ethernet IP는 다음과 같이 설정되어 있습니다.
Orange Pi : 192.168.10.1
STM32 : 192.168.10.2
TCP Port : 5000
tools 폴더에 포함된 Python 프로그램을 실행합니다.python3 tcpdata_client-50kack.py
참고: 다른 Network 환경에서 사용하는 경우에는 STM32와 Python 프로그램의 IP Address 및 Port 설정을 동일하게 변경해야 합니다.
결론
이번에는 Orange Pi와 NUCLEO-F429ZI를 Ethernet Cable로 직접 연결하여 1:1 Ethernet Network를 구성하고, Zephyr RTOS의 TCP/IP 기능을 이용하여 50 KB 데이터를 실제로 전송하고 검증해 보았습니다.
Orange Pi에서 전송한 51,200 bytes의 데이터를 STM32에서 정상적으로 수신하였으며, Payload Pattern 검증을 통해 데이터의 내용도 정상적으로 전달되었음을 확인하였습니다. 또한 STM32에서 측정한 수신 길이와 수신 시간을 ACK에 포함하여 Orange Pi로 반환함으로써 데이터 전송부터 검증 및 응답까지의 전체 통신 과정이 정상적으로 동작하는 것을 확인하였습니다.
이번 과정에서 Zephyr RTOS의 역할도 중요했습니다.
STM32에서 Ethernet Driver와 TCP/IP Network 환경을 직접 구성하고 애플리케이션과 연결하려면 여러 부분을 고려해야 하지만, Zephyr에서는 Ethernet Driver와 Network Stack, Socket API 등이 하나의 환경으로 제공됩니다. 자세한 내용은 Zephyr Project의 Ethernet 및 BSD Sockets 공식 문서에서 확인할 수 있습니다.
덕분에 하드웨어와 Network의 세부적인 구현보다는 실제 장비에서 필요한 데이터 통신 구조와 Application Protocol을 구성하는 부분에 보다 집중할 수 있었습니다.
이번 시험의 의미는 단순히 STM32에서 50 KB 데이터를 수신할 수 있다는 것을 확인하는 데 있지는 않습니다. 상위 컴퓨터와 STM32 제어보드 사이에서 Ethernet을 이용하여 데이터를 전송하고, 수신된 데이터를 검증한 후 그 결과를 다시 응답하는 기본적인 통신 구조를 구성했다는 점에 더 큰 의미가 있습니다.
향후 Payload Pattern 검증을 Checksum이나 CRC 방식으로 변경하고, Header에 Command, Data Type, Data Length 등의 정보를 정의한다면 이번에 구성한 시스템을 기반으로 실제 장비에 필요한 Ethernet 사용자 통신 프로토콜로 발전시킬 수 있을 것으로 생각합니다.