본문 바로가기
IT/파이썬

CircuitPython - UART read / write 시리얼 읽고 쓰기

물론 Adafruit 페이지에 가면 가장 기본적인 읽기 정도는 나와 있다.

CircuitPython UART Serial

https://learn.adafruit.com/circuitpython-essentials/circuitpython-uart-serial

 

CircuitPython Essentials

You've already gotten started with CircuitPython. What's next? CircuitPython Essentials! This guide provides examples of all the core modules and some of the common libraries found in CircuitPython and how they're used. You'll be able to use any board desi

learn.adafruit.com

"""CircuitPython Essentials UART Serial example"""
import board
import busio
import digitalio

# For most CircuitPython boards:
led = digitalio.DigitalInOut(board.LED)
# For QT Py M0:
# led = digitalio.DigitalInOut(board.SCK)
led.direction = digitalio.Direction.OUTPUT

uart = busio.UART(board.TX, board.RX, baudrate=9600)

while True:
    data = uart.read(32)  # read up to 32 bytes
    # print(data)  # this is a bytearray type

    if data is not None:
        led.value = True

        # convert bytearray to string
        data_string = ''.join([chr(b) for b in data])
        print(data_string, end="")

        led.value = False

busio 는 circuitpython의 기본 라이브러리 이므로 따로 폴더를 가져올 필요없이 circuitpython이 동작하는 환경이면 된다.

핀을 맘 속으로 정해두고, 연결하고

busio.UART 를 호출해 주면 기본 준비는 끝. 기본적인 핀 말고 속도난 flow control 등을 설정할 수 있다.

이 예제는 데이터를 읽어서 스트링으로 출력해주는 예제, 즉 read 부분은 잘 나와 있다.

 

그럼 시리얼로 데이터를 보내고 싶다면 어떻게 하나? read 가 읽기이니 write 가 쓰기가 되겠다.

    uart.write(buffer)

이렇게 써주면 된다. 

buffer 는 바이트 배열로 선언해 주면 된다. ESP8266 AT command 를 처리하는 코드을 살펴보면 그 예를 가져다 쓸 수 있다. 

        uart.reset_input_buffer()  # flush it
        if _debug:
            print("--->", at_cmd)
        uart.write(bytes(at_cmd, "utf-8"))
        uart.write(b"\x0d\x0a")

자세한 API 함수에 대한 것은 아래 페이지를 꼭 참고하세요.

https://circuitpython.readthedocs.io/en/6.3.x/shared-bindings/busio/#busio.UART

 

busio – Hardware accelerated external bus access — Adafruit CircuitPython 6.3.0 documentation

Configures the SPI bus. The SPI object must be locked. Note On the SAMD21, it is possible to set the baudrate to 24 MHz, but that speed is not guaranteed to work. 12 MHz is the next available lower speed, and is within spec for the SAMD21. Note On the nRF5

circuitpython.readthedocs.io

읽는 예를 들어 보면, busio.UART 를 호출해야 한다고 하면 위 페이지로 가서 UART 함수 부분을 자세히 보는 것이다.

busio.UART(tx: microcontroller.Pin, rx: microcontroller.Pin, *, baudrate: int = 9600, bits: int = 8, parity: Optional[Parity] = None, stop: int = 1, timeout: float = 1, receiver_buffer_size: int = 64)

 

넘겨주는 파라메터 설명도 이렇게 자세히 되어 있다. (사실 대부분 기본값으로 쓰니깐 보통때는 잘 안보지만)

  • tx (Pin) – the pin to transmit with, or None if this UART is receive-only.
  • rx (Pin) – the pin to receive on, or None if this UART is transmit-only.
  • rts (Pin) – the pin for rts, or None if rts not in use.
  • cts (Pin) – the pin for cts, or None if cts not in use.
  • rs485_dir (Pin) – the output pin for rs485 direction setting, or None if rs485 not in use.
  • rs485_invert (bool) – rs485_dir pin active high when set. Active low otherwise.
  • baudrate (int) – the transmit and receive speed.
  • bits (int) – the number of bits per byte, 5 to 9.
  • parity (Parity) – the parity used for error checking.
  • stop (int) – the number of stop bits, 1 or 2.
  • timeout (float) – the timeout in seconds to wait for the first character and between subsequent characters when reading. Raises ValueError if timeout >100 seconds.
  • receiver_buffer_size (int) – the character length of the read buffer (0 to disable). (When a character is 9 bits the buffer will be 2 * receiver_buffer_size bytes.)

 

BJ.

 

실제 보이지도 않는 시리얼로 글자보내기나 하고 있으니 쩝!!

Pixabay 님의 사진, 출처: Pexels