--[[ @module uart1_adc @summary UART1接收MCU发送的ADC数据(对齐新C结构体协议) @usage 处理粘包分包、协议解析、CRC校验 ]] local uartid = 1 local uart_send = {} local rdbuf = "" -- ===================== 【新版协议常量】 ===================== local FRAME_HEAD = "\xFE\xFE" local FRAME_HEAD_LEN = 12 -- 帧头长度不变 local CHECK_FIELD_LEN = 2 -- CRC 2字节 local DEVICE_TYPE = 0x9102 -- 【关键】ADC 数据长度:500点 uint16 = 1000字节 local ADC_POINT_CNT = 500 local ADC_DATA_LEN = ADC_POINT_CNT * 2 -- 1000 字节 -- 【关键】完整 adc_data_up_t 结构体总长度(必须和C语言一致) local ADC_STRUCT_LEN = 2 + 4 + 4 + 4 + 2 + 2 + 2 + 1 + 2 + (ADC_POINT_CNT * 2) -- 计算结果 = 1023 字节 -- ===================== 帧头解析(完全不变) ===================== local function head_paser(data) local netHeader = {pro_ver=0,msg_id=0,msg_type1=0,msg_type2=0,msg_len=0} local nextpos = 1 if #data < FRAME_HEAD_LEN then return false,nil end nextpos, netHeader.head = pack.unpack(data, " 0 then -- local data_str = rxbuff:toStr(1, rx_len) -- proc(data_str) -- log.info("uart", "receive", rx_len) -- end -- end -- 全局偏移量(不变) _G.Y_FULL_SCALE = 5 _G.x_offset = 0 _G.y_offset = 0 -- ===================== 【核心:新版结构体数据解析】 ===================== sys.subscribe("UART1_ADC_RECIVE", function(full_frame) if not full_frame or #full_frame == 0 then return end local head_ok, netHeader = head_paser(full_frame) if not head_ok then return end -- 1. 拆分:帧头 + 结构体数据(info) + CRC local total_frame_len = FRAME_HEAD_LEN + netHeader.msg_len local struct_data = string.sub(full_frame, FRAME_HEAD_LEN + 1, FRAME_HEAD_LEN + ADC_STRUCT_LEN) local recv_crc_str = string.sub(full_frame, total_frame_len - 1, total_frame_len) local crc_calc_data = string.sub(full_frame, 1, total_frame_len - CHECK_FIELD_LEN) -- 2. CRC 校验 local _, recv_crc = pack.unpack(recv_crc_str, "