class UART – çift yönlü (duplex) seri haberleşme veri yolu

UART, standart UART/USART çift yönlü (duplex) seri haberleşme protokolünü uygular. Fiziksel düzeyde 2 hattan oluşur: RX ve TX. Haberleşme birimi, 8 veya 9 bit genişliğinde olabilen bir karakterdir (bir dize karakteriyle karıştırılmamalıdır).

UART nesneleri aşağıdaki gibi oluşturulabilir ve başlatılabilir:

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 veya 9 olabilir. Parity None, 0 (çift) veya 1 (tek) olabilir. Stop 1 veya 2 olabilir.

Not: parity=None ile yalnızca 8 ve 9 bit desteklenir. Parity etkinleştirildiğinde yalnızca 7 ve 8 bit desteklenir.

Bir UART nesnesi bir stream nesnesi gibi davranır ve okuma ile yazma işlemleri standart akış (stream) yöntemleriyle yapılır:

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

Tek tek karakterler aşağıdaki gibi okunabilir/yazılabilir:

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

Okunacak bir şey olup olmadığını kontrol etmek için şunu kullanın:

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

Not: read, write vb. akış (stream) fonksiyonları MicroPython v1.3.4 sürümünde yenidir. Daha eski sürümler uart.send ve uart.recv kullanır.

Yapıcılar

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

Verilen bus üzerinde bir UART nesnesi oluşturur (bir tamsayı çevre birimi indeksi, örneğin UART3 için 3). Ek parametre verilmediğinde nesne oluşturulur ancak başlatılmaz (varsa önceki veri yolu ayarlarını korur); ek argümanlar verilirse veri yolu başlatılır. Kullanılabilir parametreler için bkz. init().

UART(3), her STM32 OpenMV Cam üzerinde aynı başlık pinlerine bağlıdır:

Sinyal

Başlık pini

TX

P4

RX

P5

Bazı kartlarda ek UART veri yolları mevcuttur:

Veri yolu

TX pini

RX pini

Mevcut olduğu kartlar

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

Yöntemler

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 veri yolunu verilen parametrelerle başlatır:

  • baudrate saat hızıdır.

  • bits karakter başına bit sayısıdır; 7, 8 veya 9.

  • parity paritedir; None, 0 (çift) veya 1 (tek).

  • stop durdurma biti sayısıdır; 1 veya 2.

  • flow akış kontrolü türünü ayarlar. 0, UART.RTS, UART.CTS veya UART.RTS | UART.CTS olabilir.

  • timeout ilk karakteri yazmak/okumak için beklenecek milisaniye cinsinden zaman aşımıdır.

  • timeout_char yazma veya okuma sırasında karakterler arasında beklenecek milisaniye cinsinden zaman aşımıdır.

  • read_buf_len okuma arabelleğinin karakter cinsinden uzunluğudur (devre dışı bırakmak için 0).

Baud hızı istenen değerin %5’i içinde ayarlanamazsa bu yöntem bir istisna fırlatır.

Not: parity=None ile yalnızca 8 ve 9 bit desteklenir. Parity etkinleştirildiğinde yalnızca 7 ve 8 bit desteklenir.

deinit() None

UART veri yolunu kapatır.

any() int

Bekleyen bayt sayısını döndürür (0 olabilir).

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

Karakter okur. nbytes belirtilirse en fazla o kadar bayt okur. nbytes arabellekte mevcutsa hemen döner; aksi takdirde yeterli karakter geldiğinde veya zaman aşımı dolduğunda döner.

nbytes verilmezse yöntem mümkün olduğunca çok veri okur. Zaman aşımı dolduktan sonra döner.

Not: 9 bitlik karakterler için her karakter iki bayt alır, nbytes çift olmalıdır ve karakter sayısı nbytes/2 olur.

Dönüş değeri: okunan baytları içeren bir bytes nesnesi. Zaman aşımında None döndürür.

readchar() int

Veri yolundan tek bir karakter alır.

Dönüş değeri: okunan karakter, bir tamsayı olarak. Zaman aşımında -1 döndürür.

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

Baytları buf içine okur. nbytes belirtilirse en fazla o kadar bayt okur. Aksi takdirde en fazla len(buf) bayt okur.

Dönüş değeri: okunan ve buf içine depolanan bayt sayısı veya zaman aşımında None.

readline() bytes | None

Yeni satır karakteriyle biten bir satır okur. Böyle bir satır varsa dönüş anında olur. Zaman aşımı dolarsa, yeni satır olup olmadığına bakılmaksızın mevcut tüm veriler döndürülür.

Dönüş değeri: okunan satır veya veri yoksa zaman aşımında None.

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

Bayt arabelleğini veri yoluna yazar. Karakterler 7 veya 8 bit genişliğindeyse her bayt bir karakterdir. Karakterler 9 bit genişliğindeyse her karakter için iki bayt kullanılır (little endian) ve buf çift sayıda bayt içermelidir.

Dönüş değeri: yazılan bayt sayısı. Zaman aşımı oluşur ve hiç bayt yazılmazsa None döndürür.

writechar(char: int) None

Veri yoluna tek bir karakter yazar. char yazılacak bir tamsayıdır. CTS akış kontrolü etkinleştirildiğinde bloklama davranışı için aşağıdaki CTS flow control bölümüne bakın.

sendbreak() None

Veri yoluna bir kesme (break) durumu gönderir. Bu, veri yolunu 13 bit süresince düşük (low) seviyeye çeker.

Sabitler

RTS: int

init() yönteminin flow argümanı için bit bayrağı; alma yolunda RTS (request-to-send) donanım akış kontrolünü etkinleştirir.

CTS: int

init() yönteminin flow argümanı için bit bayrağı; gönderme yolunda CTS (clear-to-send) donanım akış kontrolünü etkinleştirir. Her iki yönü de etkinleştirmek için RTS ile OR’lanabilir.

Akış Kontrolü

UART(3), RTS/CTS donanım akış kontrolünü destekler. OpenMV Cam M7, H7, H7 Plus ve Pure Thermal üzerinde akış kontrolü pinleri şunlardır:

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

OpenMV Cam N6 üzerinde yalnızca nRTS açığa çıkarılmıştır (P7 başlık pininde); nCTS G/Ç başlığına yönlendirilmemiştir.

Aşağıdaki paragraflarda “hedef” terimi UART’a bağlı cihazı ifade eder.

UART’ın init() yöntemi flow UART.RTS ve UART.CTS değerlerinden biri veya ikisi olarak ayarlanarak çağrıldığında, ilgili akış kontrolü pinleri yapılandırılır. nRTS aktif-düşük (active-low) bir çıkıştır ve nCTS pull-up etkinleştirilmiş aktif-düşük (active-low) bir girdidir. Akış kontrolünü bağlamak için OpenMV Cam’in nCTS pinini hedefin nRTS pinine, OpenMV Cam’in nRTS pinini ise hedefin nCTS pinine bağlayın.

CTS: hedef, OpenMV Cam vericisini kontrol eder

CTS akış kontrolü etkinleştirilirse yazma davranışı şu şekildedir:

OpenMV Cam’in UART.write(buf) yöntemi çağrılırsa, nCTS False olduğu tüm dönemlerde iletim duraklar. Tüm arabellek zaman aşımı süresi içinde iletilmezse bu bir zaman aşımına yol açar. Yöntem yazılan bayt sayısını döndürür ve böylece kullanıcı gerekirse verinin geri kalanını yazabilir. Zaman aşımı durumunda, nCTS beklenirken UART’ta bir karakter kalır. Bu karakteri oluşturan bayt sayısı dönüş değerine dahil edilir.

nCTS False iken UART.writechar() çağrılırsa, hedef zamanında nCTS öne sürmedikçe yöntem zaman aşımına uğrar. Zaman aşımına uğrarsa OSError 116 fırlatılır. Hedef nCTS öne sürer sürmez karakter iletilir.

RTS: OpenMV Cam, hedefin vericisini kontrol eder

RTS akış kontrolü etkinleştirilirse davranış şu şekildedir:

Arabellekli girdi kullanılırsa (read_buf_len > 0), gelen karakterler arabelleğe alınır. Arabellek dolarsa, gelen bir sonraki karakter nRTS değerinin False olmasına neden olur: hedef iletimi durdurmalıdır. Arabellekten karakterler okunduğunda nRTS True olur.

any() yönteminin arabellekteki bayt sayısını döndürdüğünü unutmayın. N baytlık bir arabellek uzunluğu varsayın. Arabellek dolar ve başka bir karakter gelirse, nRTS False olarak ayarlanır ve any() N sayısını döndürür. Karakterler okunduğunda ek karakter arabelleğe yerleştirilir ve sonraki bir any() çağrısının sonucuna dahil edilir.

Arabellekli girdi kullanılmazsa (read_buf_len == 0), bir karakterin gelmesi, karakter okunana kadar nRTS değerinin False olmasına neden olur.