中文字幕天堂手机版-欧美一区二区色大片在线观看-丰满人妻视频一区二区三区-美女视频黄的免费的91

您的位置:首頁(yè)   >  關(guān)于我們  >  新聞動(dòng)態(tài)

大彩串口屏M系列OTA升級(jí)

發(fā)布人:大彩科技發(fā)布日期:2021-01-12

串口升級(jí)ota.bin演示(升級(jí)后,屏幕顯示彩色圓圈)


一、適用范圍


本文檔適合大彩醫(yī)用級(jí)的串口屏產(chǎn)品使用。




二、開發(fā)環(huán)境版本


1. VisualTFT軟件版本:V3.0.1.1137及以上的版本。

版本查看:

1) 打開VisualTFT軟件啟動(dòng)頁(yè)面如圖2-1軟件版本,右上角會(huì)顯示的軟件版本號(hào);

圖片

圖2-1軟件版本


2) 打開VisualTFT,在軟件右下角可以查看軟件版本圖2-2軟件版本,最新版本可登錄http://gc086.com/進(jìn)行下載。

圖片

2-2軟件版本


2. 串口屏硬件版本: M系列固件 >= V6.3.319.00。

版本查看:

1) 查看屏幕背面版本號(hào)貼紙;

2) VisualTFT與屏幕聯(lián)機(jī)成功后,右下角顯示的版本號(hào)。




、概述


本文介紹VisualTFT PC軟件編譯生成的‘ota.bin’工程文件,用戶通過(guò)MCU用串口對(duì)屏幕升級(jí)的說(shuō)明。相比之前的 對(duì)‘private’ 文件升級(jí),區(qū)別如下所示:
文件數(shù)量:private’是一個(gè)文件夾,里面含有多個(gè)文件;‘ota.bin’是一個(gè)文件
升級(jí)協(xié)議:private’升級(jí)的協(xié)議是固定,可參考http://gc086.com/uploads/file/; ‘ota.bin’升級(jí)協(xié)議不限制,可自定義幀內(nèi)容。

數(shù)據(jù)交互:private’指令交互由固件處理;‘ota.bin’由lua腳本處理。




、參考資料


1



《LUA 腳本API V1.4》可通過(guò)以下鏈接下載物聯(lián)型開發(fā)包獲取:

http:/gc086.com/index.php?s=/List/index/cid/19.html

2



《LUA基礎(chǔ)學(xué)習(xí)》可通過(guò)以下鏈接下載物聯(lián)型開發(fā)包獲取:

http:/gc086.com/index.php?s=/List/index/cid/19.html

3



LUA腳本初學(xué)者可以通過(guò)下面鏈接進(jìn)行學(xué)習(xí)。

http://www.runoob.com/lua/lua-arrays.html

4



AT指令,可以通過(guò)下面鏈接了解

http://www.openluat.com/




五、教程實(shí)現(xiàn)


本例程通過(guò)大彩協(xié)議自定義指令和用戶主板通訊,指令格式為 EE B6 … FF FC FF FF,且將OTA升級(jí)部分代碼封裝成‘ota.lua’文件。若用戶采用的是自由串口協(xié)議,可參考本例程的方法實(shí)現(xiàn)。







5.1 創(chuàng)建虛擬串口

在實(shí)現(xiàn)例程前需要作以下3個(gè)準(zhǔn)備:

1. 硬件平臺(tái);

2. 軟件平臺(tái);

3. UI素材。

該例程使用大彩物聯(lián)型7寸串口屏DC80480M070_1111_0C為驗(yàn)證開發(fā)平臺(tái)。如圖5-1所示;

圖片

5-1  M系列7寸串口屏

其他尺寸M型的串口屏均可借鑒此教程。

 

5.1.1 軟件平臺(tái)

使用大彩自主研發(fā)的上位機(jī)軟件VisualTFT配置工程,登錄http://gc086.com/下載。如圖5-2所示;

圖片

圖5-2  下載軟件







5.2 配置串口屏工程

工程配置主要介紹以下6點(diǎn):

(1) OTA文件生成

(2) 畫面配置

(3) LUA API介紹

(4) 串口升級(jí)OTA流程圖

(5) LUA 串口升級(jí)源碼

(6) LUA SD卡升級(jí)源碼

 

5.2.1 OTA文件生成

在 VisualTFT軟件菜單欄點(diǎn)擊圖片 ,將彈出【量產(chǎn)下載】彈窗界面,如圖5-3所示:

圖片

圖5-3  量產(chǎn)下載

 

點(diǎn)擊【OTA升級(jí)包…】,打包生產(chǎn)ota.bin文件,如圖5-4所示

圖片

圖5-4  OTA文件生成

注意:

OTA文件可以指定或全部文件打包升級(jí),相關(guān)下載項(xiàng)說(shuō)明如下所示:


  • 圖片資源:gif、iocn、圖片等。增加、修改、刪除圖片 UI,應(yīng)勾選此項(xiàng)。
  • 觸碰配置:控件、lua、工程相設(shè)置參數(shù)。增加控件(非圖片)、修改、刪除等,應(yīng)勾選該項(xiàng)。
  • 下載字庫(kù)資源:增加、刪除、修改字庫(kù)樣式或增加一個(gè)字體大小等,應(yīng)勾選該項(xiàng)。
  • 下載音頻文件:增加、刪除、修改音頻文件等,應(yīng)該勾選此項(xiàng)。
  • 下載音頻文件:增加、刪除、修改視頻文件等,應(yīng)該勾選此項(xiàng)。
  • 下載音頻文件:增加、刪除、修改系統(tǒng)鍵盤等,應(yīng)該勾選此項(xiàng)。


即用戶修改對(duì)應(yīng)下載項(xiàng)后,打包內(nèi)容可選擇為“指定文件”。

 

5.2.2 畫面配置

本例程,只配置下載部分的畫面及控件,在主頁(yè)面(畫面ID0)中,添加以下控件:


  • 控件ID88 :文本控件,顯示下載信息。本例程中顯示下載進(jìn)度、解壓進(jìn)度。
  • 控件ID188:進(jìn)度條控件,顯示下載信息。本例程中顯示下載進(jìn)度、解壓進(jìn)度。


本例程中,屏幕初上電始化后,在LUA腳本設(shè)置文本控件、進(jìn)度條控件隱藏。當(dāng)用戶單片機(jī)發(fā)送開始升級(jí)指令時(shí),顯示出控件ID88、ID188。如圖5-5所示:

圖片

圖5-5  畫面配置

 

5.2.3 LUA API介紹

本例程中,OTA升級(jí)相關(guān)API如下:

1. ota_init(md5, filesize, addr)

設(shè)置OTA寫入?yún)?shù)


  • md5:字符串,固定為‘0123456789abcdef’
  • filesize:ota.bin文件的大小,單位:byte
  • addr:固定為0x800000(16進(jìn)制)


如ota.bin文件大小為17542byte,則ota_init(‘0123456789abcdef’, 17542, 0x800000)。

 

2. ota_write(writeTb)

OTA寫入,用戶調(diào)用ota_write(writeTb),將writeTb數(shù)據(jù)寫入到0x800000地址。


  • writeTb:寫入字節(jié)數(shù)據(jù),寫入大小為2048 byte,不足2048byte補(bǔ)零。寫入該地址的數(shù)據(jù)掉電后不清除。


 

3. ota_check_upgrade(state)

ota.bin文件校驗(yàn)、解壓。當(dāng)用戶將ota.bin文件傳輸完畢后,調(diào)用ota_check_upgrade(state)對(duì)ota.bin進(jìn)行先校驗(yàn)在解壓,解壓成功后即已經(jīng)升級(jí)完成,屏幕自動(dòng)重啟。

  • state:1,進(jìn)入升級(jí)狀態(tài)。

 

4. ota_destroy()

清除OTA數(shù)據(jù):對(duì)0x800000地址寫入的數(shù)據(jù)清除。

 

5. on_ota_progress(status,value)

OTA校驗(yàn)、解壓回調(diào)。當(dāng)用戶ota_check_upgrade(state)函數(shù)后,會(huì)自動(dòng)回到該API。


  • status:狀態(tài)。1-校驗(yàn)過(guò)程,2-校驗(yàn)結(jié)果,3-解壓過(guò)程,4解壓結(jié)果
  • value:處理結(jié)果。


當(dāng)state = 1,value 固定為0
當(dāng)state = 2,0-校驗(yàn)失敗,1-校驗(yàn)成功
當(dāng)state = 3,0-~100,解壓進(jìn)度
當(dāng)state = 4,0-解壓失敗,1-解壓成功

 

5.2.4 串口升級(jí)OTA流程圖

M系列串口屏需要使用 ota.bin 文件進(jìn)行升級(jí),ota.bin 生成方式參考OTA文件生成章節(jié)。詳細(xì)指令可參考附錄A。升級(jí)流程如圖5-6所示:

圖片

圖5-6  OTA流程


5.2.5 LUA 串口升級(jí)源碼

1. 初始化加載

本例程中,采用大彩協(xié)議自定義指令實(shí)現(xiàn)(EE B6 … FF FC FF FF),且OTA實(shí)現(xiàn)已封裝在‘ota.lua’中。用戶需要在‘main.lua’處理以下關(guān)鍵點(diǎn):


  • 全局變量:修改升級(jí)頁(yè)面對(duì)應(yīng)的畫面ID


 注意:ota.lua文件里面也需要更改畫面ID以及控件ID


  • 初始化:加載ota.lua文件
  • 初始化:初始化隱藏ota 升級(jí)的進(jìn)度
  • 串口回調(diào):判斷是否是B6指令


 

代碼如程序清單 1所示。

程序清單 1  main.lua初始化

--------------------------------------------------------------------------
-------------------------screen id define strat----------------------------
--------------------------------------------------------------------------
--screen id variant: define rule 'sc_' + name

sc_Lock = 0                   --升級(jí)畫面的ID
--------------------------------------------------------------------------
--------------------------- screen id define end ---------------------------
--------------------------------------------------------------------------

function on_init()
    
    dofile('ota.lua')  --加載ota.lua文件
    my_assecc_ota(0)   --隱藏ota升級(jí)進(jìn)度
end

function on_uart_recv_data(packet)
    
    collectgarbage("collect")
    local isOTA = packet[1]
    
    print('> funcode = '..string.format('%02X', packet[2])) 
    
    if isOTA == 0xB6
    then
        ota_operating(packet)  --ota處理流程
    end
end

▲下滑查看



2.開始下載

當(dāng)屏幕接收到用戶主板發(fā)送開始下載指令(EE B6 Len 88 11 baudrate filesize down_name FF FC FF FF),先判斷文件大小和文件名稱是否合法,在顯示下載進(jìn)度部分的控件→響應(yīng)主板→OTA_INIT(先清除備份區(qū),在初始化) →提升波特率。代碼如程序清單 1所示。

程序清單 2  開始下載

--uart ota transmission operation
function ota_operating(packet)

    local datalen = (packet[2] << 8) | packet[3]
    local funcode = packet[4] 
    local cur_screen = get_current_screen()
    
    if funcode == ota_code
    then
        local child_code = packet[5]
        local down_name  = ''
            
        if child_code == _start_down
        then
            baudrate = uart_get_baudrate()
            
            local baudrateTemp = 115200
            
            baudrateTemp = (packet[6] << 24) | 
                              (packet[7] << 16) | 
                              (packet[8] <<  8) |
                              (packet[9] <<  0)

            filesize = (packet[10] << 24) | 
                         (packet[11] << 16) | 
                         (packet[12] <<  8) |
                         (packet[13] <<  0)
                    
            for i = 14, (#(packet) - 4)
            do
                down_name = down_name..string.char(packet[i])
            end
          
            if down_name == filename and filesize > 0
            then
                my_assecc_ota(1)
                down_state = 1
                change_screen(sc_Lock)
                
                my_uartsend_ota(child_code, ota_suc)
                
                if en_ota_SD == 1
                then
                    ......
                else
                    pre_sn         = -1
                    ota_cnt        = 0
                    ota_writeTb    = {}
                    ota_writeByte  = 0
                    TransferSize   = 0
                    set_value(sc_Lock,  88, 0)
                            set_text(sc_Lock,
                                       188,
                                       'Downloading : 0 %   
                                       [ '..math.ceil(TransferSize)..' byte / '..
                                        math.ceil(filesize)..' byte ]')
                    ota_destroy() 
                    ota_addr = ota_init('0123456789abcdef', filesize, 0x800000)
                end        
                uart_set_baudrate(baudrateTemp)
            else
                my_uartsend_ota(child_code, ota_nodown)
            end
        ......
        end
    end
end

▲下滑查看


3. 數(shù)據(jù)包

當(dāng)屏幕接收到用戶主板發(fā)送的數(shù)據(jù)指令(EE B6 Len 88 22 sn packet checksum FF FC FF FF),先判斷數(shù)據(jù)包長(zhǎng)度和大小、sn、校驗(yàn)碼等是否合法。在傳輸累計(jì)2048字節(jié)后(傳輸4次,每次512字節(jié))則調(diào)用ota_write(ota_writeTb)寫到0x800000地址。若最后一次寫入的數(shù)據(jù)累計(jì)后不足2048字節(jié),屏幕自動(dòng)補(bǔ)零寫入。代碼如程序清單 3所示。

程序清單 3  ota寫入

--uart ota transmission operation
function ota_operating(packet)

    local datalen = (packet[2] << 8) | packet[3]
    local funcode = packet[4] 
    local cur_screen = get_current_screen()
    
    if funcode == ota_code
    then
    --EE B6 LEN(2BYTE) 88 11 FILESIZE(4byte) FILENAME FF FC FF FF
        local child_code = packet[5]
        local down_name  = ''

        if child_code == _start_down
        then
           ......
      
        elseif child_code == _dwoning
        then
        --EE B6 LEN(2BYTE) 88 22 01 00 00 11 11 check_H check_L FF FC FF FF
            local sn = packet[6]
            if pre_sn == 255
            then
                pre_sn = -1
            end
            print(' > pre_sn = '..pre_sn..' / sn = '..sn)

            if pre_sn + 1 == sn
            then
                local packsize = #(packet) - 13 + 1
                if packsize > 0 and packsize <= otaUartPacketSize
                then
                    if ((packsize + 13) == (#(packet) + 1)) and 
                        (((#(packet) + 1) - 13) > 0)
                    then
                        local isCheckTure = my_checkSum(packet)
                        if isCheckTure == 1
                        then
                            TransferSize = packsize + TransferSize
                            local prg = string.format ('%.1f', ((TransferSize *
                                          100) / filesize))
                            set_value(sc_Lock,  88, math.ceil((TransferSize *
                                          1000) / filesize))
                            set_text(sc_Lock, 188, 'Downloading : '..prg..' %
   [ '..math.ceil(TransferSize)..' byte / '..math.ceil(filesize)..' byte ]')
                            
                            for i = 7, (#(packet) - 6)
                            do
                                ota_writeTb[ota_writeByte] = packet[i]
                                ota_writeByte = ota_writeByte + 1
                            end
                            
                            if #(ota_writeTb) >= 0
                            then 
                            
                                local isOtaWrite = 0
                                
                                ota_cnt = ota_cnt + 1
                                if ota_cnt == 4 
                                then
                                    isOtaWrite = 1
                                    
                                elseif ota_cnt < 4 and TransferSize == filesize
                                then
                                    isOtaWrite = 1
                                end
                                
                                if isOtaWrite == 1
                                then
                                    
                                    if #(ota_writeTb) <= 2047
                                    then
                                        for i = (#(ota_writeTb) + 1), 2047
                                        do
                                            ota_writeTb[ota_writeByte] = 0x00
                                            ota_writeByte = ota_writeByte + 1
                                        end
                                    end
                                    ......
                                    local _write =  ota_write(ota_writeTb)
                                    
                                    ota_cnt = 0
                                    ota_writeByte = 0 
                                    ota_writeTb   = {}
                                end
                                
                                pre_sn = sn
                                my_uartsend_ota(child_code, ota_suc, pre_sn)
                            end   
                        end
                    else
                        --check sum error
                        my_uartsend_ota(child_code, 
                                           ota_packet_checkfail, (pre_sn + 1))
                    end
                else
                    --size > 512byte error
                    print(' > packet size > '..otaUartPacketSize..' ERROR !')
                end
            else
                --sn error
                my_uartsend_ota(child_code, ota_snfail, (pre_sn + 1))
            end     
            ......
        end
    end
end

▲下滑查看



4. 下載完成

當(dāng)屏幕接收到用戶主板確認(rèn)升級(jí)的指令(EE B6 Len 88 33 01 FF FC FF FF),則調(diào)用ota_check_upgrade(1)開始進(jìn)入校驗(yàn)解壓過(guò)程。代碼如程序清單 4所示。

程序清單 4  開始升級(jí)

--uart ota transmission operation
function ota_operating(packet)

    local datalen = (packet[2] << 8) | packet[3]
    local funcode = packet[4] 
    local cur_screen = get_current_screen()
    
    if funcode == ota_code
    then
        --EE B6 LEN(2BYTE) 88 11 FILESIZE(4byte) FILENAME FF FC FF FF
        local child_code = packet[5]
        local down_name  = ''
        
        if child_code == _start_down
        then
            ......

        elseif child_code == _dwoning
        then
            ......
        elseif child_code == _end_down and down_state == 1
        then
            local isUpdata = packet[6]
            if isUpdata == 0x01
            then
                my_uartsend_ota(child_code, ota_suc)
                
                ......
                ota_check_upgrade(1) 
                
            end
        ......
        end
    end
end

▲下滑查看


5. 校驗(yàn)解壓


當(dāng)屏幕進(jìn)入升級(jí)過(guò)程,會(huì)自動(dòng)調(diào)用on_ota_progress(status,value)進(jìn)入校驗(yàn)、解壓過(guò)程,校驗(yàn)中→校驗(yàn)結(jié)果→解壓中→解壓結(jié)果→恢復(fù)波特率→重啟,代碼程序清單 5所示。

程序清單 5  校驗(yàn)解壓

function on_ota_progress(status,value)
    
    --Checking
    if status == 1 and value == 0
    then
        set_value(sc_Lock, 88, value)
        set_text(sc_Lock, 188, '')
        refresh_screen()
    
    --Check result
    elseif status == 2
    then
        my_uartsend_ota(_file_check, value)
    
    --Unpacking
    elseif status == 3
    then
        set_value(sc_Lock, 88, value*10)
        set_text(sc_Lock, 188, 'flash_updatesects : '..value..' %')
        refresh_screen()
        
    --Unpacking result    
    elseif status == 4
    then
        
        my_uartsend_ota(_unzip, value)
        print('> baudrate = '..baudrate)
        uart_set_baudrate(baudrate)    
        delay_ms(100)
    end
end

▲下滑查看


5.2.6 LUA SD升級(jí)源碼

本例程中,用戶還可以將ota.bin文件放在SD卡中進(jìn)行升級(jí),本例程中已將sd升級(jí)功能封裝在‘ota.lua’中,用戶只需要在sd插入回調(diào)函數(shù)里調(diào)用my_sd_updata

OTA()即可。代碼程序清單 5所示。

程序清單 6  SD卡升級(jí)源碼

--main.lua
function on_sd_inserted(dir)
    my_sd_updataOTA()
end


--ota.lua
--sd update ota 
function my_sd_updataOTA()
    
    local finish = 0
    
    if file_open(sd_path, 1) == true 
    then
        size = file_size()
        ota_destroy()
        
        local sdota_addr = ota_init('0123456789abcdef', size, 0x800000)

        --ota resume
        if sdota_addr > 0 
        then
            file_seek(sdota_addr)
        end
        
        while(true) 
        do
            local rddata = file_read(2048)
            if #(rddata) < 2047
            then
                for i = (#(rddata) + 1), 2047
                do
                    rddata[i] = 0x00

                end
                finish=1
            end

            ota_write(rddata)      
            print('> finish = '..finish)
            if finish == 1 then
                break
            end
        end

        file_close()
        my_assecc_ota(1)
        ota_check_upgrade(1)
    end
end

▲下滑查看





附錄A


MCU 發(fā)送給屏幕的指令如下所示:

圖片

 

屏幕應(yīng)答或通知MCU屏幕的指令如下所示:

圖片




附錄B


DEMO下載鏈接:

http://gc086.com/uploads/file/20210111/M%20OTA.zip