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;
}

 

참조 : http://lhdangerous.godohosting.com/wiki/index.php/%eb%9d%bc%ec%a6%88%eb%b2%a0%eb%a6%ac%ed%8c%8c%ec%9d%b4_%ec%8b%9c%eb%a6%ac%ec%96%bc_%ed%86%b5%ec%8b%a0_%ec%84%a4%ec%a0%95_(setting_up_Raspberry_pi_serial_connection_via_GPIO)