[ BBB - yocto (11) ] uart

 1) 개요

uart 어플리케이션을 작성할 것이다.

참고로 챕터 10에서 우리가 설정한 핀이 핀헤더의 P9 24, 26번 부분이다.



패킷 구조는 간단히 보면 저렇게 되어있다.


여기에 추가로 uart 트랜시버를 사용해서 rs232 혹은 rs422, 485 등으로 변환해서 보낼 수 있는데


그에 따라 조금씩 제어 방식이 달라진다.


스탑비트, 시작 비트는 1바이트를 주로 쓰는데, 스탑비트는 2바이트로 확장해서 쓸 수 있다.





2) termios 구조체

termios.h를 인클루드하면 termios라는 구조체를 사용할 수 있다.


각 맴버 변수들에 대해서 설명하겠다.


우선 플래그에서는 uart에 대해서 패리티, 스탑 비트, 그리고 데이터 비트 수, baud레이트, 흐름제어(CRTSCTS[232, 422 전용]) 등 설정할 수 있다.


1. tcflag_t c_iflag;

- input 플래그를 설정한다.

플래그비트 값설명
IGNPAR0000004패리티 무시
PARMRK0000010패리티 오류 표시해둠. 패리티 무시 비트가 설정되면 무시됨
INPCK0000020입력 패리티 체크 활성화
INLCR0000100줄바꿈 문자'\n' -> '\r'로 변환
IGNCR0000200케리지 리턴 '\r' 무시
ICRNL0000400케리지 리턴 '\r' -> '\n'으로 변환
IUTF80040000utf8 인코딩 지원

- 이 외에도 여러 플래그들이 있지만 IGNPAR 혹은 PARMRK, INPCK 만 알아둬도 충분할 것 같다.

- 자새한 내용은 /usr/include/x86_64-linux-gnu/bits/termios-c_iflag.h를 참조하길 바란다.


2. tcflag_t c_oflag;

- output 플래그를 설정한다.

- 거의 설정할 일이 없다...

- 자새한 내용은 /usr/include/x86_64-linux-gnu/bits/termios-c_oflag.h를 참조하길 바란다.


3. tcflag_t c_cflag;

- 컨트롤 플래그이다. 시리얼 포트를 설정하는 플래그라 생각하면 된다.

상수비트 값설명
CSIZE0000060데이터 크기 비트 마스크
CS50000000데이터 비트 크기는 5이다.
CS60000020데이터 비트 크기는 6이다.
CS70000040데이터 비트 크기는 7이다.
CS80000060데이터 비트 크기가 8이다.
CSTOPB0000100스탑비트가 2비트이다.
CREAD0000200읽기(rx) 허용
PARENB0000400패리티 활성화
PARODD0001000패리티 홀수
HUPCL0002000시리얼 포트를 닫을 때 자동으로 DTR(데이터 단자 준비) 신호를 낮춰서 장치와의 연결을 끊음.
CLOCAL0004000모뎀 제어 신호 무시

- 위 내용 중에서 HUPCL과 CSIZE 빼고는 알아두어야 한다.

- CRTSCTS 를 설정하면 232, 485의 crt, sct를 사용는 flow 컨트롤을 활성화한다.

- 자새한 내용은 /usr/include/x86_64-linux-gnu/bits/termios-c_cflag.h를 참조하길 바란다.


4. tcflag_t c_lflag;

-로컬 플래그이다. 

-거의 사용하지 않으므로 안 다루겠다.


5. cc_t c_line;

- 라인 규칙

- 이것도 거의 안쓴다.


6.  cc_t c_cc[NCCS];

- VTIME, VMIN만 알아가자

- VTIME : timeout 대기 시간을 설정한다. 0으로 설정 시 non blocking(timeout 대기 x), 1당 100ms 이다.

- c_cc[VTIME] = 10; 이렇게 짜면, 1초 대기하라는 소리다.

- VMIN : 최소 입력 데이터를 설정한다. 0으로 설정 시 non blocking(최소 데이터 입력 대기x)

7. speed_t c_ispeed;

- 입력 스피드를 설정한다.

- 바우드 레이트를 설정해 줄 수 있다. c_cflags에 설정했다면 사용할 필요없다.


8. speed_t c_ospeed;

- 출력 스피드를 설정한다.

- 바우드 레이트를 설정해 줄 수 있다.c_cflags에 설정했다면 사용할 필요없다.





3) 사용 함수


1. int tcsetattr (int __fd, int __optional_actions, const struct termios *__termios_p)

- 설명 : tty 시리얼 포트의 속성을 설정한다. 속성 설정은 위에서 설명한 termios 구조체를 사용한다.

- 인자 fd : tty 시리얼 포트의 파일 디스크립터

- optional_action 가능 값

상수비트 값설명
TCSANOW0설정 속성을 지금 당장 적용
TCSADRAIN1버퍼가 비워진 뒤에 속성 적용
TCSAFLUSH2버퍼를 비우고 설정을 적용

- __termios_p : termios 속성을 설정한 구조체


2. int tcflush(int __fd, int __queue_selector)

설명 : 파일 디스크립터가 갖고 있는 입출력 버퍼 중 선택하여 비우는 함수

상수비트 값설명
TCIFLUSH0입력 버퍼를 비운다.
TCOFLUSH1출력 버퍼를 비운다.
TCIOFLUSH2입출력 버퍼 둘 다 비운다.



4) 실제 코드 작성


uart 읽고 쓰는 방법


1. uart "/dev/ttyS1" [uart 1번] 경로를 읽기 쓰기 권한을 주어 open 함수로 연다.

2. ttyflush 함수로 입력 출력 버퍼를 비워주자.

3. ttysetattr 함수로 ttyS1의 속성을 설정한다.

4. read write 함수로 읽고(uart rx) 쓰기(uart_tx) 한다.


https://github.com/leejugy/uart

코드 볼거면 git clone 해서 vscode에서 보는거 추천한다.




5) 동작


핀 이름핀 번호연결 핀
UART1_RXP9_26UART1_TX
UART1_TXP9_24UART1_RX

표대로 쇼트시켜 주시고


빌드 결과로 나온 main을 cp main ~/share로 옮긴 다음


테라텀으로 간다.


rz 명령어를 비글본에서 쳐서 (alt, f, t, z, s) 누른 다음


어플을 터미널로 다운로드 한다.


그 다음 chmod +x main 으로 실행 권한 주고, ./main으로 실행하면


키보드 아무거나 입력하면 echo 되어 돌아온다.

댓글

이 블로그의 인기 게시물

[ BBB - yocto (9) ] 장치트리(DEVICE TREE)

[ BBB - yocto (5) ] makefile 작성법과 컴파일 자동화