升級助手上位機(使用C#編寫)


bootloader寫完之后,使用C#寫了一個配套的升級助手。不得不說C#真的是一個很優秀的語言,而visual studio也完全可以稱之為最強IDE,沒有之一!配合MSDN,花了一個星期熟悉C#,然后兩周不到完成了51升級助手的開發。

主界面

51升級助手

特點:

  1. 支持多種不同的通信協議(主要用於升級前的握手)
    • 用戶自定義協議
    • IEC62056-21 C模式
    • DL/T645-07
  2. 配合51bootloader完成用戶代碼的更新
    • 支持原生Intel HEX-80格式
    • 支持設定用戶代碼段地址范圍
    • 支持自動重發
    • 自動剔除全0xFF數據,減少發送數據量

使用到的功能模塊:
1.串口通信(使用C#官方serialPort類庫);
2.文件讀寫(使用C#官方File類庫);
3.設置文件(使用xml保存);
4.定時器(用於通信時序控制);

整體思路

首先上位機升級助手打開本地hex文件,對hex文件進行格式化,方便后面的數據傳輸。然后下位機在接收到升級指令后會判斷是否符合升級條件,如果符合,則跳轉到bootloader程序中准備接收升級數據,否則忽略升級指令,並返回響應幀通知上位機。
在升級的過程中,雙方遵循同一個校驗算法,下位機校驗數據通過,通過IAP寫入flash,否則請求重發。
下位機檢測到處理到用戶代碼段的最后一幀數據,發送升級完成指令,下位機接收校驗通過,通過長跳轉指令調到用戶代碼,完成程序升級。
因為下位機bootloader采用查詢的方式通信,為了提高可靠信,及降低出錯時的重傳代價,一次傳輸的代碼字節限制在16個字節,所以需要格式化hex-80文件

private bool handleHexFile(string filePath)
{
    string[] Hex=System.IO.File.ReadAllLines(filePath);
    string[] formatHex= System.IO.File.ReadAllLines(Application.StartupPath + "\\tempHexFile.txt");
    uint dateAddr = 0;
    uint dateLen = 0;
    foreach (string hexLine in Hex)
    {
        if (!string.IsNullOrEmpty(hexLine))
        {
            if (hexLine.Substring(0, 1) == ":")          // hex-80文件以冒號":"開頭
            {
                dateLen = Convert.ToUInt32(hexLine.Substring(1,2).Trim(),16);
                dateAddr = Convert.ToUInt32(hexLine.Substring(3, 4).Trim(),16);
                if (dateLen == 0)
                {
                    continue;
                }
                uint modLine = dateAddr / 16;
                uint modByte = dateAddr % 16 + 1;
                uint modLen = dateLen;
                string[] tempStr=null;
                tempStr = formatHex[modLine].Trim().Split(' ');
                
                for (int i = 0; i < modLen*2; i+=2)
                {
                    tempStr[modByte] = hexLine.Substring(9 + i, 2).Trim();
                    if (modByte>=16)
                    {
                        string temp = null;
                        for (int n = 0; n < tempStr.Length; n++)
                        {
                            temp += (tempStr[n].TrimStart() + ' ');
                        }
                        formatHex[modLine] = temp;
                       
                        modByte = 0;
                        modLine++;
                        tempStr = formatHex[modLine].Trim().Split(' ');
                    }
                    modByte++;
                }
                string temp2 = null;
                for (int n = 0; n < tempStr.Length; n++)
                {
                    temp2 += (tempStr[n].TrimStart() + ' ');
                }
                formatHex[modLine] = temp2;

            }
            else
            {
                tbInformation.AppendText("empty");
                return false;
            }
        }    
    }
    updateFile = formatHex;
    System.IO.File.WriteAllLines(Application.StartupPath + "\\HexFile.txt", formatHex);
    return true;
}

除此之外,根據通信協議完成通訊部分的代碼設計,一個可用的升級助手基本完成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM