串口通信

一、串口分配

串口 用途
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.c

RDRF / 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