Просмотр исходного кода

update: 优化xmodem库的逻辑, 兼容起始信号NAK

Wendal Chen 1 год назад
Родитель
Сommit
84f9ccb334
1 измененных файлов с 28 добавлено и 17 удалено
  1. 28 17
      script/libs/xmodem.lua

+ 28 - 17
script/libs/xmodem.lua

@@ -36,17 +36,15 @@ local DATA_SIZE_SOH =   128
 local DATA_SIZE_STX =   1024
 
 local function uart_cb(id, len)
-    local data = uart.read(id, 1)
-    -- log.info("uart读取到数据:", data:toHex())
+    local data = uart.read(id, 1024)
+    if #data == 0 then
+        return
+    end
+    log.info("xmodem", "uart读取到数据:", data:toHex())
     data = data:byte(1)
     sys.publish("xmodem", data)
 end
 
-function xmodem.close(uart_id)
-    uart.on(uart_id, "receive")
-    uart.close(uart_id)
-end
-
 --[[
 xmodem 发送文件
 @api xmodem.send(uart_id, uart_br, file_path,type)
@@ -59,7 +57,7 @@ xmodem 发送文件
 xmodem.send(2,115200,"/luadb/test.bin")
 ]]
 
-function xmodem.send(uart_id, uart_br, file_path,type)
+function xmodem.send(uart_id, uart_br, file_path, type)
     local ret, flen, cnt, crc
 
     if type then
@@ -77,13 +75,13 @@ function xmodem.send(uart_id, uart_br, file_path,type)
     if fd then
         uart.setup(uart_id,uart_br)
         uart.on(uart_id, "receive", uart_cb)
-        local result, data = sys.waitUntil("xmodem", 120000)
-        if result and data == CRC_CHR then
+        local result, data = sys.waitUntil("xmodem", 12000)
+        if result and (data == CRC_CHR or data == NAK) then
             cnt = 1
             while true do
                 data_buff:set(0, CTRLZ)
                 ret, flen = fd:fill(data_buff,0,DATA_SIZE)
-                log.info("发送第", cnt, "包")
+                log.info("xmodem", "发送第", cnt, "包")
                 if flen > 0 then
                     data_buff:seek(0)
                     crc = crypto.crc16("XMODEM",data_buff)
@@ -96,7 +94,7 @@ function xmodem.send(uart_id, uart_br, file_path,type)
                     xmodem_buff[1027] = crc>>8
                     xmodem_buff[1028] = crc&0xff
                     xmodem_buff:seek(XMODEM_SIZE)
-                    log.info(xmodem_buff:used())
+                    -- log.info(xmodem_buff:used())
                     :: RESEND ::
                     uart.tx(uart_id, xmodem_buff)
                     result, data = sys.waitUntil("xmodem", 10000)
@@ -105,15 +103,15 @@ function xmodem.send(uart_id, uart_br, file_path,type)
                     elseif result and data == NAK then
                         goto RESEND
                     else
-                        log.info("发送失败")
+                        log.info("xmodem", "发送失败")
                         return false
                     end
                     if flen ~= DATA_SIZE then
-                        log.info("文件到头了")
+                        log.info("xmodem", "文件到头了")
                         break
                     end
                 else
-                    log.info("文件到头了")
+                    log.info("xmodem", "文件到头了")
                     break
                 end
             end
@@ -121,13 +119,26 @@ function xmodem.send(uart_id, uart_br, file_path,type)
             fd:close()
             return true
         else
-            log.info("不支持",data) 
+            log.info("xmodem", "不支持的起始数据包",data)
             return false
         end
     else
-        log.info("no file") 
+        log.info("xmodem", "待传输的文件不存在")
         return false
     end
 end
 
+--[[
+关闭xmodem
+@api xmodem.close(uart_id)
+@number uart_id uart端口号
+@usage
+-- 执行xmodem传输后, 无论是否传输成功, 都建议关闭xmodem上下文, 也会关闭uart
+xmodem.close(2)
+]]
+function xmodem.close(uart_id)
+    uart.on(uart_id, "receive")
+    uart.close(uart_id)
+end
+
 return xmodem