多功能嵌入式解碼軟體

来源:https://www.cnblogs.com/xutopia/archive/2019/05/07/10824871.html
-Advertisement-
Play Games

概述 在嵌入式開發的過程中,由於經常需要下位機與上位機通信,通信之間就需要協議,有協議就需要進行解碼,而產品開發得過程中,協議可能不斷更新,協議更新就需要解碼軟體更新,不斷更新解碼軟體就很麻煩,如果所有人都願意麻煩,那麼我不願意。在這裡就產生了一個通用的解碼類庫,使用者就可以簡單的改一下協議文件,通 ...


 概述

  在嵌入式開發的過程中,由於經常需要下位機與上位機通信,通信之間就需要協議,有協議就需要進行解碼,而產品開發得過程中,協議可能不斷更新,協議更新就需要解碼軟體更新,不斷更新解碼軟體就很麻煩,如果所有人都願意麻煩,那麼我不願意。在這裡就產生了一個通用的解碼類庫,使用者就可以簡單的改一下協議文件,通過調用這個類庫,就可以實現解碼,不需要再更改解碼演算法了。
class_frame類庫就是這樣的一個很方便的庫件。

 類庫簡介

 1 #region 程式集 xutopia, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
 2 // D:\workspace\09 UARTTOOL\19\myDll\xutopia\xutopia\bin\Debug\xutopia.dll
 3 #endregion
 4 
 5 using System.Collections.Generic;
 6 
 7 namespace xutopia
 8 {
 9     public class Class_frame
10     {
11         public bool protocolFresh;
12         public string frameMsg;
13 
14         public Class_frame();
15 
16         public _decodeDatTimelyStruct DecodeTimely(byte rxdDat);
17         public void Process_protocol_readed(string strPro);
18         public List<_saveDecodeStruct> SaveDecodeDat(List<byte> listRxd);
19 
20         public struct _decodeDatTimelyStruct
21         {
22             public byte function;
23             public List<object> listRe;
24         }
25         public struct _saveDecodeStruct
26         {
27             public byte function;
28             public string str;
29         }
30     }
31 }

名稱空間:xutopia;

類的名稱:Class_frame;

 

屬性:

  public bool protocolFresh;

    true  :   已經正確解析出協議;

         false :  沒有協議。

  public string frameMsg;

    解析出協議的信息。

方法:

  public _decodeDatTimelyStruct DecodeTimely(byte rxdDat);

    param:

        rxdDat:接收到的數據;

  retval:

    _decodeDatTimelyStruct:解碼的信息;

    function : 功能碼;

    listRe: 解碼的數據。需要強制類型轉換後才能使用。

  public void Process_protocol_readed(string strPro);

    param:

        strPro:讀取到的協議文件;

  public List<_saveDecodeStruct> SaveDecodeDat(List<byte> listRxd);

    param:

      listRxd:接收到的數據的泛型集合。

    retval:

      每一種功能碼的解碼數據:

        function:功能碼;

        str : 需要保存的數據。

 驗證類庫

 通信協議

下麵進行一個示例:

    下位機需要向上位機發送3中數據幀,數據幀以功能碼來識別,每種數據幀的協議如下3個表格所示,上位機需要把這些數據按照協議解碼出來,併進行保存以便分析。

通信協議:

準備協議文件

  按照通信協議編寫協議文件
  

/*
this is a protocol
2019-03-28
正文中不可以出現註釋
e.g. 正文//註釋內容
e.g. 正文
//註釋內容
正文開頭第一行必須是frameType
*/
/*
目前最後一行必須是空行
*/
frameType=header2 function
header1=0xA0
header2=0xA1
body=1
function=0xB1
index=1,type=unsigned char
index=2,type=unsigned short
index=3,type=unsigned int
index=4,type=short
index=5,type=int
index=6,type=float
index=7,type=double
endbody
body=2
function=0xB2
index=1,type=unsigned char
index=2,type=unsigned short
index=3,type=unsigned int
index=4,type=short
index=5,type=int
index=6,type=float
index=7,type=double
endbody
body=3
function=0xB3
index=1,type=unsigned char
index=2,type=unsigned short
index=3,type=unsigned int
index=4,type=short
index=5,type=int
index=6,type=float
index=7,type=double
endbody
check=CRC-CCITT
-----END FILE-----

模擬下位機發送數據

  為了方便分析,這裡使用虛擬串口助手在電腦上模擬出兩個串口埠

編寫軟體模擬下位機按照協議發送數據

類庫使用方法

讀取協議文件

 1 private void ButtonReadProtocol_Click(object sender, RoutedEventArgs e)
 2         {
 3             string[] txtRead = new string[2];
 4 
 5             txtRead = Selected_txt();
 6             if (txtRead == null)
 7                 return;
 8             TextBoxSettingLog.AppendText(txtRead[0] + "\r\n");
 9             s.pro_Read = txtRead[1];
10             c_f.Process_protocol_readed(s.pro_Read);
11             if (c_f.protocolFresh == true)
12                 TextBoxSettingLog.AppendText(c_f.frameMsg);
13         }

保存解碼數據

/// <summary>
        /// 2019-05-06
        /// </summary>
        private void SaveDecodeDat()
        {
            string strPath = Environment.CurrentDirectory;
            List<Class_frame._saveDecodeStruct> re = new List<Class_frame._saveDecodeStruct>();
            re = c_f.SaveDecodeDat(listSpRxdDat);
            for (int i = 0; i < re.Count; i++)
            {
                byte id = re[i].function;
                string str = re[i].str;
                string strFile = strPath + "\\DOC\\" + DateTime.Now.ToString("yy-MM-dd-HH.mm.ss") + "dec" + Convert.ToString(id, 16) + ".txt";
                if (re[0].str != null)
                    SaveString(str, strFile, FileMode.Create);
                else
                    MessageBox.Show("null");
            }
        }

 

實時解碼數據

 1 /// <summary>
 2         /// 2019-05-07
 3         /// </summary>
 4         private void Decode_header_function_sum8()
 5         {
 6             Class_frame._decodeDatTimelyStruct re = new Class_frame._decodeDatTimelyStruct();
 7             int cnt = listSpRxdDat.Count();
 8 
 9             while (s.dec_lastCnt < cnt)
10             {
11                 re = c_f.DecodeTimely(listSpRxdDat[s.dec_lastCnt++]);
12                 List<object> l = re.listRe;
13                 byte id = re.function;
14                 if (l != null)
15                 {
16                     byte ui8;
17                     UInt16 ui16;
18                     UInt32 ui32;
19                     Int16 i16;
20                     Int32 i32;
21                     float f;
22                     double d;
23 
24                     switch (id)
25                     {
26                         case 0xB1:
27                             {
28                                 ui8 = (byte)l[0];
29                                 ui16 = (UInt16)l[1];
30                                 ui32 = (UInt32)l[2];
31                                 i16 = (Int16)l[3];
32                                 i32 = (Int32)l[4];
33                                 f = (float)l[5];
34                                 d = (double)l[6];
35                                 TextBoxRxd.AppendText("--------0xB1\r\n");
36                                 TextBoxRxd.AppendText(ui8.ToString() + " ");
37                                 TextBoxRxd.AppendText(ui16.ToString() + " ");
38                                 TextBoxRxd.AppendText(ui32.ToString() + " ");
39                                 TextBoxRxd.AppendText(i16.ToString() + " ");
40                                 TextBoxRxd.AppendText(i32.ToString() + " ");
41                                 TextBoxRxd.AppendText(f.ToString() + " ");
42                                 TextBoxRxd.AppendText(d.ToString() + " ");
43                                 TextBoxRxd.AppendText("\r\n");
44                             }
45                             break;
46                         case 0xB2:
47                             {
48                                 ui8 = (byte)l[0];
49                                 ui16 = (UInt16)l[1];
50                                 ui32 = (UInt32)l[2];
51                                 i16 = (Int16)l[3];
52                                 i32 = (Int32)l[4];
53                                 f = (float)l[5];
54                                 d = (double)l[6];
55                                 TextBoxRxd.AppendText("--------0xB2\r\n");
56                                 TextBoxRxd.AppendText(ui8.ToString() + " ");
57                                 TextBoxRxd.AppendText(ui16.ToString() + " ");
58                                 TextBoxRxd.AppendText(ui32.ToString() + " ");
59                                 TextBoxRxd.AppendText(i16.ToString() + " ");
60                                 TextBoxRxd.AppendText(i32.ToString() + " ");
61                                 TextBoxRxd.AppendText(f.ToString() + " ");
62                                 TextBoxRxd.AppendText(d.ToString() + " ");
63                                 TextBoxRxd.AppendText("\r\n");
64                             }
65                             break;
66                         case 0xB3:
67                             {
68                                 ui8 = (byte)l[0];
69                                 ui16 = (UInt16)l[1];
70                                 ui32 = (UInt32)l[2];
71                                 i16 = (Int16)l[3];
72                                 i32 = (Int32)l[4];
73                                 f = (float)l[5];
74                                 d = (double)l[6];
75                                 TextBoxRxd.AppendText("--------0xB3\r\n");
76                                 TextBoxRxd.AppendText(ui8.ToString() + " ");
77                                 TextBoxRxd.AppendText(ui16.ToString() + " ");
78                                 TextBoxRxd.AppendText(ui32.ToString() + " ");
79                                 TextBoxRxd.AppendText(i16.ToString() + " ");
80                                 TextBoxRxd.AppendText(i32.ToString() + " ");
81                                 TextBoxRxd.AppendText(f.ToString() + " ");
82                                 TextBoxRxd.AppendText(d.ToString() + " ");
83                                 TextBoxRxd.AppendText("\r\n");
84                             }
85                             break;
86                         default:
87                             TextBoxRxd.AppendText("frame id err\r\n");
88                             break;
89                     }
90                 }
91             }
92         }

在UARTTOOL中使用類庫

  讀取協議文件,協議文件的信息會在TextBox框中顯示出來。

如下圖模擬下位機軟體開始向上位機發送數據

UARTTOOL打開串口,點擊保存數據和解碼數據會把原始數據和解碼後的數據保存下來

 解碼後的數據如圖,和發送的一致。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • https://www.jb51.net/article/157457.htm 下載32位版本安裝即可 *總結:如果你是web項目,你就下載x86的,發佈選anycpu就好了,然後設置應用程式池32位相容就好了; ...
  • 五一假期回來,練習一下C#的一些知識,瞭解一下排序。 練習數據: 寫一個類: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Ta ...
  • 直接切入主題 有時候同一個項目下我們可能會使用多個窗體,窗體間方法互相調用也不可避免,好了,使用無參無返回值的方法,開始上圖 1、新建一個winform項目Form1,並再添加一個窗體Form2;拖入button和textbox,如下 2、先編輯Form2,定義屬性存放無參無返回值的方法,重載For ...
  • 今天在使用 C# 操作 Excel 時,一直在報錯誤: 檢索 COM 類工廠中 CLSID 為 {00024500-0000-0000-C000-000000000046} 的組件失敗,原因是出現以下錯誤: 8007065e 這個類型的數據不受支持。 (異常來自 HRESULT:0x8007065E ...
  • 一個字元串就是一個string類型數據,此類型變數我們可以把它看作一個只讀數組,其元素是char變數,在這裡我們來說下string類型的常用命令。 1、TocharArray():將此實例中的字元複製到 Unicode 字元數組。其示例是“char[] ch = <string類型變數>.ToCha ...
  • 因項目原因,需要使用SQLite的全文索引,用到了最新的fts5模塊 但在咱們.net framwork中卻會提示“SQL logic error no such module: fts5”:找不到fts5模塊…… 百度了很久都沒有找到項目解決方案,可能是C#用SQLite比較少的原因,更何況用的更 ...
  • https://3gstudent.github.io/3gstudent.github.io/Exchange-Web-Service(EWS)%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/ EWS是郵箱的一個開放的介面服務,可以取到郵箱的各種信息,郵件收發、會議、日期 ...
  • 在之前的文章中我們是使用Rester來測試我們的WebAPI的。接下來,我們來創建一個實際的頁面來測試之前我們寫的WebAPI。我們創建一個HTML頁面,併在頁面使用 jQuery 來調用 Web API 。通過jQuery來調用增刪除改查WebAPI介面,並用 API 介面返回的響應中的詳細信息更... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...