class UART – 양방향 직렬 통신 버스

UART은 표준 UART/USART 양방향 직렬 통신 프로토콜을 구현합니다. 물리 계층에서는 RX와 TX 두 개의 라인으로 구성됩니다. 통신 단위는 문자(string의 문자와 혼동하지 마십시오)이며, 폭은 8비트 또는 9비트일 수 있습니다.

UART 객체는 다음과 같이 생성하고 초기화할 수 있습니다:

from machine import UART

uart = UART(3, 9600)                         # init with given baudrate
uart.init(9600, bits=8, parity=None, stop=1) # init with given parameters

Bits는 7, 8 또는 9일 수 있습니다. Stop은 1 또는 2일 수 있습니다. parity=None인 경우 8비트와 9비트만 지원됩니다. 패리티를 활성화하면 7비트와 8비트만 지원됩니다.

UART 객체는 stream 객체처럼 동작하며, 읽기와 쓰기는 표준 스트림 메서드를 사용하여 수행됩니다:

uart.read(10)       # read 10 characters, returns a bytes object
uart.read()         # read all available characters
uart.readline()     # read a line
uart.readinto(buf)  # read and store into the given buffer
uart.write('abc')   # write the 3 characters

생성자

class machine.UART(id: int, baudrate: int = 9600, bits: int = 8, parity: int | None = None, stop: int = 1, *, tx: Pin | None = None, rx: Pin | None = None, rts: Pin | None = None, cts: Pin | None = None, txbuf: int | None = None, rxbuf: int | None = None, timeout: int | None = None, timeout_char: int | None = None, invert: int = 0, flow: int = 0)

주어진 id로 UART 객체를 생성합니다.

메서드

init(baudrate: int = 9600, bits: int = 8, parity: int | None = None, stop: int = 1, *, tx: Pin | None = None, rx: Pin | None = None, rts: Pin | None = None, cts: Pin | None = None, txbuf: int | None = None, rxbuf: int | None = None, timeout: int | None = None, timeout_char: int | None = None, invert: int = 0, flow: int = 0) None

주어진 매개변수로 UART 버스를 초기화합니다:

  • baudrate는 클럭 속도입니다.

  • bits는 문자당 비트 수로, 7, 8 또는 9입니다.

  • parity는 패리티로, None, 0(짝수) 또는 1(홀수)입니다.

  • stop은 정지 비트 수로, 1 또는 2입니다.

포트에서 지원할 수 있는 추가 키워드 전용 매개변수는 다음과 같습니다:

  • tx는 사용할 TX 핀을 지정합니다.

  • rx는 사용할 RX 핀을 지정합니다.

  • rts는 하드웨어 수신 흐름 제어에 사용할 RTS(출력) 핀을 지정합니다.

  • cts는 하드웨어 송신 흐름 제어에 사용할 CTS(입력) 핀을 지정합니다.

  • txbuf는 TX 버퍼의 길이를 문자 단위로 지정합니다.

  • rxbuf는 RX 버퍼의 길이를 문자 단위로 지정합니다.

  • timeout은 첫 번째 문자를 기다릴 시간을 (ms 단위로) 지정합니다.

  • timeout_char는 문자 사이에 기다릴 시간을 (ms 단위로) 지정합니다.

  • invert는 반전할 라인을 지정합니다.

    • 0은 라인을 반전하지 않습니다(두 라인의 유휴 상태는 모두 논리 하이입니다).

    • UART.INV_TX는 TX 라인을 반전합니다(이제 TX 라인의 유휴 상태는 논리 로우입니다).

    • UART.INV_RX는 RX 라인을 반전합니다(이제 RX 라인의 유휴 상태는 논리 로우입니다).

    • UART.INV_TX | UART.INV_RX는 두 라인을 모두 반전합니다(유휴 상태가 논리 로우).

  • flow는 사용할 하드웨어 흐름 제어 신호를 지정합니다. 값은 비트마스크입니다.

    • 0은 하드웨어 흐름 제어 신호를 무시합니다.

    • UART.RTS는 RTS 출력 핀을 사용하여 수신 FIFO에 더 많은 데이터를 받아들일 충분한 공간이 있는지 신호함으로써 수신 흐름 제어를 활성화합니다.

    • UART.CTS는 CTS 입력 핀이 수신기의 버퍼 공간이 부족하다는 신호를 보낼 때 송신을 일시 중지함으로써 송신 흐름 제어를 활성화합니다.

    • UART.RTS | UART.CTS는 둘 다 활성화하여 완전한 하드웨어 흐름 제어를 수행합니다.

참고

동일한 객체에서 init()을 여러 번 호출하여 UART를 즉석에서 재구성할 수 있습니다. 이를 통해 단일 UART 주변장치를 사용하여 서로 다른 GPIO 핀에 연결된 여러 장치를 서비스할 수 있습니다. 이 경우 한 번에 하나의 장치만 서비스할 수 있습니다. 또한 deinit()을 호출하면 init()을 다시 호출할 수 없게 되므로 호출하지 마십시오.

deinit() None

UART 버스를 끕니다.

참고

deinit() 이후에는 해당 객체에서 init()을 호출할 수 없습니다. 이 경우 새 인스턴스를 생성해야 합니다.

any() int

블로킹 없이 읽을 수 있는 문자 수를 세어 정수로 반환합니다. 사용 가능한 문자가 없으면 0을, 문자가 있으면 양수를 반환합니다. 이 메서드는 읽을 수 있는 문자가 두 개 이상 있더라도 1을 반환할 수 있습니다.

사용 가능한 문자를 보다 정교하게 조회하려면 select.poll을 사용하십시오:

poll = select.poll()
poll.register(uart, select.POLLIN)
poll.poll(timeout)
read(nbytes: int | None = None, /) bytes | None

문자를 읽습니다. nbytes를 지정하면 최대 그만큼의 바이트를 읽고, 그렇지 않으면 가능한 한 많은 데이터를 읽습니다. 타임아웃에 도달하면 더 일찍 반환될 수 있습니다. 타임아웃은 생성자에서 구성할 수 있습니다.

반환 값: 읽어 들인 바이트를 포함하는 bytes 객체. 타임아웃 시 None을 반환합니다.

readinto(buf: bytearray, nbytes: int | None = None, /) int | None

바이트를 buf로 읽어 들입니다. nbytes를 지정하면 최대 그만큼의 바이트를 읽습니다. 그렇지 않으면 최대 len(buf) 바이트를 읽습니다. 타임아웃에 도달하면 더 일찍 반환될 수 있습니다. 타임아웃은 생성자에서 구성할 수 있습니다.

반환 값: buf에 읽어 저장된 바이트 수, 또는 타임아웃 시 None.

readline() bytes | None

개행 문자로 끝나는 한 줄을 읽습니다. 타임아웃에 도달하면 더 일찍 반환될 수 있습니다. 타임아웃은 생성자에서 구성할 수 있습니다.

반환 값: 읽은 줄, 또는 타임아웃 시 None.

write(buf: bytes) int | None

바이트 버퍼를 버스에 씁니다.

반환 값: 쓰여진 바이트 수, 또는 타임아웃 시 None.

sendbreak() None

버스에 브레이크 조건을 전송합니다 – 한 문자 시간보다 더 길게 TX를 로우로 구동합니다. STM32와 mimxrt에서 사용할 수 있으며, alif에서는 노출되지 않습니다.

readchar() int

UART에서 단일 문자를 읽어 정수로 반환합니다(타임아웃 시 -1). bytes 객체가 할당되지 않으므로 read(1)보다 오버헤드가 적습니다. STM32 전용.

writechar(char: int) None

단일 문자 char(0255 범위의 정수)를 UART에 씁니다. 단일 바이트 전송 시 write()보다 오버헤드가 적습니다. STM32 전용.

flush() None

현재 송신 버퍼에 있는 모든 바이트가 TX로 클럭 아웃될 때까지 블로킹합니다. 타임아웃 시 OSError를 발생시킵니다. 타임아웃은 TX 버퍼 크기와 구성된 보드 레이트에서 도출되므로, 흐름 제어가 활성화되어 수신기가 멈추지 않는 한 이 호출은 타임아웃 전에 충분히 반환됩니다.

txdone() bool

진행 중인 송신이 없을 때(TX 버퍼가 비어 있고 시프트 레지스터가 비워졌을 때) True를, 그렇지 않으면 False를 반환합니다. flush()의 논블로킹 대안으로 유용합니다.

irq(handler: Callable[[UART], None] | None = None, trigger: int = 0, hard: bool = False) None

UART 이벤트 발생 시 실행할 콜백을 설치합니다.

handler는 호출할 함수입니다. 이 함수는 UART 인스턴스를 유일한 인수로 받습니다. 이전에 설치된 핸들러를 제거하려면 None을 전달하십시오.

trigger는 어떤 이벤트가 콜백을 발생시킬지 선택하는 하나 이상의 IRQ_* 상수(아래 Constants 참조)의 비트마스크입니다.

hard=True는 하드 인터럽트 핸들러를 등록합니다(지연 시간이 더 낮지만 핸들러는 메모리를 할당해서는 안 됩니다). 기본값은 스케줄된 콜백입니다.

irq 객체를 반환합니다.

모든 IRQ 소스가 모든 포트에서 사용 가능한 것은 아닙니다 – 포트별 사용 가능 여부는 개별 IRQ_* 상수를 참조하십시오.

상수

RTS: int

수신 측에서 RTS 하드웨어 흐름 제어를 활성화하려면 flow에 전달하십시오. 둘 다 활성화하려면 OR을 통해 CTS와 조합하십시오.

CTS: int

송신 측에서 CTS 하드웨어 흐름 제어를 활성화하려면 flow에 전달하십시오.

IRQ_RXIDLE: int

irq() 트리거 플래그: 하나 이상의 문자가 수신된 후 RX 라인이 유휴 상태가 되면 한 번 발생합니다. 모든 OpenMV 포트에서 사용할 수 있습니다.

IRQ_RX: int

irq() 트리거 플래그: 문자가 수신될 때마다 발생합니다. STM32와 alif에서 사용할 수 있습니다.

IRQ_TXIDLE: int

irq() 트리거 플래그: 송신의 마지막 문자가 클럭 아웃되었을 때 발생합니다. mimxrt와 alif에서 사용할 수 있습니다.

IRQ_BREAK: int

irq() 트리거 플래그: RX에서 브레이크 조건이 감지되면 발생합니다. 어떤 OpenMV 포트에서도 사용할 수 없습니다.