VisionCube
VisionCube UART Sample Source(on RPi4)
박민혀기
2023. 11. 16. 17:26
시리얼 포트 확인
- 가장 먼저, 라스베리파이에서 시리얼 포트가 어디에 있는지 알아야한다. GPIO상 BCM 14,15번 핀이 시리얼통신용 (각각 TX, RX)인데, 라스비안에서 /dev/serial0으로 불린다. (ls 명령어로 찾아보자)
- 원래 시리얼통신 포트 이름은 /dev/ttyAMA0이다. 그런데 파이3에서는, 이전까지 /dev/ttyAMA0에 할당되어있던 시리얼포트가 블루투스에 할당되었다. 시리얼포트는 /dev/ttyS0로 옮겨졌다.
- 위와같은 이유로 rpi3와 그 이전 기계에서 함께쓰는 코드를 쓰려면 /dev/ttyAMA0라는 이름을 쓰면 안된다. 대신 /dev/serial0라는 이름-일종의 바로가기(aliase)-를 사용하면 된다. 즉 rpi1,2에서는 시리얼 == /dev/ttyAMA0 == /dev/serial0 그리고 rpi3에서는 시리얼 == /dev/ttyS0 == /dev/serial0 터미널에서 확인해보자.
UART 활성화 & 시리얼 콘솔 연결 (getty service) 비활성화
- 예전 컴튜터라는게 막 생겨난 시기, 다른 컴퓨터에 접속해 콘솔창을 띄우는 용도로 시리얼 포트를 사용하곤 했었는데, rpi에서 시리얼 포트를 그런 용도로 사용하는 것을 기본으로 설정해 두었다. (getty 서비스라고 함).
- 시리얼 포트를 다른 하드웨어와 연결해 우리 마음대로 다루고 싶다면 콘솔 연결을 비활성화 시켜야 한다.
- 콘솔연결은 비활성화하더라고 시리얼포트는 사용가능하게 두어야 한다.
결론적으로 이것저것 골치아프게 생각하지 말로 시리얼포트는 '/dev/serial0'을 사용하면 된다.
(안되면 serial1)
#include <iostream>
#include <wiringPi.h>
#include <wiringSerial.h>
int main() {
// 라즈베리 파이의 UART 포트 초기화
int serialPort = serialOpen("/dev/serial0", 115200); // "/dev/serial1"도 사용 가능
if (serialPort < 0) {
std::cerr << "Error opening serial port." << std::endl;
return 1;
}
// 메시지 송수신 루프
while (true) {
// 메시지 송신
serialPutchar(serialPort, 'A');
std::cout << "Sent: A" << std::endl;
// 잠시 대기 (수신이 끝날 때까지 기다리는 시간을 줄이기 위해)
delay(100);
// 메시지 수신 및 출력
while (serialDataAvail(serialPort) > 0) {
char receivedChar = serialGetchar(serialPort);
std::cout << "Received: " << receivedChar << std::endl;
}
// 잠시 대기
delay(1000); // 1초 동안 대기
}
// UART 포트 닫기
serialClose(serialPort);
return 0;
}