Explorar el Código

修复把发送的数据读取回来的问题。并完善对从机上传数据的解析

ZhaoSai hace 2 meses
padre
commit
232dae35b5
Se han modificado 4 ficheros con 475 adiciones y 35 borrados
  1. 285 0
      drv_periph/LoRa_Process.lua
  2. 20 19
      drv_periph/radio.lua
  3. 167 15
      drv_periph/sx126x_driver.lua
  4. 3 1
      main.lua

+ 285 - 0
drv_periph/LoRa_Process.lua

@@ -0,0 +1,285 @@
+
+module(..., package.seeall)
+require"radio"
+require "sx126x_driver"
+
+-- --------------------- 常量定义 ---------------------
+local MASTER_ADDR = 0x00
+local MIN_SLAVE_ADDR = 0x01
+local MAX_SLAVE_ADDR = 0x05
+local QUERY_TIMEOUT_MS = 6
+
+local FRAME_HEADER1 = 0x5A
+local FRAME_HEADER2 = 0xA5
+local FRAME_TYPE_QUERY = 0x03
+local FRAME_TYPE_DATA  = 0x02
+
+
+-- --------------------- 工具函数 ---------------------
+-- CRC16 (Modbus)
+local function Modbus_CRC16(data, len)
+    local crc = 0xFFFF
+    for i = 1, len do
+        crc = bit.bxor(crc, data[i])
+        for _ = 1, 8 do
+            if bit.band(crc, 0x0001) ~= 0 then
+                crc = bit.rshift(crc,1)
+                crc = bit.bxor(crc,0xA001)
+            else
+                crc = bit.rshift(crc,1)
+            end
+        end
+    end
+    return bit.rshift(crc,8) + bit.lshift(bit.band(crc,0xFF),8)
+
+end
+
+
+-- 工具函数:将“十进制字节表”转为“十六进制字符串”(如 {0x5A, 0xA5} → "5AA5")
+local function byte_table_to_hex_str(byte_table)
+    local hex_str = ""
+    for _, byte_val in ipairs(byte_table) do
+        -- 确保每个字节转为两位十六进制(不足两位补0,如0x5 → "05")
+        hex_str = hex_str .. string.format("%02X", byte_val)
+    end
+    return hex_str
+end
+-- 将 {0x5A,0xA5} 转成 "\x5A\xA5" 这种二进制字符串
+local function byte_table_to_bin_str(byte_table)
+    local chars = {}
+    for i = 1, #byte_table do
+        chars[i] = string.char(byte_table[i])
+    end
+    return table.concat(chars)
+end
+
+-- --------------------- 发送查询帧 ---------------------
+local function send_query_frame(slave_addr)
+    log.info("Frame","发送查询帧",slave_addr)
+    local buf = {
+        FRAME_HEADER1, FRAME_HEADER2,
+        MASTER_ADDR, slave_addr,
+        FRAME_TYPE_QUERY,
+        0x00, 0x00 -- reserved
+    }
+    local crc = Modbus_CRC16(buf, #buf)
+    table.insert(buf, bit.band(crc,0xFF))    -- CRC低字节
+    table.insert(buf, bit.rshift(crc,8))     -- CRC高字节
+
+    log.info("查询帧构建完毕,长度="..#buf.."字节")
+
+    -- ✅ 转换成二进制字符串
+    local hex_buf = byte_table_to_hex_str(buf)
+    local lenHex  = string.format("%02X", #buf)
+    sx126x_driver.RadioSend(hex_buf, lenHex, "00")
+
+    -- sys.wait(200) 
+    log.info("查询帧发送完毕,配置的PayloadLength="..#buf)
+end
+
+
+
+-- -- --------------------- 解析传感器数据 ---------------------
+local function bytes_to_float(b1,b2,b3,b4)
+    local sign = bit.rshift(b4,7)
+    local expo = bit.band(bit.rshift(b4,0),0x7F) * 2 + bit.rshift(b3,7)
+    local mant = bit.lshift(bit.band(b3,0x7F),16) + bit.lshift(b2,8) + b1
+    if expo == 0 then
+        return 0.0
+    elseif expo == 255 then
+        return (mant == 0) and (sign==0 and math.huge or -math.huge) or 0/0
+    end
+    return (sign==1 and -1 or 1) * (1 + mant/0x800000) * 2^(expo-127)
+end
+
+local function print_sensor(s)
+    if s.data_type == 0x01 then
+        local t = bit.lshift(s.data[1],8) + s.data[2]
+        log.info("Sensor","温度", string.format("%.2f°C", t/100.0))
+    elseif s.data_type == 0x02 then
+        local h = bit.lshift(s.data[1],8) + s.data[2]
+        log.info("Sensor","湿度", string.format("%.2f%%", h/100.0))
+    elseif s.data_type == 0x03 then
+        log.info("Sensor","光照强度", s.data[1])
+    elseif s.data_type == 0x04 then
+        log.info("Sensor","烟雾浓度", s.data[1])
+    elseif s.data_type == 0x10 then
+        if #s.data == 4 then
+            local val = bytes_to_float(s.data[1],s.data[2],s.data[3],s.data[4])
+            log.info("Sensor","扩展类型0x10 (float)", string.format("%.4f L", val))
+        else
+            log.warn("Sensor","0x10 长度异常", #s.data)
+        end
+    else
+        log.info("Sensor","未知类型", s.data_type, "原始数据", table.concat(s.data,","))
+    end
+end
+
+
+
+
+local function parse_received_frame(hex_str)
+    log.info("Frame","收到数据", hex_str)
+
+    -- 转换 hex_str → buf
+    local buf = {}
+    for i = 1, #hex_str, 2 do
+        local hex_byte = hex_str:sub(i, i+1)
+        local dec_byte = tonumber(hex_byte, 16)
+        if not dec_byte then
+            log.error("Frame","十六进制转换失败", "非法字符:"..hex_byte)
+            return false
+        end
+        table.insert(buf, dec_byte)
+    end
+    local buf_len = #buf
+    if buf_len < 9 then
+        log.error("Frame","长度不足", buf_len)
+        return false
+    end
+
+    -- 帧头
+    if buf[1] ~= FRAME_HEADER1 or buf[2] ~= FRAME_HEADER2 then
+        log.error("Frame","帧头错误", string.format("实际=0x%02X%02X", buf[1], buf[2]))
+        return false
+    end
+
+    -- 地址与帧类型
+    local src_addr = buf[3]
+    local dst_addr = buf[4]
+    local frame_type = buf[5]
+    if dst_addr ~= MASTER_ADDR or frame_type ~= FRAME_TYPE_DATA then
+        log.error("Frame","地址/类型错误", 
+            string.format("src=0x%02X dst=0x%02X type=0x%02X", src_addr,dst_addr,frame_type))
+        return false
+    end
+
+    -- 传感器数量+数据总长
+    local sensor_count   = buf[6]
+    local data_total_len = buf[7]
+
+    -- CRC校验
+    local crc_low, crc_high = buf[buf_len-1], buf[buf_len]
+    local crc_recv = crc_low + bit.lshift(crc_high,8)
+    local crc_calc = Modbus_CRC16(buf, buf_len-2)
+    if crc_recv ~= crc_calc then
+        log.error("Frame","CRC错误", string.format("recv=0x%04X calc=0x%04X", crc_recv,crc_calc))
+        return false
+    end
+
+    log.info("Frame","地址=0x"..string.format("%02X",src_addr),
+                      "传感器数="..sensor_count,
+                      "数据长度="..data_total_len.."字节")
+
+    -- 逐个解析传感器
+    local offset = 8
+    local data_end = 8 + data_total_len - 1
+    for i = 1, sensor_count do
+        if offset + 2 > data_end then
+            log.warn("Frame","传感器头部越界", "offset="..offset)
+            break
+        end
+        local sensor = {
+            sensor_id = buf[offset],
+            data_type = buf[offset+1],
+            data_len  = buf[offset+2],
+            data = {}
+        }
+        if offset + 3 + sensor.data_len - 1 > data_end then
+            log.warn("Frame","传感器数据越界 ID=0x"..string.format("%02X",sensor.sensor_id))
+            break
+        end
+        for j = 1, sensor.data_len do
+            table.insert(sensor.data, buf[offset+2+j])
+        end
+        print_sensor(sensor)
+        offset = offset + 3 + sensor.data_len
+    end
+
+    return true
+end
+
+
+
+-- --------------------- 主机轮询 ---------------------
+function master_query_loop()
+    
+        for addr=MIN_SLAVE_ADDR, MAX_SLAVE_ADDR do
+            sx126x_driver.ReceiveData = "" 
+            log.info("Host","查询从机地址",string.format("0x%02X",addr))
+            send_query_frame(addr)
+
+            local start = os.time()
+            local response = false
+            while (os.time()-start) < QUERY_TIMEOUT_MS do
+                if sx126x_driver.dataReady() then
+                    local rx_buf = sx126x_driver.RadioGetBuffer()
+                    log.info("Host","收到从机数据", "十六进制字符串="..rx_buf)
+                    if rx_buf == "" then
+                        log.info("返回空")
+                        break
+                    end
+
+                    local slave_addr_hex = string.format("%02X", addr)  -- 把当前查询的从机地址转成两位十六进制字符串
+                    log.info("slave_addr_hex",slave_addr_hex)
+                    -- log.info("rx_buf:sub(7,8)",rx_buf:sub(7,8))
+                    -- log.info("rx_buf:sub(5,6)",rx_buf:sub(5,6))
+                    if rx_buf:sub(5,6) ~= slave_addr_hex then  
+                        log.info("从机地址不匹配")
+                        break
+                    end
+                    if rx_buf:sub(7,8) ~= "00" then
+                        log.info("主机地址不匹配")
+                        break
+                    end
+                    if parse_received_frame(rx_buf) then
+                        response = true
+                        break
+                    end
+                end
+                sys.wait(50)
+            end
+            if not response then
+                log.warn("Host",string.format("从机0x%02X无响应",addr))
+            end
+            sys.wait(5000)
+        end
+end
+
+
+sys.taskInit(function()
+
+
+    sys.wait(5000)
+
+    radio.RadioInit()
+    radio.RadioStandby()
+
+    sx126x_driver.RadioSetTxConfig(sx126x_reg.RadioModems_t.MODEM_LORA,"16",0,1,7,"01","0c","00","01","00","00","00",3000)
+    sx126x_driver.RadioSetChannel(433000000) 
+    sys.wait(2000)
+    sx126x_driver.RadioRx(0)
+    local payload = "Hehehe123456"
+    local num = 1
+    while true do
+        master_query_loop()
+
+        --  send_query_frame(0x01)
+
+
+        -- RadioStandby()
+        -- sx126x_driver.sentString("hello,My_name_is_XuXinyi\n")
+        sys.wait(1500)
+        log.info("Radio", "测试接收数据中。。。")
+     
+        -- sx126x_driver.sentString("5AA50005030000093C")
+    --     sx126x_driver.sentString(payload)
+    --  sx126x_driver.RadioRx(0)
+        -- -- -- sx126x_driver.RadioRx(0)
+        -- sx126x_driver.SX126xWakeup()
+  
+        -- payload = payload .. num
+        -- num = num + 1
+
+    end
+end)

+ 20 - 19
drv_periph/radio.lua

@@ -12,7 +12,8 @@ function RadioInit()
     sx126x_driver.SX126xSetRegulatorMode(sx126x_reg.RadioStandbyModes_t.USE_DCDC)
     sx126x_driver.SX126xSetBufferBaseAddress("00","00")
     sx126x_driver.SX126xSetTxParams( "00", sx126x_reg.RadioRampTimes_t.RADIO_RAMP_200_US )
-    sx126x_driver.SX126xSetDioIrqParams( "FF", sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_ALL, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE )
+    -- sx126x_driver.SX126xSetDioIrqParams( "FF", sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_ALL, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE )
+      sx126x_driver.SX126xSetDioIrqParams( sx126x_reg.RadioIrqMasks_t.IRQ_TX_DONE + sx126x_reg.RadioIrqMasks_t.IRQ_RX_TX_TIMEOUT, sx126x_reg.RadioIrqMasks_t.IRQ_TX_DONE + sx126x_reg.RadioIrqMasks_t.IRQ_RX_TX_TIMEOUT, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE )
 end
 
 function RadioStandby()
@@ -20,23 +21,23 @@ function RadioStandby()
 end
 
 
-sys.taskInit(function()
-    sys.wait(5000)
-    RadioInit()
-    RadioStandby()
-    sx126x_driver.RadioSetTxConfig(sx126x_reg.RadioModems_t.MODEM_LORA,"16",0,1,7,"01","0c","00","01","00","00","00",3000)
-    sx126x_driver.RadioSetChannel(433000000) 
-    sys.wait(2000)
-    sx126x_driver.RadioRx(0)
-    while true do
-        -- RadioStandby()
-        -- -- sx126x_driver.sentString("hello,My_name_is_XuXinyi\n")
-        -- log.info("Radio", "测试接收数据中。。。")
-        -- sx126x_driver.RadioRx(0)
-        sx126x_driver.SX126xWakeup()
-        sys.wait(4000)
-        -- sx126x_driver.RadioRx(0)
-    end
-end)
+-- sys.taskInit(function()
+--     sys.wait(5000)
+--     RadioInit()
+--     RadioStandby()
+--     sx126x_driver.RadioSetTxConfig(sx126x_reg.RadioModems_t.MODEM_LORA,"16",0,1,7,"01","0c","00","01","00","00","00",3000)
+--     sx126x_driver.RadioSetChannel(433000000) 
+--     sys.wait(2000)
+--     sx126x_driver.RadioRx(0)
+--     while true do
+--         -- RadioStandby()
+--         sx126x_driver.sentString("hello,My_name_is_XuXinyi\n")
+--         log.info("Radio", "测试接收数据中。。。")
+--         -- sx126x_driver.RadioRx(0)
+--         sx126x_driver.SX126xWakeup()
+--         sys.wait(4000)
+--         -- sx126x_driver.RadioRx(0)
+--     end
+-- end)
 
 

+ 167 - 15
drv_periph/sx126x_driver.lua

@@ -46,6 +46,7 @@ function setTransmitMode()
 end
 
 function setReceiveMode()
+    -- SX126xSetStandby(sx126x_reg.RadioStandbyModes_t.STDBY_RC)
     sys.wait(100)
     SX126xTXENGPIO(0)
     SX126xRXENGPIO(1)
@@ -166,7 +167,7 @@ function SX126xReadRegisters(address,size)
 
     local result = Drv_spi.drv_spi_read_write_byte(sendData,receiverDataCount)  --这里乘2的意思是,16进制是两位,但是转成字符串的形式就是4位了。
 
-    log.info("SX126xReadRegisters",result)
+    -- log.info("SX126xReadRegisters",result)
     return result
 end
 
@@ -235,22 +236,67 @@ end
 --     SX126xSetTxParams(power, sx126x_reg.RadioRampTimes_t.RADIO_RAMP_40_US)
 --     SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_TX,buf)
 -- end
-
--- TODU : 参数配置问题,好像并不影响发生。这里主要是配置中断设置的。
-function SX126xSetDioIrqParams(irqMask, dio1Mask, dio2Mask, dio3Mask )
-    local buf = {"02","01","02","01","00","00","00","00"}
-    buf[2] = irqMask
-    buf[4] = irqMask
-    local jsondata = json.encode(buf)
-    log.info("SX126xSetModulationParams.encode",jsondata)
-    SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_CFG_DIOIRQ,buf)
+-- 工具函数:16位数拆分为高字节 + 低字节
+-- 辅助函数:将16位数字拆分为高字节和低字节(返回数值)
+-- 对齐C语言逻辑:先高字节,后低字节
+local function to_2byte(num)
+    local high = bit.band(bit.rshift(num, 8), 0xFF)  -- 高8位(与C语言(irqMask >> 8) & 0xFF一致)
+    local low = bit.band(num, 0xFF)                  -- 低8位(与C语言irqMask & 0xFF一致)
+    return high, low  -- 注意:返回顺序是高字节在前,低字节在后
+end
+
+function SX126xSetDioIrqParams(irqMask, dio1Mask, dio2Mask, dio3Mask)
+    -- 1. 将输入参数转为16位数字(支持十六进制字符串或数字)
+    local function to_num(val)
+        if type(val) == "string" then
+            return tonumber(val, 16) or 0  -- 处理十六进制字符串(如"0x80"或"80")
+        end
+        return tonumber(val) or 0  -- 处理数字或无效值
+    end
+    
+    -- 2. 转换所有掩码为数字
+    irqMask = to_num(irqMask)
+    dio1Mask = to_num(dio1Mask)
+    dio2Mask = to_num(dio2Mask)
+    dio3Mask = to_num(dio3Mask)
+    
+    -- 3. 拆分16位掩码为高字节和低字节(对齐C语言逻辑:高字节在前)
+    local irq_high, irq_low = to_2byte(irqMask)
+    local dio1_high, dio1_low = to_2byte(dio1Mask)
+    local dio2_high, dio2_low = to_2byte(dio2Mask)
+    local dio3_high, dio3_low = to_2byte(dio3Mask)
+    
+    -- 4. 构建缓冲区(8字节,与C语言buf顺序完全一致)
+    -- 格式:[irq_high, irq_low, dio1_high, dio1_low, dio2_high, dio2_low, dio3_high, dio3_low]
+    local buf_num = {
+        irq_high,   irq_low,
+        dio1_high,  dio1_low,
+        dio2_high,  dio2_low,
+        dio3_high,  dio3_low
+    }
+    
+    -- 5. 将数字转为2位十六进制字符串(SPI通信要求)
+    local buf_hex = {}
+    for i, num in ipairs(buf_num) do
+        table.insert(buf_hex, string.format("%02X", num))  -- 确保2位大写十六进制(如0x0A → "0A")
+    end
+    
+    -- 6. 打印日志(验证格式是否正确)
+    log.info("SX126xSetDioIrqParams", table.concat(buf_hex, " "))
+    
+    -- 7. 发送命令(写入8字节配置)
+    SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_CFG_DIOIRQ, buf_hex)
 end
 
 
+    
+
+
 function SX126xSetStopRxTimerOnPreambleDetect(enable)
     SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_STOPRXTIMERONPREAMBLE,{enable})
 end
 
+
 function SX126xSetLoRaSymbNumTimeout(SymbNum)
     SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_LORASYMBTIMEOUT,{SymbNum})
 end
@@ -434,11 +480,24 @@ function SX126xSendPayload(payload,size,timeout)
 end
 
 function RadioSend(buffer,size,time_out) 
-    SX126xSetDioIrqParams( "01", sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_ALL, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE )--SX126xSetDioIrqParams( sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_ALL, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_ALL, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE )
+    -- setTransmitMode() 
+    -- SX126xSetDioIrqParams( sx126x_reg.RadioIrqMasks_t.IRQ_TX_DONE + sx126x_reg.RadioIrqMasks_t.IRQ_RX_TX_TIMEOUT, sx126x_reg.RadioIrqMasks_t.IRQ_TX_DONE + sx126x_reg.RadioIrqMasks_t.IRQ_RX_TX_TIMEOUT, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE )--SX126xSetDioIrqParams( sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_ALL, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_ALL, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE )
     log.info("RadioSend",buffer,size,time_out)
+        local tx_irq_mask = bit.bor(
+        sx126x_reg.RadioIrqMasks_t.IRQ_TX_DONE,
+        sx126x_reg.RadioIrqMasks_t.IRQ_RX_TX_TIMEOUT
+    )
+    SX126xSetDioIrqParams(
+        tx_irq_mask,  -- 主中断掩码
+        tx_irq_mask,  -- DIO1映射
+        sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE,
+        sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE
+    )
     SX126xCopy.PacketParams.Params.LoRa.PayloadLength = size
     SX126xSetPacketParams(SX126xCopy.PacketParams)
     SX126xSendPayload(buffer,size,time_out)
+   sys.wait(100)
+--    setReceiveMode()
 end
 
 
@@ -485,7 +544,7 @@ function RadioRx()
     pins.setup(pio.P0_27,0)
     pins.setup(pio.P0_28,1)
     -- sys.wait(1000)
-    SX126xSetDioIrqParams( "02", sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_ALL, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE )
+    SX126xSetDioIrqParams( sx126x_reg.RadioIrqMasks_t.IRQ_RX_DONE + sx126x_reg.RadioIrqMasks_t.IRQ_RX_TX_TIMEOUT, sx126x_reg.RadioIrqMasks_t.IRQ_RX_DONE + sx126x_reg.RadioIrqMasks_t.IRQ_RX_TX_TIMEOUT, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE )
     SX126xSetRx(0)
 end
 
@@ -583,25 +642,118 @@ function SX126xReadBuffer(offset, size)
 
     return all_data
 end
+ReceiveData = ""
+
+function dataReady()
+    return ReceiveData ~= ""
+end
+
+function RadioGetBuffer()
+    if ReceiveData == "" then return "" end
+    local data = ReceiveData
+    ReceiveData = ""  -- 读取后立即清空,避免重复读取
+    return data
+end
+
+local function SX126xGetIrqStatus()
+    local ret = SX126xReadCommand(sx126x_reg.RadioCommands.RADIO_GET_IRQSTATUS, 2)
+    if not ret or #ret < 4 then
+        log.error("SX126xGetIrqStatus", "无效返回", ret)
+        return 0
+    end
+
+    -- SX126x返回的是低字节在前,高字节在后
+    local lsb = tonumber(ret:sub(1,2), 16) or 0
+    local msb = tonumber(ret:sub(3,4), 16) or 0
+    
+    -- 正确的字节序:高字节在前,低字节在后
+    local irq = bit.lshift(msb, 8) + lsb
+
+    log.info("IRQ原始数据", ret, "LSB:", string.format("0x%02X", lsb), "MSB:", string.format("0x%02X", msb))
+    log.info("IRQ解析结果", string.format("0x%04X", irq))
+
+    return irq
+end
+
 
 
 sys.subscribe("LORA_CALL_BACK", function()
+    log.info("LORA_CALL_BACK")
+    --     -- 先读 IRQ 状态
+    local irq = SX126xGetIrqStatus()
+    if irq == 0 then
+        return
+    end
     RadioClearIrqStatus()
     log.info("清除中断")
     SX126xSetStandby(sx126x_reg.RadioStandbyModes_t.STDBY_RC)
     RadioRx()
 
+
+    local tx_gpio_level = pio.pin.getval(pio.P0_27)
+    local rx_gpio_level = pio.pin.getval(pio.P0_28)
+    log.info("TXENGPIO 电平", tx_gpio_level)
+    log.info("RXENGPIO 电平", rx_gpio_level)
+    -- if tx_gpio_level == 0 and rx_gpio_level == 1 then
+    --     return
+    -- end
+
+    log.info("IRQ原始HEX", ret)  -- 记得在 GetIrqStatus 里打印
+    log.info("IRQ解析结果", string.format("0x%04X", irq))
+    if irq == 0xAC then
+        return
+    end
+    --日志显示还是有点区别的。如果是oxAC就是把自己读出来了    如果是0xA4就是正常的接收
+
+    if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_TX_DONE) ~= 0 then
+        log.info("发送完成")
+    end
+    if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_RX_DONE) ~= 0 then
+        log.info("接收完成")
+    end
+    if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_RX_TX_TIMEOUT) ~= 0 then
+        log.info("接收超时")
+    end
+    if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_CRC_ERROR) ~= 0 then
+        log.info("接收CRC错误")
+    end
+    if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_CAD_DONE) ~= 0 then
+        log.info("CAD完成")
+    end
+    if bit.band(irq,sx126x_reg.RadioIrqMasks_t.IRQ_HEADER_VALID) ~= 0 then
+        log.info("头部有效")
+    end
+    if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_HEADER_ERROR) ~= 0 then
+        log.info("头部错误")
+    end
+    if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_SYNCWORD_VALID) ~= 0 then
+        log.info("同步字有效")
+    end
+    if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_PREAMBLE_DETECTED) ~= 0 then
+        log.info("前导码检测到")
+    end
+    if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_CAD_ACTIVITY_DETECTED) ~= 0 then
+        log.info("CAD活动检测到")
+    end
+
+
     local ret = SX126xReadCommand(sx126x_reg.RadioCommands.RADIO_GET_RXBUFFERSTATUS, 3)
     log.info("LORA_CALL_BACK", ret)
 
     local payloadLength = ret:sub(3, 4)
     local num1 = tonumber(payloadLength, 16)
+
     log.info("payloadLength", num1)
 
     -- 自动读取完整数据
-    local data = SX126xReadBuffer(0, num1)
-    log.info("data HEX", data)
-    log.info("data ASCII", hex_to_string(data))
+    if num1 > 0 then
+        local data = SX126xReadBuffer(0, num1)
+        num1 = 0
+        log.info("data HEX", data)
+        log.info("data ASCII", hex_to_string(data))
+        ReceiveData = ReceiveData .. data
+     
+    end
 end)
 
 

+ 3 - 1
main.lua

@@ -65,9 +65,11 @@ errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)
 --update.request()
 
 -- require "Drv_spi"
-require "radio"
+-- require "radio"
 -- require "Air530zGPS"
 
+require "LoRa_Process"
+
 
 --启动系统框架
 sys.init(0, 0)