Maix Bit(K210) 與上位機串列埠通訊

2020-10-20 14:00:31

準備工具 K210開發板
USB轉TTL串列埠 (俗稱ISP燒錄器)
串列埠助手

  其實Maix Bit 是自帶CH552 晶片的,燒錄程式使用,如果把程式碼燒錄在flash或者儲存在SD卡里面,不使用MaixPy IDE連線開發板,那麼這個TX 、RX埠就會空出來(下面圖示原理圖示注了自帶TX、TX),可以不使用USB轉TTL就可以實現串列埠通訊,如果既要連線用MaixPy IDE,又想要在串列埠助手收到資料,那麼就需要一個USB轉TTL。
附圖USB轉TTL(類似這種就可以):
在這裡插入圖片描述

  實現Maix Bit 與上位機串列埠通訊,在串列埠助手傳送訊息,Maix Bit 開發板在接收到訊息之後轉發到上位機,實現串列埠通訊。
在這裡插入圖片描述

1、K210 UART

  通用非同步收發傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱作UART,UART 模組主要用於驅動開發板上的非同步串列埠。k210 一共有3個 UART,每個 UART可以進行自由的引腳對映。

1.1 、串列埠通訊函數

  K210可以自己隨意的設定I/O口,類似FPGA,不像其它型別的微控制器串列埠是固定好的。在使用 uart 前,我們需要使用 fm 來對晶片引腳進行對映和管理。我使用引腳9和引腳10分別做為UART1_TX和UART1_RX。如果想不使用USB轉TTL,那麼把引腳修改為原理圖所示引腳即可45(這個一定要和開發板對應,不能錯),然後把程式碼燒錄到flash或者儲存到SD卡,也可以實現與上位機串列埠通訊。

fm.register(9, fm.fpioa.UART1_TX, force=True)
fm.register(10, fm.fpioa.UART1_RX, force=True)

建構函式,其實就是設定埠:

uart = machine.UART(uart,baudrate,bits,parity,stop,timeout, read_buf_len)

引數:
uart UART 號,使用指定的 UART,可以通過 machine.UART. 按tab鍵來補全
baudrate: UART 波特率
bits: UART 資料寬度,支援 5/6/7/8 (預設的 REPL 使用的串列埠(UARTHS)只支援 8 位元型樣), 預設 8
parity: 奇偶校驗位,支援 None, machine.UART.PARITY_ODD, machine.UART.PARITY_EVEN (預設的 REPL 使用的串列埠(UARTHS)只支援 None), 預設 None
stop: 停止位, 支援 1, 1.5, 2, 預設 1
timeout: 串列埠接收超時時間
read_buf_len: 串列埠接收緩衝,串列埠通過中斷來接收資料,如果緩衝滿了,將自動停止資料接收

如下是我自己構造的函數:


uart_A = UART(UART.UART1, 115200, 8, 1, 0, timeout=1000, read_buf_len=4096)

1.2 、常用函數

用於讀取串列埠緩衝中的資料

uart.read(num)

用於使用串列埠傳送資料:

uart.write(buf)

在python3中. 預設的編碼是unicode,我們的字串就是unicode。unicode弊端:在儲存和傳輸的時候是很浪費的
在儲存和傳輸的時候不能直接使用unicode。 必須要對字串進行編碼. 編碼成bytes型別(位元組形式的字串),在K210中預設是bytes型別的。解碼和編碼在物聯網通訊處理伺服器資料是很重要的。
解碼:
read_data是儲存的已經收到的資料

read_data.decode('utf-8')

編碼:

read_data.encode("utf-8")

更多串列埠通訊函數的使用:https://maixpy.sipeed.com/zh/api_reference/machine/uart.html

3、程式碼

from fpioa_manager import fm

# need your connect hardware IO 9/10 to loopback
fm.register(9, fm.fpioa.UART1_TX, force=True)
fm.register(10, fm.fpioa.UART1_RX, force=True)

from machine import UART

uart_A = UART(UART.UART1, 115200, 8, 1, 0, timeout=1000, read_buf_len=4096)

import time

time.sleep_ms(100) # wait uart ready
uart_A.write(b'hello world')

while True:
  if uart_A.any():
    while uart_A.any():
      read_data = uart_A.read()
      print("recv = ", read_data) # 輸出收到的資料
      uart_A.write(read_data+"\r")
    #break
  time.sleep_ms(10) # ohter event

uart_A.deinit()
del uart_A

4、效果展示

在這裡插入圖片描述