4. UART

UART 实现了标准的 uart/usart 双工串行通信协议,在物理层上,他由两根数据线组成:RX 和 TX。通信单元是一个字符,它可以是 8 或 9 位宽。

目前K2000开放了3组串口接口,可以用于串行通信。

  • uart1 (type-c接口)

  • uart7 (RS232接口)

  • uart6 (排针端子接口)

4.1. 构建UART

from sharp_uart import *                   # 导入 uart 模块

# Uart初始化           COM1(Uart)    波特率          数据位  校验位        停止位    一次接受最大数据长度(字节)
UartDriver = SHARP_uart_init(port = 1,baudrate = 115200, bits=8, parity=None, stop=1,read_buf_len = 128)
SHARP_uart_init(port, baudrate, bits, parity, stop, read_buf_len, flow, timeout) 此方法会构造并返回一个新的uart对象,并用于后续的读写

port : 串口号 (必传参数) 串口1–1,串口6–6,串口7–7

baudrate : 波特率 (必传参数)

bits : 数据位 (必传参数)

parity : 校验位 (必传参数)

stop : 停止位 (必传参数)

read_buf_len: 接收数据长度(必传参数)

flow : 流 (可选参数)

timeout : 超时时间 (可选参数)

4.2. 串口发送

注意

由于在串口通信中都是以bytes形式传输的,所以需要注意数据编码与解码。

UartDriver.write('hello world\r\n')

# 发送中文需要先进行编码--'utf-8'  'gbk'  'gb2312',串口调试助手要调到对应编码,不然会乱码
str1 = '你好,世界!!!\r\n'.encode('gb2312')
UartDriver.write(str1)

4.3. 串口接收

# 应用层方法 获取PC端 信息并打印
# data:     接收到的字节流
# data_len: 接收到的字符串长度
# 注意:     不可接收中文信息
def uart_read(data,data_len):
    if data_len > 0:
        # 获取到的字节流 解码 为字符串
        data_decode = data.decode()
        print(data_decode, end='')

        # print(UnpackField(data,"B",0))
        # print("len = ",data_len)  #字符串长度

# 将应用层函数传递到该方法中,该方法为当配置好串口后,如果接收到PC端信息,回调信息到应用层方法
UartDriver.dev_single(uart_read)

4.4. 示例

# 调用串口模块
from sharp_uart import *

################### 串口初始化 ####################################

# Uart初始化       COM6(Uart)    波特率             数据位  校验位        停止位    一次接受最大数据长度(字节)
UartDriver = SHARP_uart_init(port = 6,baudrate = 115200, bits=8, parity=None, stop=1,read_buf_len = 128)

# RS232初始化     COM7(RS232)    波特率             数据位  校验位        停止位    一次接受最大数据长度(字节)
RS232Driver = SHARP_uart_init(port = 7,baudrate = 115200, bits=8, parity=None, stop=1,read_buf_len = 128)

# CA310/ca410 对应的RS232初始化     COM7(RS232)    波特率             数据位  校验位        停止位    一次接受最大数据长度(字节)
comDriver = SHARP_uart_init(port = 7,baudrate = 38400, bits=7, parity=PARITY_EVEN, stop=2,read_buf_len = 4096)

################### 串口发送测试 ####################################

# 串口发送测试(不可直接发送中文)
# 发送后会并打印一行数字代表字符串长度
UartDriver.write('hello world\r\n')

# 发送中文需要先进行编码--'utf-8'  'gbk'  'gb2312',串口调试助手要调到对应编码,不然会乱码
str1 = '你好,世界!!!\r\n'.encode('gb2312')
UartDriver.write(str1)

#格式化打印(同C sprintf)
str2 = '%s year: %d, moom: %d, day: %d\r\n' % ('hello world,', 2022, 4, 24)
UartDriver.write(str2)

################### 串口接收测试 ####################################

# 应用层方法 获取PC端 信息并打印
# data:     接收到的字节流
# data_len: 接收到的字符串长度
# 注意:     不可接收中文信息
def uart_read(data,data_len):
    if data_len > 0:
        # 获取到的字节流 解码 为字符串
        data_decode = data.decode()
        print(data_decode, end='')

        # print(SHARP_UnpackField(data,"B",0))
        # print("len = ",data_len)  #字符串长度

# 将应用层函数传递到该方法中,该方法为当配置好串口后,如果接收到PC端信息,回调信息到应用层方法
UartDriver.dev_single(uart_read)