串口通信
一、串口分配
| 串口 | 用途 |
|---|---|
| SCI0 | uart(星闪可选模组) |
| SCI1 | 上位机协议口(485 电平)+ 调试日志 LTPrintf |
| SCI2 | 232,默认不初始化 |
星闪(WS63)是可选焊接的模组,不焊星闪时 SCI0 空闲,可作普通 uart 用。
二、上位机协议口
2.1 通信方式
User/module_select.h
UARTBUS_OPTION |
方式 |
|---|---|
| 0 | Levetop 协议从机(当前) |
| 1 | Modbus 从机 |
| 2 | Modbus 主机 |
| 3 | USB HID |
| 4 | USB VCOM |
main.c 里 UartTFT_SCI_Init(COMuart, 115200);,波特率 115200。
2.2 端口
// Function/uart.c
sci* COM_SCI = SCI1;COM_SCI 只决定发送(LT_SendData_CRC_Frame() 用它)。
接收固定 SCI1:Main_From_UartRxBuff() 只读 Rx_Buffer_long,由 SCI1_Handler() 填充。
只改 COM_SCI 会变成”SCI2 发、SCI1 收”,整体换口要连中断和缓冲一起改。
2.3 初始化要点 UartTFT_SCI_Init() — uart.c
- 8N1,无校验
- RX FIFO 使能,水印 7
- 开
RIE+ILIE(空闲)+ORIE(溢出);IDLECFG=3= 8 字符空闲判帧结束 - 波特率由
SBR+OSR经Find_SCI_Optimal_SBR()自动求解
2.4 接收链路
SCI1 中断 → Rx_Buffer_long (4098) → Main_From_UartRxBuff() → LT_ReceiveCmd()
uart.c uart.c bsp.cRDRF / OR / IDLE 三个分支都会取 FIFO。短帧够不到水印 7,靠 IDLE 收尾。
2.5 帧格式
接收帧(上位机 → MCU)
| 5A | A5 | LEN | CMD | ADDR_H | ADDR_L | LEN_H | LEN_L | DATA | CRC_L | CRC_H |
|---|
- 帧头
0x5A 0xA5(SCI_C0/SCI_C1,定义在bsp.c,上位机可改写) LEN为 0 时后面跟 2 字节扩展长度(长帧)- CRC 为 Modbus CRC16,低字节在前,范围覆盖 CMD 到 DATA
CRC_Enable_Flag(bsp.c)可关,关后收发都不带 CRC
发送帧(MCU → 上位机) LT_SendData_CRC_Frame() — uart.c
有效数据从 buf[3] 开始,buf[0..2] 留给帧头+长度,第 2 个参数是有效数据字节数。
2.6 命令与地址
| 命令 | 功能 |
|---|---|
0x03 |
读变量/寄存器 |
0x10 |
写变量/寄存器 |
0x61~0x63 |
片内 eFlash 写/读/CRC |
0x64~0x66 |
SPI Flash 写/读/CRC(0x66 供二开) |
0x41 |
MCU 主动上报 |
| 区域 | 范围 | 说明 |
|---|---|---|
| 变量区 | 0x0000~0x6FFF | 每地址 2 字节 |
| 寄存器区 | 0x7000~0x71F` | VAR_REG_S / VAR_REG_E |
常用寄存器:0x7000 页面切换、0x7001 背光(0-63)、0x7002~0x7008 RTC、0x7014 触发 var_ctrl()。
2.7 示例
写 0x7000 = 2(切到第 2 页) 5A A5 07 10 70 00 00 02 7E C2
读 0x7002 起 6 个寄存器 5A A5 07 03 70 02 00 06 5B 02三、调试串口
| 项 | 值 |
|---|---|
| 串口 | SCI1(与协议口共用) |
| 变量 / 初始化 | DebugSCI = SCI1(LT168_Config.c)/ Debug_SCI_Init() |
| 调用点 | main.c |
| 输出 | LTPrintf(),需先 LTPrintf_Init(SerialOutChar)(main.c) |
| 开关 | LT168_Config.h 的 _USE_PRINTF_ |
四、Modbus
| 项 | 值 |
|---|---|
| 开关 | UARTBUS_OPTION = 1(从机)/ 2(主机) |
| 从机地址 | MODBUS_ADDR 0xC000(uart.h) |
| 从机轮询 | LT_ModBus_REG_Cmd(),定义 bsp.c,调用在 main.c |
| 主机发送 | Uart_cmd_Send(),定义 uart.c,调用在 main.c |
| 结构体 | USART_TX_INFO(uart.h),Flag == 0xA5 才有效 |
五、示例
主动上报
uint8_t buf[2100];
buf[3] = 0x41; // 命令字
buf[4] = var_addr >> 8; buf[5] = var_addr & 0xFF;
buf[6] = value >> 8; buf[7] = value & 0xFF;
LT_SendData_CRC_Frame(buf, 5);接收(主循环)
Main_From_UartRxBuff();
if (gUsartRx.Flag)
LT_ReceiveCmd(gUsartRx.Buf);加自定义命令:bsp.c 的 LT_ReceiveCmd() 里 cmd == 0x66 分支。
发一条 AT(焊接星闪调试用)
UartTFT_SCI0_Init(115200);
char cmd[] = {'A','T','\r','\n'};
UART0_SendBytes((uint8_t *)cmd, sizeof(cmd));
UART0_PollRx(); // 数据进 wifi_rx_buf业务代码请用 WiFi_Start() + 每帧 WiFi_Task(),不要手写阻塞等待。否则ui刷新异常
作者:罗珍雪 创建时间:2026-10-20 11:58
最后编辑:罗珍雪 更新时间:2026-11-02 20:02
最后编辑:罗珍雪 更新时间:2026-11-02 20:02