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

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

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

from pyb import UART

# init with the given baudrate
uart = UART(3, 9600, timeout_char=1000)

# init with explicit parameters
uart.init(9600, bits=8, parity=None, stop=1, timeout_char=1000)

Bits는 7, 8 또는 9가 될 수 있습니다. Parity는 None, 0(짝수) 또는 1(홀수)이 될 수 있습니다. Stop은 1 또는 2가 될 수 있습니다.

참고: parity=None인 경우 8비트와 9비트만 지원됩니다. parity가 활성화된 경우 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

개별 문자는 다음과 같이 읽고 쓸 수 있습니다:

uart.readchar()     # read 1 character and returns it as an integer
uart.writechar(42)  # write 1 character

읽을 데이터가 있는지 확인하려면 다음을 사용하십시오:

uart.any()          # returns the number of characters waiting

참고: 스트림 함수 read, write 등은 MicroPython v1.3.4에서 새로 추가되었습니다. 이전 버전에서는 uart.senduart.recv를 사용합니다.

생성자

class pyb.UART(bus: int | str, *args, **kwargs)

지정된 bus(정수 형태의 주변장치 인덱스, 예: UART3의 경우 3)에 UART 객체를 생성합니다. 추가 매개변수가 없으면 객체는 생성되지만 초기화되지 않습니다(이전 버스 설정이 있다면 그대로 유지됩니다). 추가 인자가 주어지면 버스가 초기화됩니다. 사용 가능한 매개변수는 init()를 참조하십시오.

UART(3)은 모든 STM32 OpenMV Cam에서 동일한 헤더 핀에 연결되어 있습니다:

신호

헤더 핀

TX

P4

RX

P5

일부 보드에서는 추가 UART 버스를 사용할 수 있습니다:

버스

TX 핀

RX 핀

사용 가능 보드

UART(1)

P1

P0

OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal

UART(4)

P2

P3

OpenMV Cam N6

UART(7)

P14

P13

OpenMV Cam N6

메서드

init(baudrate: int, bits: int = 8, parity: int | None = None, stop: int = 1, *, timeout: int = 1000, flow: int = 0, timeout_char: int = 0, read_buf_len: int = 64) None

지정된 매개변수로 UART 버스를 초기화합니다:

  • baudrate는 클럭 레이트입니다.

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

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

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

  • flow는 흐름 제어 유형을 설정합니다. 0, UART.RTS, UART.CTS 또는 UART.RTS | UART.CTS가 될 수 있습니다.

  • timeout은 첫 번째 문자를 쓰거나 읽기 위해 대기하는 시간으로, 밀리초 단위입니다.

  • timeout_char는 쓰기나 읽기 중 문자 사이에 대기하는 시간으로, 밀리초 단위입니다.

  • read_buf_len은 읽기 버퍼의 문자 길이입니다(0으로 설정하면 비활성화).

이 메서드는 보드 레이트를 원하는 값의 5% 이내로 설정할 수 없는 경우 예외를 발생시킵니다.

참고: parity=None인 경우 8비트와 9비트만 지원됩니다. parity가 활성화된 경우 7비트와 8비트만 지원됩니다.

deinit() None

UART 버스를 끕니다.

any() int

대기 중인 바이트 수를 반환합니다(0일 수 있음).

read(nbytes: int | None = None) bytes | None

문자를 읽습니다. nbytes가 지정되면 최대 그만큼의 바이트를 읽습니다. nbytes만큼의 데이터가 버퍼에 있으면 즉시 반환하고, 그렇지 않으면 충분한 문자가 도착하거나 타임아웃이 경과할 때 반환합니다.

nbytes가 주어지지 않으면 이 메서드는 가능한 한 많은 데이터를 읽습니다. 타임아웃이 경과한 후 반환합니다.

참고: 9비트 문자의 경우 각 문자는 2바이트를 차지하므로, nbytes는 짝수여야 하며 문자 수는 nbytes/2입니다.

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

readchar() int

버스에서 단일 문자를 수신합니다.

반환 값: 읽은 문자를 정수로 반환합니다. 타임아웃 시 -1을 반환합니다.

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

buf로 바이트를 읽어들입니다. nbytes가 지정되면 최대 그만큼의 바이트를 읽습니다. 그렇지 않으면 최대 len(buf) 바이트를 읽습니다.

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

readline() bytes | None

개행 문자로 끝나는 한 줄을 읽습니다. 그러한 줄이 존재하면 즉시 반환합니다. 타임아웃이 경과하면 개행 문자가 존재하는지 여부와 관계없이 사용 가능한 모든 데이터를 반환합니다.

반환 값: 읽은 줄, 또는 사용 가능한 데이터가 없어 타임아웃이 발생한 경우 None.

write(buf: bytes | bytearray | str) int | None

바이트 버퍼를 버스에 씁니다. 문자가 7비트 또는 8비트 너비이면 각 바이트가 하나의 문자입니다. 문자가 9비트 너비이면 각 문자에 2바이트가 사용되며(리틀 엔디안), buf는 짝수 개의 바이트를 포함해야 합니다.

반환 값: 쓰인 바이트 수. 타임아웃이 발생하고 바이트가 하나도 쓰이지 않았으면 None을 반환합니다.

writechar(char: int) None

버스에 단일 문자를 씁니다. char는 쓸 정수입니다. CTS 흐름 제어가 활성화되었을 때의 블로킹 동작에 대해서는 아래의 CTS flow control 섹션을 참조하십시오.

sendbreak() None

버스에 break 조건을 전송합니다. 이는 13비트 시간 동안 버스를 로우로 구동합니다.

상수

RTS: int

init()flow 인자를 위한 비트 플래그로, 수신 경로에서 RTS(request-to-send) 하드웨어 흐름 제어를 활성화합니다.

CTS: int

init()flow 인자를 위한 비트 플래그로, 송신 경로에서 CTS(clear-to-send) 하드웨어 흐름 제어를 활성화합니다. 양방향을 모두 활성화하려면 RTS와 OR로 결합할 수 있습니다.

흐름 제어

UART(3)은 RTS/CTS 하드웨어 흐름 제어를 지원합니다. OpenMV Cam M7, H7, H7 Plus 및 Pure Thermal에서 흐름 제어 핀은 다음과 같습니다:

(TX, RX, nRTS, nCTS) = (P4, P5, P1, P2)

OpenMV Cam N6에서는 nRTS만 노출되며(헤더 핀 P7에), nCTS는 I/O 헤더로 연결되지 않습니다.

다음 단락에서 “target”이라는 용어는 UART에 연결된 장치를 가리킵니다.

UART의 init() 메서드가 flowUART.RTSUART.CTS 중 하나 또는 둘 다로 설정하여 호출되면 관련 흐름 제어 핀이 구성됩니다. nRTS는 액티브 로우 출력이고 nCTS는 풀업이 활성화된 액티브 로우 입력입니다. 흐름 제어를 연결하려면 OpenMV Cam의 nCTS를 target의 nRTS에, OpenMV Cam의 nRTS를 target의 nCTS에 연결하십시오.

CTS: target이 OpenMV Cam 송신기를 제어

CTS 흐름 제어가 활성화되면 쓰기 동작은 다음과 같습니다:

OpenMV Cam의 UART.write(buf) 메서드가 호출되면, nCTSFalse인 동안에는 전송이 멈춥니다. 이로 인해 타임아웃 기간 내에 버퍼 전체가 전송되지 않으면 타임아웃이 발생합니다. 이 메서드는 쓰인 바이트 수를 반환하므로, 사용자는 필요한 경우 나머지 데이터를 쓸 수 있습니다. 타임아웃이 발생한 경우 한 문자가 nCTS를 기다리며 UART에 남아 있게 됩니다. 이 문자를 구성하는 바이트 수는 반환 값에 포함됩니다.

nCTSFalse일 때 UART.writechar()가 호출되면, target이 제때 nCTS를 어서트하지 않는 한 이 메서드는 타임아웃됩니다. 타임아웃되면 OSError 116이 발생합니다. target이 nCTS를 어서트하면 곧바로 해당 문자가 전송됩니다.

RTS: OpenMV Cam이 target의 송신기를 제어

RTS 흐름 제어가 활성화되면 동작은 다음과 같습니다:

버퍼링된 입력이 사용되면(read_buf_len > 0) 들어오는 문자가 버퍼링됩니다. 버퍼가 가득 차면 다음에 도착하는 문자로 인해 nRTSFalse가 됩니다. target은 전송을 중단해야 합니다. 버퍼에서 문자를 읽으면 nRTSTrue가 됩니다.

any() 메서드는 버퍼에 있는 바이트 수를 반환한다는 점에 유의하십시오. 버퍼 길이가 N 바이트라고 가정합니다. 버퍼가 가득 차고 또 다른 문자가 도착하면 nRTS가 False로 설정되고 any()N을 반환합니다. 문자를 읽으면 그 추가 문자가 버퍼에 배치되며 이후의 any() 호출 결과에 포함됩니다.

버퍼링된 입력이 사용되지 않으면(read_buf_len == 0) 문자가 도착하면 해당 문자를 읽을 때까지 nRTSFalse가 됩니다.