構造一個“協議幀”,打包串口/網絡通信幀頭部結構的核心部分
🔧 代碼:
List<byte> frame = new List<byte>();// 1. 固定幀頭
frame.AddRange(BitConverter.GetBytes(0x0130)); // 幀頭 (4B)
frame.AddRange(BitConverter.GetBytes((ushort)22)); // 幀長度 (2B)
frame.AddRange(BitConverter.GetBytes((ushort)type)); // 幀類型 (2B)
frame.AddRange(BitConverter.GetBytes((ushort)0x0000)); // 序號 (2B)
🧠 一行一講:
🔹 List<byte> frame = new List<byte>();
🔹 創建一個動態的字節集合,用來組裝整個“數據幀”。
你會不斷往 frame
里 AddRange()
塞字節,構造完整通信包。
🔹 frame.AddRange(BitConverter.GetBytes(0x0130));
🔹 加入幀頭字段:固定值 0x0130
含義 | 值 | 字節長度 | 用途 |
---|---|---|---|
幀頭 | 0x0130 | 2 字節 | 用于幀識別、同步,開頭校準 |
輸出的字節是 小端格式(在內存中實際是):[0x30, 0x01 ]
🔹 frame.AddRange(BitConverter.GetBytes((ushort)22));
🔹 加入幀大小字段(2 字節)
這里填的是:22 字節,表示整個幀的總長度(你可以改成動態計算)
例子:22
→ 0x0016
→ 小端字節:[0x16, 0x00]
🔹 frame.AddRange(BitConverter.GetBytes((ushort)type));
🔹 加入幀類型字段(2 字節)
你會傳入不同的 type
,比如:
類型名 | 值 |
---|---|
參數設置 | 0x2001 |
參數讀取 | 0x2002 |
啟動激勵 | 0x3001 |
比如 type = 0x2002
→ 字節是 [0x02, 0x20]
(小端)
🔹 frame.AddRange(BitConverter.GetBytes((ushort)0x0000));
🔹 加入序號字段(2 字節)
- 通常用于幀編號、請求/響應匹配
- 你現在寫死為
0x0000
,后續如果你要支持多幀隊列、自動序號,也可以這里動態傳參
? 最終結果:
這段代碼打包完的 frame
內容是:
字段 | 內容 | 字節數 | 示例值 (小端) |
---|---|---|---|
幀頭 | 0x0130 | 2 | 30 01 |
幀長度 | 0x0016 | 2 | 16 00 |
幀類型 | type (傳參) | 2 | 02 40 (如0x4002) |
序號 | 0x0000 | 2 | 00 00 |
共:8 字節
👇 后續 還可以追加:
- CRC 校驗(2 字節)
- 數據段(2字節參數編號 +2字節寫入值)
- 幀尾CRC(2 字節)