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--7baudrate: 波特率 (必传参数)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)