비동기 및 동기식 시리얼 통신입니다.
총 5개 채널을 사용할 수 잇습니다. 1,2,3,4.6입니다.(원래는 6번인데 우리는 5번으로 됨니다)
근데 STM32L152RE Nucleo 보드에서도 5개 다 사용할 수 있습니다. 예상했던 Pin 신호 그대로요
이중 uart 1전은 핀 신호를 바꾸어야 됩니다. ==
또는 다른보드로는 핀 신호를 안 바꾸어도 되는거로 알고 있습니다 == 기존대로 PA9, PA10
uart 2, 3, 4, 5 pin 신호는 그대로 유지해도 됩니다.
우리가 사용하는 STM32L152RE 시리즈는 UART 5개 채널 제가 생각하고 있는 핀 신호 그대로 잘 동작합니다.
그것도 UART1 핀 신호를 바꾸어야 될 수도 있습니다. 이 부분은 실험 후 알려드리도록 하겠습니다.
그러나 동시에는 안 됩니다
무조건 1채널밖에 선택이 안됩니다. 이 부분은 확실히 단점이네요....
차기버전에는 개선되길 바라며....
1. 객체생성
classmachine.UART(id, ...) == id는 uart 채널 넘버 = 지정된 id 의 UART 객체를 구축합니다.
from machine import UART
uart = UART(1, 9600) == UART1 번 채널, 9600속도
UART.init(baudrate=9600, bits=8, parity=None, stop=1, *, ...) = 주어진 파라미터로 UART 버스를 초기화합니다.
uart.init(9600, bits=8, parity=None, stop=1)
- 9600 = 전송 클럭속도
- bits = 7, 8, 9 = 기본 8 Bit = 문자당 비트 수
- stop = 1, 2 Bit = 정지 bit
- parity = None, 짝수 = 0, 홀수 = 1, 로 설정 = 만약 parity Bit를 활성화하면 Data 버스 Bit 폭은 7, 8 Bit 만 지원합니다.
- 기타 여러가지가 있는데.. 이 부분은 잘 사용 안하므로 아래 싸이트 참고하세요
machine.UART(id,baudrate=115200,bits=8,parity=None,stop=1,tx=None,rx=None)
여기서 Pin은 객체여야 합니다.
https://micropython-docs-ja.readthedocs.io/ja/latest/library/machine.UART.html
참고로 같은 객체에 대해서 init()를 통해서 여러번 호출하여 매번 uart를 다시 설정할수 있다.
이경우 하나의 UART 주변 장치가 다른 GPIO 핀에 연결된 다른 장치를 수용할 수 있다.
그러나 한 번에 하나의 장치에만 대을할 수 있다.
## UART 가 반환될 수 있는 원인 3가지
1. 시간초과 :
- 시간초과 제어 관련 메소드 : timeout =1000(1초) == 기본값 : 1000(1초)
- UART가 첫 번째 문자가 도착할때까지 기다리는 시간을 제어한다.
2. 문자간 시간초가
- 문자간 시간초과 제어 관련 메소드 : timeout_char = 최대값 = 65초, == 65535
- UART가 문자를 수신하기 시작하면 문자 사이의 시간입니다.
- 문자사이의 시간초과를 해제하는 방법은 없음
3. 원하는 양의 데이터를 읽습니다.
상기내용은 읽은 실제 문자 수를 반환합니다.
2. 메소드
가. 일기 = RX
uart.read(10) == 10자를 읽고 bytes 형 객체를 반환합니다.
uart.read() = 최대로 전부 읽기
uart.readline() = 한줄 읽기 = '\n' 까지 읽기
uart.readinto(buf) = 읽어서 주어진 Buf 메모리에 저장
나. 쓰기 = TX
uart.write('abc') == 3자 스기
uart.writechar(5 + 0x30) == 아스키 코드로 5 출력 = 정수형 형태의 인수여야 함
다. UART 종료
UART. deinit ( ) = UART 버스를 끕니다.
deinit()다음에는 해당 개체에 대해 init()호출할 수 없습니다. 이 경우 새 인스턴스를 만들어야 합니다.
라. 수신 문자열 존재여부 확인
UART. any ( )
수신 문자열이 없으면 0, 수신 문자열이 있으면 양수(1)를 리턴한다.
마. 일기
UART. read ([nbytes])
문자를 로드합니다. nbytes를 지정했을 경우는, 최대로 그 바이트수를 읽어들입니다. nbytes를 지정하지 않으면 가능한 한 많은 데이터를 읽습니다. 시간 초과로 인해 더 빨리 돌아올 수 있습니다. 타임 아웃은 생성자에서 설정할 수 있습니다. = byte 설정값은 최대값일 뿐임 = 즉 입력이 최대값 보다도 작을경우도 표시하고 넘을 경우도 표
시한다. 다만,. 수신값이 Byte 값을 넘을경우 한줄에 표시되는것은 Byte 수 까지만 표시된다.
반환값: 읽어들인 바이트열을 포함한 bytes 형 객체. 타임 아웃시는를 None돌려줍니다.
UART. readinto ( buf[, nbytes])
buf로 바이트를 읽습니다. nbytes가 지정되면 최대 바이트 수를 읽습니다. nbytes를 지정하지 않으면 최대 len(buf)바이트 수를 읽습니다. 시간 초과로 인해 더 빨리 돌아올 수 있습니다. 타임 아웃은 생성자에서 설정할 수 있습니다.
반환값: 읽어들여 buf에 격납한 바이트수. 타임 아웃시는를 None돌려줍니다.
UART. readline ( )
개행 문자로 끝나는 행을 읽습니다. 시간 초과로 인해 더 빨리 돌아올 수 있습니다. 타임 아웃은 생성자에서 설정할 수 있습니다.
반환값: 읽힌 행. 타임 아웃시는를 None돌려줍니다.
UART. write ( buf )
버퍼의 bytes 형 객체를 버스에 기입합니다.
반환값: 기입해진 바이트수. 타임 아웃시는를 None돌려줍니다.
UART. irq ( trigger , priority = 1 , handler = None , wake = machine.IDLE )
데이터가 UART에서 수신될 때 트리거되는 콜백을 만듭니다.
UART. txdone ( )
모든 데이터가 전송되었는지 또는 데이터 전송이 수행되지 않았는지 알려줍니다. 그러한 경우에 가를 True돌려줍니다. 데이터 전송이 진행 중이면 반환 False합니다.
아래링크 참고하세요
https://docs.micropython.org/en/latest/library/machine.UART.html
정적 UART의 경우 버퍼 크기를 설정하면 rxbuf 오류가 발생하지만 에 대한 read_buf_len 설정은 자동으로 무시되는 것 같습니다. 비정적 UART의 경우 및 read_buf_len 값은 rxbuf 동일하게 처리됩니다.
read_buf_len 은 인터럽트를 통해 data 수신시에 동작한다.
버퍼가 가득차면 자동으로 Data 수신을 중지한다.