5.K230 UART-发送和接收
# K230 UART通信-发送和接收
UART通信原理图
# 1. UART通信基础
# 1.1 什么是UART?
UART(Universal Asynchronous Receiver-Transmitter)是一种串行通信协议,它允许两个设备之间进行异步通信。在K230开发板中,UART是最常用的通信接口之一,常用于:
- 调试信息输出
- 与其他设备通信
- 传感器数据采集
- 模块间数据传输
# 1.2 UART工作原理
UART通信采用异步方式,主要特点:
- 不需要时钟信号同步
- 使用起始位和停止位标识数据帧
- 支持奇偶校验
- 可配置的数据位长度
# 1.3 K230 UART特性
K230开发板提供多个UART接口:
- UART0:默认调试串口
- UART1:可配置为普通串口
- UART2:可配置为普通串口
- UART3:可配置为普通串口
每个UART接口都支持:
- 最高1.5Mbps波特率
- 5-8位数据位
- 1-2位停止位
- 可选的奇偶校验
# 2. UART配置详解
# 2.1 引脚复用配置
K230的UART引脚需要通过FPIOA进行配置,以下是常用配置:
from machine import FPIOA
fpioa = FPIOA()
# UART0配置(调试串口)
fpioa.set_function(4, FPIOA.UART0_TXD)
fpioa.set_function(5, FPIOA.UART0_RXD)
# UART2配置(示例)
fpioa.set_function(11, FPIOA.UART2_TXD)
fpioa.set_function(12, FPIOA.UART2_RXD)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 2.2 UART参数配置
from machine import UART
# 基本配置
uart = UART(UART.UART2,
baudrate=115200, # 波特率
bits=UART.EIGHTBITS, # 数据位
parity=UART.PARITY_NONE, # 校验位
stop=UART.STOPBITS_ONE, # 停止位
timeout=1000) # 超时时间(毫秒)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 2.3 高级配置选项
# 设置接收缓冲区大小
uart.set_rx_buffer_size(1024)
# 设置发送缓冲区大小
uart.set_tx_buffer_size(1024)
# 启用流控制
uart.set_flow_control(UART.FLOW_CONTROL_RTS_CTS)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 3. 数据收发实战
# 3.1 基础数据收发
# 发送字符串
uart.write("Hello World")
# 发送字节数据
uart.write(b'\x01\x02\x03')
# 读取数据
data = uart.read()
if data:
print("Received:", data)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 3.2 高级数据收发
# 读取指定长度数据
data = uart.read(10) # 读取10个字节
# 读取直到特定字符
data = uart.read_until(b'\n') # 读取直到换行符
# 检查是否有数据可读
if uart.any():
data = uart.read()
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 3.3 数据帧处理
def send_frame(data):
# 添加帧头
frame = b'\xAA\x55' + data
# 添加校验和
checksum = sum(frame) & 0xFF
frame += bytes([checksum])
# 发送数据
uart.write(frame)
def receive_frame():
# 等待帧头
while uart.read(2) != b'\xAA\x55':
pass
# 读取数据长度
length = uart.read(1)[0]
# 读取数据
data = uart.read(length)
# 读取校验和
checksum = uart.read(1)[0]
# 验证校验和
if (sum(data) & 0xFF) == checksum:
return data
return None
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 4. 实际应用场景
# 4.1 与传感器通信
def read_sensor():
# 发送读取命令
uart.write(b'\x01\x03\x00\x00\x00\x01\x84\x0A')
# 等待响应
response = uart.read(7)
if response and len(response) == 7:
# 解析数据
value = (response[3] << 8) | response[4]
return value
return None
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 4.2 多设备通信
class UARTDevice:
def __init__(self, uart, address):
self.uart = uart
self.address = address
def send_command(self, command, data=None):
# 构建命令帧
frame = bytes([self.address, command])
if data:
frame += data
# 发送数据
self.uart.write(frame)
# 等待响应
return self.uart.read()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 4.3 调试信息输出
class DebugUART:
def __init__(self, uart):
self.uart = uart
def log(self, level, message):
timestamp = time.time()
log_msg = f"[{timestamp:.3f}] {level}: {message}\n"
self.uart.write(log_msg.encode())
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 5. 性能优化
# 5.1 缓冲区管理
# 设置合适的缓冲区大小
uart.set_rx_buffer_size(2048) # 根据实际需求调整
uart.set_tx_buffer_size(2048)
# 定期清理缓冲区
def clear_buffers():
uart.deinit()
uart.init()
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 5.2 超时处理
def read_with_timeout(timeout_ms=1000):
start_time = time.ticks_ms()
while time.ticks_diff(time.ticks_ms(), start_time) < timeout_ms:
if uart.any():
return uart.read()
time.sleep_ms(10)
return None
1
2
3
4
5
6
7
2
3
4
5
6
7
# 6. 常见问题与解决方案
# 6.1 数据丢失问题
- 原因:缓冲区溢出或波特率不匹配
- 解决方案:
- 增加缓冲区大小
- 降低波特率
- 实现流控制
# 6.2 通信不稳定
- 原因:硬件连接或电平不匹配
- 解决方案:
- 检查接线
- 添加上拉电阻
- 使用电平转换器
# 6.3 数据错误
- 原因:干扰或参数配置错误
- 解决方案:
- 添加校验机制
- 检查通信参数
- 增加重传机制
# 7. 最佳实践
通信参数配置
- 使用标准波特率(9600、115200等)
- 根据实际需求选择数据位和停止位
- 必要时启用校验位
错误处理
- 实现超时机制
- 添加数据校验
- 实现重传机制
性能优化
- 合理设置缓冲区大小
- 使用中断方式处理数据
- 实现数据帧机制
# 8. 参考资料
- K230官方技术文档
- MicroPython UART模块文档
- 串口通信协议规范
# 免责声明
本文档及所有内容(包括文字、图片、代码等)均为作者基于嘉立创庐山派K230开发板公开资料和个人使用经验整理分享,仅供学习和技术交流之用。
所有涉及的品牌名称、商标、图片及相关资源均归嘉立创官方所有,未经授权不得用于商业宣传或其他用途。
作者与嘉立创官方无任何隶属或代理关系,内容不构成任何形式的官方承诺或保证。
用户在使用相关资源时,应遵守相应的开源协议和法律法规,确保合法合规。
如涉及版权问题,请联系作者或嘉立创官方处理。
帮助我们改善此页面 (opens new window)
上次更新: 2025/07/12, 16:01:22