◎ 사용할 수 있는 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