Processor

【라즈베리파이】 wiringPi C 언어 : UART 테스트

작성자 임베디드코리아 작성일26-02-17 18:21 조회106회 댓글0건
◎ 사용할 수 있는 UART 보기
$ raspi-gpio funcs

◆ 라즈베리파이 3버전 부터 블루투스 기능이 추가되었으며, 라즈베리파이 3, 4, zeroW 버전은
    하드웨어적인 UART0(PL011)을 블루투스 통신용으로 할당해 놓았다
◆ 라즈베리파이 4, 3, zero w는 miniUART(UART1)를 통해서 시리얼 통신을 해야한다.
◆ 하드웨어적인 UART와 mini UART는 각각 라즈베리파이의 /dev/ttyAMA0, ttyS0와 매핑 되어 있다.

◎ 매핑된 시리얼 디바이스들을 확인
$ ls /dev/tty*

◎ dt-overlay 확인
$ $ dtoverlay -a | grep uart

◎ uart3이 사용하는 핀에 대한 정보
$ dtoverlay -h uart3
Name:  uart3
Info:  Enable uart 3 on GPIOs 4-7
Usage:  dtoverlay=uart3,<param>
Params: ctsrts  Enable CTS/RTS on GPIOs 6-7 (default off)

◎ uart3번을 사용하도록 설정
$ sudo nano /boot/config.txt
.....
[all]
dtoverlay=uart3  <----- 맨뒤에 추가

◎ 재부팅을 하고, 라즈베리파이의 4, 5번 핀이 uart3을 위한 핀으로 설정되었는지 확인
$ raspi-gpio get 4-5
GPIO 4: level=1 fsel=3 alt=4 func=TXD3 pull=NONE
GPIO 5: level=1 fsel=3 alt=4 func=RXD3 pull=UP

◎ 가상 디바이스확인
$ ls -l /dev/ttyAMA*
crw-rw---- 1 root dialout 204, 64 Jul 23 07:27 /dev/ttyAMA0
crw-rw---- 1 root dialout 204, 65 Jul 23 07:27 /dev/ttyAMA1

--->>> 예제  :  uart.c    <<<-----------------------------------
#include <stdio.h>

#include <string.h>
#include <errno.h>


#include <wiringPi.h>
#include <wiringSerial.h>

int main ()
{
  int fd;
  int data;

  if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) < 0)
  {
    fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno));
    return 1;
  }

  printf ("\nRaspberry Pi UART Test");

  while(1)
  {
    data = serialGetchar(fd);
    printf ("\nPC > RPi = %c", (char)data);
    serialPutchar(fd, data);
    serialPuts(fd, "\n");
    fflush(stdout);
  }

  return 0 ;
}
------------------------------------------------------------------
$ gcc  -o  uart  uart.c  -lwiringPi
$ sudo  ./uart


--->>> 예제 : uart_test.c  <<<-------------------------------
#include <stdio.h>
#include <string.h>
#include <errno.h>

#include <wiringPi.h>
#include <wiringSerial.h>

int main ()
{
  int fd ;
  int count ;
  unsigned int nextTime ;

  if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) < 0)  // 두번째 인자값이 보레이트 설정
  {
    fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;                 
    return 1 ;
  }
//
  if (wiringPiSetup () == -1)
  {
    fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
    return 1 ;
  }

  nextTime = millis () + 300 ;

  for (count = 0 ; count < 256 ; )
  {
    if (millis () > nextTime)
    {
      printf ("\nOut: %d: ", count) ;
      fflush (stdout) ;
      serialPutchar (fd, count) ; // 데이터 전송해주는 함수
      nextTime += 300 ;
      ++count ;
    }

    delay (3) ;

    while (serialDataAvail (fd))
    {
      printf (" -> %3d", serialGetchar (fd)) ;  // 데이터 받는 함수
      fflush (stdout) ;
    }
  }

  printf ("\n") ;
  return 0 ;
}
-----------------------------------------------------------------------
$ gcc  -o  uart_test  uart_test.c  -lwiringPi
$ sudo  ./uart_test

--->>> 예제  :  rasp_uart.c    <<<----------------------------------
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <wiringPi.h>
#include <wiringSerial.h>

void uart_ch(char ch);
void uart_str(char *str);


int main(void)
{
char str[100]={0,};
    char str1[100]={0,};


if (wiringPiSetup () == -1)
{

    fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;

    return 1 ;
}


while(1)
{

scanf("%s",str1);
getchar();
sprintf(str,"%s\n\r",str1);
uart_str(str);
}


return 0 ;
}


void uart_ch(char ch)
{
int fd ;


if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) < 0)
{

fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno));

return;
}


serialPutchar(fd,ch);

close(fd);
}


void uart_str(char *str)
{
while(*str) uart_ch(*str++);
}

------------------------------------------------------------------------------------------
$ gcc  -o  rasp_uart  rasp_uart.c  -lwiringPi
$ sudo  ./rasp_uart