Embed/microCLib

调整一下
JiuHuan authored at 2026-08-11 11:23:49
fb05983
Tree
1 Parent(s) e89c487
Summary: 68 changed files with 1019 additions and 1822 deletions.
Modified +89 -15
Modified +52 -11
Modified +21 -17
Modified +18 -13
Deleted +0 -81
Core/AsyncData.c
Deleted +0 -50
Core/AsyncData.h
Modified +1 -1
Modified +1 -1
Modified +1 -1
Modified +29 -20
Modified +29 -17
Modified +1 -1
Modified +1 -1
Deleted +0 -249
Core/BootLoad.c
Deleted +0 -35
Core/BootLoad.h
Deleted +0 -91
Core/BootLoadConfig.c
Deleted +0 -58
Core/BootLoadConfig.h
Added +65 -0
Added +37 -0
Deleted +0 -91
Core/CheckConfig.c
Deleted +0 -14
Core/CheckConfig.h
Modified +22 -15
Modified +22 -15
Modified +1 -1
Modified +1 -1
Deleted +0 -46
Core/cJsonProcess.c
Deleted +0 -106
Core/cJsonProcess.h
Modified +53 -42
Modified +29 -23
Modified +1 -1
Modified +1 -1
Modified +1 -1
Modified +8 -3
Modified +6 -5
Modified +6 -5
Modified +1 -1
Modified +1 -1
Modified +1 -1
Modified +1 -1
Modified +31 -27
Modified +13 -9
Modified +10 -6
Modified +6 -4
Modified +53 -53
Modified +36 -27
Modified +5 -3
Modified +6 -4
Modified +1 -1
Modified +1 -1
Modified +1 -1
Modified +1 -1
Deleted +0 -138
Core/OtaImageLoad.c
Deleted +0 -36
Core/OtaImageLoad.h
Modified +89 -70
Modified +112 -89
Modified +1 -1
Modified +1 -1
Modified +19 -13
Modified +6 -6
Modified +1 -1
Modified +1 -64
Modified +16 -55
Deleted +0 -57
Core/Update.c
Deleted +0 -29
Core/Update.h
Modified +6 -5
Modified +15 -12
Modified +38 -30
Modified +50 -42
Modified +89 -15
diff --git a/Core/AdcFilter.c b/Core/AdcFilter.c
index 0c43834..046089b 100644
--- a/Core/AdcFilter.c
+++ b/Core/AdcFilter.c
@@ -1,14 +1,13 @@
 
 #include "AdcFilter.h"
-#include "math.h"
 
-/// <summary>初始化滤波器</summary>
+/** @brief 初始化滤波器 */
 bool AdcFilterInit(AdcFilter_t* filter, short size)
 {
     if(filter == NULL)return false;
     if(size < 4)size = 4;
     
-    filter->Data = (short*)malloc(sizeof(short)*size);
+    filter->Data = (short*)GlobleMalloc(sizeof(short)*size);
     if(filter->Data == NULL)return false;
 
     memset(filter->Data, 0, sizeof(short)*size);
@@ -17,10 +16,12 @@ bool AdcFilterInit(AdcFilter_t* filter, short size)
     return true;
 }
 
-/// <summary>滤波数据</summary>
-/// <param name="filter">滤波器</param>
-/// <param name="data">原始数据</param>
-/// <returns>数据放入成功</returns>
+/**
+ * @brief 滤波数据
+ * @param filter 滤波器
+ * @param data 原始数据
+ * @return 数据放入成功
+ */
 bool AdcFilterPush(AdcFilter_t* filter,short data)
 {
     if(filter == NULL)return false;
@@ -35,11 +36,13 @@ bool AdcFilterPush(AdcFilter_t* filter,short data)
     return true;
 }
 
-/// <summary>滤波数据</summary>
-/// <param name="filter">滤波器</param>
-/// <param name="valueMax">X Y 的最大值,绝对值</param>
-/// <param name="outRange">换算为这个范围,ADC数值转换为对外输出范围,绝对值</param>
-/// <returns>滤波之后的数据</returns>
+/**
+ * @brief 滤波数据
+ * @param filter 滤波器
+ * @param valueMax X Y 的最大值,绝对值
+ * @param outRange 换算为这个范围,ADC数值转换为对外输出范围,绝对值
+ * @return 滤波之后的数据
+ */
 short AdcFilterCalc(AdcFilter_t* filter, int valueMax, int outRange)
 {
     // 滤波
@@ -48,9 +51,11 @@ short AdcFilterCalc(AdcFilter_t* filter, int valueMax, int outRange)
     int max = INT32_MIN;
     for(int i = 0; i < filter->Size; i++)
     {
-        sum += filter->Data[i];
-        if(filter->Data[i] < min)min = filter->Data[i];
-        if(filter->Data[i] > max)max = filter->Data[i];
+        volatile short data = filter->Data[i];
+
+        sum += data;
+        if(data < min)min = data;
+        if(data > max)max = data;
     }
     // 去除最大最小值
     sum -= min;
@@ -60,7 +65,76 @@ short AdcFilterCalc(AdcFilter_t* filter, int valueMax, int outRange)
     int result = sum / (filter->Size - 2);
 
     // 范围转换
+    if(valueMax == outRange)return result;
     result = (result * outRange) / valueMax;
     return (short)result;
 }
 
+
+/** @brief 初始化ADC范围,计算完K B之后会调整 adc Min Max 范围 */
+bool AdcScopeInit(AdcScope_t* scope, ushort adcMin, ushort adcMax, int valueMin, int valueMax)
+{
+    scope->ValueMax = valueMax;
+	scope->ValueMin = valueMin;
+	scope->AdcMax = adcMax;
+	scope->AdcMin = adcMin;
+    // 计算K和B值
+    scope->K = (float)(valueMax - valueMin) / (adcMax - adcMin);
+    scope->B = valueMin - (scope->K * adcMin);
+    
+    return true;
+}
+
+/**
+ * @brief 范围矫正
+ * @param filter 滤波器
+ * @param scope 范围
+ * @param fixThr 修正阈值,ADC抖动大于这个值,不进行范围矫正
+ * @return double 
+ */
+double AdcScopeCalc_Double(AdcFilter_t* filter,AdcScope_t* scp,int fixThr)
+{
+    if(scp->K < 0.0)return -1;
+
+    int adc = AdcFilterCalc(filter, 4096,4096);
+    // 超出修正范围返回 -1
+    if(adc + fixThr < scp->AdcMin)return -1;
+    if(adc - fixThr > scp->AdcMax)return -1;
+    // 超出范围,修正范围
+    if(adc < scp->AdcMin)adc = scp->AdcMin;
+    if(adc > scp->AdcMax)adc = scp->AdcMax;
+    // 计算
+    int result = adc * scp->K + scp->B;
+    // 结果限定一下,避免因为K B 计算不准,导致结果超出范围
+    if(result < scp->ValueMin)return scp->ValueMin;
+    if(result > scp->ValueMax)return scp->ValueMax;
+
+    return result;
+}
+
+/**
+ * @brief 范围矫正
+ * @param filter 滤波器
+ * @param scope 范围
+ * @param fixThr 修正阈值,ADC抖动大于这个值,不进行范围矫正
+ * @return int 
+ */
+int AdcScopeCalc(AdcFilter_t* filter,AdcScope_t* scp,int fixThr)
+{
+    if(scp->K < 0.0)return -1;
+
+    int adc = AdcFilterCalc(filter, 4096,4096);
+    // 超出修正范围返回 -1
+    if(adc + fixThr < scp->AdcMin)return -1;
+    if(adc - fixThr > scp->AdcMax)return -1;
+    // 超出范围,修正范围
+    if(adc < scp->AdcMin)adc = scp->AdcMin;
+    if(adc > scp->AdcMax)adc = scp->AdcMax;
+    // 计算
+    int result = (int)(adc * scp->K + scp->B);
+    // 结果限定一下,避免因为K B 计算不准,导致结果超出范围
+    if(result < scp->ValueMin)return scp->ValueMin;
+    if(result > scp->ValueMax)return scp->ValueMax;
+
+    return result;
+}
Modified +52 -11
diff --git a/Core/AdcFilter.h b/Core/AdcFilter.h
index f64c6b2..c2aeed8 100644
--- a/Core/AdcFilter.h
+++ b/Core/AdcFilter.h
@@ -2,7 +2,7 @@
 
 #include "Type.h"
 
-/// <summary>滤波器</summary>
+/** @brief 滤波器 */
 typedef struct
 {
     short* Data;
@@ -11,19 +11,60 @@ typedef struct
 }AdcFilter_t;
 
 
-/// <summary>初始化滤波器</summary>
+/** @brief 初始化滤波器 */
 bool AdcFilterInit(AdcFilter_t* filter, short size);
 
-/// <summary>滤波数据</summary>
-/// <param name="filter">滤波器</param>
-/// <param name="data">原始数据</param>
-/// <returns>数据放入成功</returns>
+/**
+ * @brief 滤波数据
+ * @param filter 滤波器
+ * @param data 原始数据
+ * @return 数据放入成功
+ */
 bool AdcFilterPush(AdcFilter_t* filter,short data);
 
-/// <summary>滤波数据</summary>
-/// <param name="filter">滤波器</param>
-/// <param name="valueMax">X Y 的最大值,绝对值</param>
-/// <param name="outRange">换算为这个范围,ADC数值转换为对外输出范围,绝对值</param>
-/// <returns>滤波之后的数据</returns>
+/**
+ * @brief 滤波数据
+ * @param filter 滤波器
+ * @param valueMax X Y 的最大值,绝对值
+ * @param outRange 换算为这个范围,ADC数值转换为对外输出范围,绝对值
+ * @return 滤波之后的数据
+ */
 short AdcFilterCalc(AdcFilter_t* filter, int valueMax, int outRange);
 
+/** @brief ADC范围 */
+// 注意:AdcMin AdcMax K 都是正数,K B 是计算加速
+typedef struct
+{
+    ushort AdcMin;
+    ushort AdcMax;
+
+    int ValueMin;
+    int ValueMax;
+
+    // Y = KX + B
+    double K;
+    // Y = KX + B
+    double B;
+}AdcScope_t;
+
+/** @brief 初始化ADC范围,计算K B */
+bool AdcScopeInit(AdcScope_t* scope, ushort adcMin, ushort adcMax, int valueMin, int valueMax);
+
+/**
+ * @brief 范围矫正
+ * @param filter 滤波器
+ * @param scope 范围
+ * @param fixThr 修正阈值,ADC抖动大于这个值,不进行范围矫正
+ * @return double 
+ */
+double AdcScopeCalc_Double(AdcFilter_t* filter,AdcScope_t* scp,int fixThr);
+
+/**
+ * @brief 范围矫正
+ * @param filter 滤波器
+ * @param scope 范围
+ * @param fixThr 修正阈值,ADC抖动大于这个值,不进行范围矫正
+ * @return int 
+ */
+int AdcScopeCalc(AdcFilter_t* filter,AdcScope_t* scope,int fixThr);
+
Modified +21 -17
diff --git a/Core/Array.c b/Core/Array.c
index f6b5454..4a2c0c0 100644
--- a/Core/Array.c
+++ b/Core/Array.c
@@ -88,7 +88,7 @@ int ArrayIndexOfBuff(Buffer_t* src, Buffer_t* sub)
 	if (src == NULL)return -1;
 	if (sub == NULL)return -1;
 
-	return ArrayIndexOf(src->p, src->len, sub->p, sub->len);
+	return ArrayIndexOf(src->Data, src->Len, sub->Data, sub->Len);
 }
 
 int ArrayIndexOfBuff2(Buffer2_t* src, Buffer2_t* sub)
@@ -96,7 +96,7 @@ int ArrayIndexOfBuff2(Buffer2_t* src, Buffer2_t* sub)
 	if (src == NULL)return -1;
 	if (sub == NULL)return -1;
 
-	return ArrayIndexOf(src->data, src->len, sub->data, sub->len);
+	return ArrayIndexOf(src->Data, src->Len, sub->Data, sub->Len);
 }
 
 int ArrayLastIndexOf(byte* src, int srclen, byte* sub, int sublen)
@@ -136,7 +136,7 @@ int ArrayLastIndexOfBuff(Buffer_t* src, Buffer_t* sub)
 	if (src == NULL)return -1;
 	if (sub == NULL)return -1;
 
-	return ArrayLastIndexOf(src->p, src->len, sub->p, sub->len);
+	return ArrayLastIndexOf(src->Data, src->Len, sub->Data, sub->Len);
 }
 
 int ArrayLastIndexOfBuff2(Buffer2_t* src, Buffer2_t* sub)
@@ -144,7 +144,7 @@ int ArrayLastIndexOfBuff2(Buffer2_t* src, Buffer2_t* sub)
 	if (src == NULL)return -1;
 	if (sub == NULL)return -1;
 
-	return ArrayLastIndexOf(src->data, src->len, sub->data, sub->len);
+	return ArrayLastIndexOf(src->Data, src->Len, sub->Data, sub->Len);
 }
 
 void ArrayReverse(byte* data, int len)
@@ -173,14 +173,14 @@ void ArrayReverseBuff(Buffer_t* buff)
 {
 	if (buff == NULL)return;
 
-	ArrayReverse(buff->p, buff->len);
+	ArrayReverse(buff->Data, buff->Len);
 }
 
 void ArrayReverseBuff2(Buffer2_t* buff)
 {
 	if (buff == NULL)return;
 
-	ArrayReverse(buff->data, buff->len);
+	ArrayReverse(buff->Data, buff->Len);
 }
 
 void ArraySortByte(byte* data, int len)
@@ -295,11 +295,13 @@ int HexToArray(char* hex, int len, byte* bs)
 	return len;
 }
 
-/// <summary>二分法查询</summary>
-/// <param name="array">从小到大排序的数组</param>
-/// <param name="len">数组长度</param>
-/// <param name="value">查询值</param>
-/// <returns>返回第一个有效值。 -1 未找到</returns>
+/**
+ * @brief 二分法查询
+ * @param array 从小到大排序的数组
+ * @param len 数组长度
+ * @param value 查询值
+ * @return 返回第一个有效值。 -1 未找到
+ */
 int DichotomyFind_Int(int* array, int len, int value)
 {
 	if (array == NULL)return -1;
@@ -331,12 +333,14 @@ int DichotomyFind_Int(int* array, int len, int value)
 	}
 }
 
-/// <summary>二分法,从结构体查询</summary>
-/// <param name="array">结构体数组,按照KEY从小到大排序</param>
-/// <param name="len">结构体长度</param>
-/// <param name="func">获取KEY方法</param>
-/// <param name="key">查询项</param>
-/// <returns>返回第一个有效值。 -1 未找到</returns>
+/**
+ * @brief 二分法,从结构体查询
+ * @param array 结构体数组,按照KEY从小到大排序
+ * @param len 结构体长度
+ * @param func 获取KEY方法
+ * @param key 查询项
+ * @return 返回第一个有效值。 -1 未找到
+ */
 int DichotomyFind_Obj(void* array, int len, DichotomyGetKey func, int key)
 {
 	if (array == NULL)return -1;
Modified +18 -13
diff --git a/Core/Array.h b/Core/Array.h
index 514cc14..e68d262 100644
--- a/Core/Array.h
+++ b/Core/Array.h
@@ -1,6 +1,7 @@
-#pragma once
+#pragma once
 
 #include "Type.h"
+#include "Buffer.h"
 
 // 返回第一个符合的位置
 // 没有找到返回 -1
@@ -42,24 +43,28 @@ int ArrayToHex(byte* bs, int len, char* hex);
 int HexToArray(char* hex, int len, byte* bs);
 
 
-/// <summary>二分法查询</summary>
-/// <param name="array">从小到大排序的数组</param>
-/// <param name="len">数组长度</param>
-/// <param name="value">查询值</param>
-/// <returns>返回第一个有效值。 -1 未找到</returns>
+/**
+ * @brief 二分法查询
+ * @param array 从小到大排序的数组
+ * @param len 数组长度
+ * @param value 查询值
+ * @return 返回第一个有效值。 -1 未找到
+ */
 int DichotomyFind_Int(int* array, int len, int value);
 
 
 
-/// <summary>提取KEY。二分法查询结构体时使用</summary>
+/** @brief 提取KEY。二分法查询结构体时使用 */
 typedef int(*DichotomyGetKey)(void* array, int idx);
 
-/// <summary>二分法,从结构体查询</summary>
-/// <param name="array">结构体数组,按照KEY从小到大排序</param>
-/// <param name="len">结构体长度</param>
-/// <param name="func">获取KEY方法</param>
-/// <param name="key">查询项</param>
-/// <returns>返回第一个有效值。 -1 未找到</returns>
+/**
+ * @brief 二分法,从结构体查询
+ * @param array 结构体数组,按照KEY从小到大排序
+ * @param len 结构体长度
+ * @param func 获取KEY方法
+ * @param key 查询项
+ * @return 返回第一个有效值。 -1 未找到
+ */
 int DichotomyFind_Obj(void* array, int len, DichotomyGetKey func, int key);
 
 /*
Deleted +0 -81
Core/AsyncData.c
Deleted +0 -50
Core/AsyncData.h
Modified +1 -1
diff --git a/Core/BackMemory.c b/Core/BackMemory.c
index b44673a..c5a7431 100644
--- a/Core/BackMemory.c
+++ b/Core/BackMemory.c
@@ -1,4 +1,4 @@
-
+
 #include "BackMemory.h"
 #include "Debug.h"
 
Modified +1 -1
diff --git a/Core/BackMemory.h b/Core/BackMemory.h
index 230fd7a..2ad2b8b 100644
--- a/Core/BackMemory.h
+++ b/Core/BackMemory.h
@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
 
 /*
 实现目标/目的: 纯软件实现后备寄存器 BackupRegister  (见Lib_L2目录)
Modified +1 -1
diff --git a/Core/Base64.h b/Core/Base64.h
index 7578052..89dac6f 100644
--- a/Core/Base64.h
+++ b/Core/Base64.h
@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
 
 #include "Type.h"
 
Modified +29 -20
diff --git a/Core/BitHelper.c b/Core/BitHelper.c
index 23c3303..6a4e025 100644
--- a/Core/BitHelper.c
+++ b/Core/BitHelper.c
@@ -1,10 +1,12 @@
-
+
 #include "BitHelper.h"
 
-/// <summary>获取数组中的bit值</summary>
-/// <param name="idx">位置</param>
-/// <param name="data">数据源</param>
-/// <returns>1true,0false</returns>
+/**
+ * @brief 获取数组中的bit值
+ * @param idx 位置
+ * @param data 数据源
+ * @return 1true,0false
+ */
 __inline bool GetBit(byte* data, int idx)
 {
 	if (data == NULL)return false;
@@ -19,10 +21,12 @@ __inline bool GetBit(byte* data, int idx)
 	return true;
 }
 
-/// <summary>设置bit</summary>
-/// <param name="data"></param>
-/// <param name="idx"></param>
-/// <param name="value"></param>
+/**
+ * @brief 设置bit
+ * @param data
+ * @param idx
+ * @param value
+ */
 __inline void SetBit(byte* data, int idx, bool value)
 {
 	if (data == NULL)return;
@@ -45,16 +49,19 @@ __inline void SetBit(byte* data, int idx, bool value)
 	data[(idx >> 3)] = dat;
 }
 
-/// <summary>设置多bit</summary>
-/// <param name="dst">目标</param>
-/// <param name="dst_offset">目标偏移量</param>
-/// <param name="src">源</param>
-/// <param name="src_offset">源偏移量</param>
-/// <param name="bits">需要set的数量</param>
-void SetBits(byte* dst, int dst_offset, byte* src, int src_offset, int bits)
+/**
+ * @brief 设置多bit
+ * @param dst 目标
+ * @param dst_offset 目标偏移量
+ * @param src 源
+ * @param src_offset 源偏移量
+ * @param bits 需要set的数量
+ * @return 是否完成了
+ */
+bool SetBits(byte* dst, int dst_offset, byte* src, int src_offset, int bits)
 {
-	if (dst == NULL)return;
-	if (src == NULL)return;
+	if (dst == NULL)return false;
+	if (src == NULL)return false;
 
 	for (int i = 0; i < bits; i++)
 	{
@@ -64,9 +71,11 @@ void SetBits(byte* dst, int dst_offset, byte* src, int src_offset, int bits)
 		src_offset++;
 		dst_offset++;
 	}
+
+	return true;
 }
 
-/// <summary>字节bit倒序</summary>
+/** @brief 字节bit倒序 */
 byte BitReverse(byte data)
 {
 	byte res = 0;
@@ -81,7 +90,7 @@ byte BitReverse(byte data)
 	return res;
 }
 
-/// <summary>统计数组内所有bit 为1 的总数</summary>
+/** @brief 统计数组内所有bit 为1 的总数 */
 int BitCount(byte* data, int len)
 {
 	if (data == NULL)return 0;
Modified +29 -17
diff --git a/Core/BitHelper.h b/Core/BitHelper.h
index 494db4c..3d89c38 100644
--- a/Core/BitHelper.h
+++ b/Core/BitHelper.h
@@ -1,28 +1,40 @@
-#pragma once
+#pragma once
 
 #include "Type.h"
 
-/// <summary>获取数组中的bit值</summary>
-/// <param name="idx">位置</param>
-/// <param name="data">数据源</param>
-/// <returns>1 true,0 false</returns>
+/**
+ * @brief 获取数组中的bit值
+ * @param idx 位置
+ * @param data 数据源
+ * @return 1 true,0 false
+ */
 bool GetBit(byte* data, int idx);
 
-/// <summary>设置bit</summary>
-/// <param name="idx">位置</param>
-/// <param name="value">设定值</param>
+/**
+ * @brief 设置bit
+ * @param idx 位置
+ * @param value 设定值
+ */
 void SetBit(byte* data, int idx, bool value);
 
-/// <summary>设置多bit</summary>
-/// <param name="dst">目标</param>
-/// <param name="dst_offset">目标偏移量</param>
-/// <param name="src">源</param>
-/// <param name="src_offset">源偏移量</param>
-/// <param name="bits">需要set的数量</param>
-void SetBits(byte* dst, int dst_offset, byte* src, int src_offset, int bits);
+/**
+ * @brief 设置多bit
+ * @param dst 目标
+ * @param dst_offset 目标偏移量
+ * @param src 源
+ * @param src_offset 源偏移量
+ * @param bits 需要set的数量
+ * @return 是否完成了
+ */
+bool SetBits(byte* dst, int dst_offset, byte* src, int src_offset, int bits);
 
-/// <summary>字节bit倒序</summary>
+/** @brief 字节bit倒序 */
 byte BitReverse(byte data);
 
-/// <summary>统计数组内所有bit 为1 的总数</summary>
+/** @brief 统计数组内所有bit 为1 的总数 */
 int BitCount(byte* data, int len);
+
+/*
+不用额外写 bool GetBits(byte* dst, int dst_offset, byte* src, int src_offset, int bits);
+直接用  SetBits(byte* dst, int dst_offset, byte* src, int src_offset, int bits);  即可。
+*/
Modified +1 -1
diff --git a/Core/BitmapMlmeMem.c b/Core/BitmapMlmeMem.c
index f7109f8..dbfa3a4 100644
--- a/Core/BitmapMlmeMem.c
+++ b/Core/BitmapMlmeMem.c
@@ -1,4 +1,4 @@
-
+
 #include "BitmapMlmeMem.h"
 #ifdef DEBUG
 #include "Debug.h"
Modified +1 -1
diff --git a/Core/BitmapMlmeMem.h b/Core/BitmapMlmeMem.h
index d369138..7256f6c 100644
--- a/Core/BitmapMlmeMem.h
+++ b/Core/BitmapMlmeMem.h
@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
 
 #include "Type.h"
 // #include "FreeRTOS.h"
Deleted +0 -249
Core/BootLoad.c
Deleted +0 -35
Core/BootLoad.h
Deleted +0 -91
Core/BootLoadConfig.c
Deleted +0 -58
Core/BootLoadConfig.h
Added +65 -0
diff --git a/Core/Buffer.c b/Core/Buffer.c
new file mode 100644
index 0000000..0a96a4a
--- /dev/null
+++ b/Core/Buffer.c
@@ -0,0 +1,65 @@
+
+#include "Buffer.h"
+#include "Debug.h"
+
+__inline void InitBuffer(Buffer_t* data)	{ memset(data, 0x00, sizeof(Buffer_t));	data->Free = GlobleFree;}
+__inline void InitBuffer2(Buffer2_t* data)	{ memset(data, 0x00, sizeof(Buffer2_t));data->Free = GlobleFree;}
+
+__inline void TryCleanBuffer(Buffer_t* data)
+{
+	if (data->NeedFree)
+	{
+#ifdef DEBUG
+		if (data->Free == NULL)ErrPrintf("TryCleanBuffer Free = NULL");
+		if (data->Data == NULL)ErrPrintf("TryCleanBuffer p = NULL");
+#endif
+		data->Free(data->Data);
+		data->NeedFree = false;
+	}
+}
+
+__inline void TryCleanBuffer2(Buffer2_t* data)
+{
+	if (data->NeedFree)
+	{
+#ifdef DEBUG
+		if (data->Free == NULL)ErrPrintf("TryCleanBuffer2 Free = NULL");
+		if (data->FreePoint == NULL)ErrPrintf("TryCleanBuffer2 p = NULL");
+#endif
+		data->Free(data->FreePoint);
+		data->NeedFree = false;
+	}
+}
+
+void ShowArray(char* name, byte* pdata, int datalen, int showlen)
+{
+#ifdef DEBUG
+	uint printlen = datalen > showlen ? showlen : datalen;
+	DebugPrintf("%s [%d] = ", name, datalen);
+
+	if (printlen > 32)
+	{
+		for (int i = 0; i < printlen; i++)
+		{
+			if (i % 32 == 0)DebugPrintf("\r\n");
+			DebugPrintf("%02X ", pdata[i]);
+		}
+	}
+	else
+	{
+		for (int i = 0; i < printlen; i++)DebugPrintf("%02X ", pdata[i]);
+	}
+
+	DebugPrintf(printlen == datalen ? "\r\n" : "...\r\n");
+#endif
+}
+
+void ShowBuff(Buffer_t* buff, int len)
+{
+	ShowArray("",buff->Data,buff->Len,len);
+}
+
+void ShowBuff2(Buffer2_t* buff, int len)
+{
+	ShowArray("", buff->Data, buff->Len, len);
+}
Added +37 -0
diff --git a/Core/Buffer.h b/Core/Buffer.h
new file mode 100644
index 0000000..9d1c111
--- /dev/null
+++ b/Core/Buffer.h
@@ -0,0 +1,37 @@
+#pragma once
+#include "Type.h"
+
+// 缓冲区
+typedef struct
+{
+	byte* Data;
+	int Len;
+	bool NeedFree;
+	FreeFunc Free;
+}Buffer_t;
+
+// 缓冲区, 用于从特定内存中抽取一部分数据。
+typedef struct
+{
+	// 数据指针
+	byte* Data;
+	// 数据长度
+	uint Len;
+
+	// 是否需要 Free
+	bool NeedFree;
+	// Free 函数指针
+	FreeFunc Free;
+	// Free 函数测参数  data在这其中。
+	byte* FreePoint;
+}Buffer2_t;
+
+void InitBuffer(Buffer_t* data);
+void InitBuffer2(Buffer2_t* data);
+
+void TryCleanBuffer(Buffer_t* data);
+void TryCleanBuffer2(Buffer2_t* data);
+
+void ShowBuff(Buffer_t* buff, int len);
+void ShowBuff2(Buffer2_t* buff, int len);
+
Deleted +0 -91
Core/CheckConfig.c
Deleted +0 -14
Core/CheckConfig.h
Modified +22 -15
diff --git a/Core/CircularQueue.c b/Core/CircularQueue.c
index b7b8ff5..141a31a 100644
--- a/Core/CircularQueue.c
+++ b/Core/CircularQueue.c
@@ -1,4 +1,4 @@
-
+
 #include "CircularQueue.h"
 #ifdef DEBUG
 #include "Debug.h"
@@ -78,10 +78,12 @@ int CircularQueueWrites(CircularQueue_t* queue, byte* pdata, int len)
 	// return 0;
 }
 
-/// <summary>写7位压缩编码</summary>
-/// <param name="queue"></param>
-/// <param name="data"></param>
-/// <returns>返回写入的字节数</returns>
+/**
+ * @brief 写7位压缩编码
+ * @param queue
+ * @param data
+ * @return 返回写入的字节数
+ */
 int CircularQueueWriteCompressionUint(CircularQueue_t* queue, uint data)
 {
 	// 7位压缩编码。 取字节最高bit作为标记,标记后续字节还是不是内容。
@@ -217,10 +219,12 @@ bool CircularQueuePeeks(CircularQueue_t* queue, byte* pdata, int len)
 	return CircularQueueReads(queue, pdata, len, true) == len;
 }
 
-/// <summary>读7位压缩编码</summary>
-/// <param name="queue"></param>
-/// <param name="data">输出</param>
-/// <returns>返回读掉的长度</returns>
+/**
+ * @brief 读7位压缩编码
+ * @param queue
+ * @param data 输出
+ * @return 返回读掉的长度
+ */
 int CircularQueueReadCompressionUint(CircularQueue_t* queue, uint* data)
 {
 	// 7位压缩编码。 取字节最高bit作为标记,标记后续字节还是不是内容。
@@ -353,8 +357,10 @@ int CircularQueueIndexOf(CircularQueue_t* queue, byte* sub, int sublen)
 	return -1;
 }
 
-/// <summary>清空数据内容</summary>
-/// <param name="CQHandle"></param>
+/**
+ * @brief 清空数据内容
+ * @param CQHandle
+ */
 void CircularQueueClear(CircularQueue_t* queue)
 {
 	queue->pTail = queue->MemStart;
@@ -363,10 +369,11 @@ void CircularQueueClear(CircularQueue_t* queue)
 
 #include "Debug.h"
 
-/// <summary>打印队列内容</summary>
-/// <param name="CQHandle"></param>
-/// <param name="showlen">打印长度。 -1 表示全部</param>
-/// <returns></returns>
+/**
+ * @brief 打印队列内容
+ * @param CQHandle
+ * @param showlen 打印长度。 -1 表示全部
+ */
 void CircularQueueShow(CircularQueue_t* queue, int showlen)
 {
 	int currlen = CircularQueueGetLength(queue);
Modified +22 -15
diff --git a/Core/CircularQueue.h b/Core/CircularQueue.h
index 81f4c81..85c0ca6 100644
--- a/Core/CircularQueue.h
+++ b/Core/CircularQueue.h
@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
 
 #include "Type.h"
 
@@ -24,10 +24,12 @@ int CircularQueueWrite(CircularQueue_t* CQHandle, byte data);
 // 写入多字节,返回写入字节数
 int CircularQueueWrites(CircularQueue_t* CQHandle, byte* pdata, int len);
 
-/// <summary>写7位压缩编码</summary>
-/// <param name="queue"></param>
-/// <param name="data"></param>
-/// <returns>返回写入的字节数</returns>
+/**
+ * @brief 写7位压缩编码
+ * @param queue
+ * @param data
+ * @return 返回写入的字节数
+ */
 int CircularQueueWriteCompressionUint(CircularQueue_t* queue, uint data);
 
 // 获取有效数据长度
@@ -48,10 +50,12 @@ bool CircularQueuePeek(CircularQueue_t* queue, byte* pdata);
 // 尝试读数据s,peek 多字节。要么不成功,要么全成功
 bool CircularQueuePeeks(CircularQueue_t* queue, byte* pdata, int len);
 
-/// <summary>读7位压缩编码</summary>
-/// <param name="queue"></param>
-/// <param name="data">输出</param>
-/// <returns>返回读掉的长度</returns>
+/**
+ * @brief 读7位压缩编码
+ * @param queue
+ * @param data 输出
+ * @return 返回读掉的长度
+ */
 int CircularQueueReadCompressionUint(CircularQueue_t* queue, uint* data);
 
 // 移位,环形队列,只允许往前 seek,不许后退。
@@ -63,12 +67,15 @@ uint CircularQueueSeek(CircularQueue_t* CQHandle, uint offset);
 // 查找数据位置。没有找到返回 -1
 int CircularQueueIndexOf(CircularQueue_t* CQHandle, byte* data, int len);
 
-/// <summary>清空数据内容</summary>
-/// <param name="CQHandle"></param>
+/**
+ * @brief 清空数据内容
+ * @param CQHandle
+ */
 void CircularQueueClear(CircularQueue_t* CQHandle);
 
-/// <summary>打印队列内容</summary>
-/// <param name="CQHandle"></param>
-/// <param name="showlen">打印长度。 -1 表示全部</param>
-/// <returns></returns>
+/**
+ * @brief 打印队列内容
+ * @param CQHandle
+ * @param showlen 打印长度。 -1 表示全部
+ */
 void CircularQueueShow(CircularQueue_t* CQHandle, int showlen);
Modified +1 -1
diff --git a/Core/cJSON.c b/Core/cJSON.c
index 6e8c278..829f0f8 100644
--- a/Core/cJSON.c
+++ b/Core/cJSON.c
@@ -1,4 +1,4 @@
-
+
 #include "Type.h"
 #include "cJSON.h"
 
Modified +1 -1
diff --git a/Core/cJSON.h b/Core/cJSON.h
index 026250c..9aeea37 100644
--- a/Core/cJSON.h
+++ b/Core/cJSON.h
@@ -1,4 +1,4 @@
-
+
 #pragma once
 
 #include "Type.h"
Deleted +0 -46
Core/cJsonProcess.c
Deleted +0 -106
Core/cJsonProcess.h
Modified +53 -42
diff --git a/Core/ConfigBase.c b/Core/ConfigBase.c
index 91824a3..783892d 100644
--- a/Core/ConfigBase.c
+++ b/Core/ConfigBase.c
@@ -1,4 +1,4 @@
-
+
 #include "ConfigBase.h"
 #include "Flash.h"
 #include "Crc.h"
@@ -121,10 +121,11 @@ typedef struct
 	ushort Crc16;
 }FConfigItem_t;
 
-/// <summary>修正内部数据</summary>
-/// <param name="cfg">配置</param>
-/// <param name="idx">必要条件</param>
-/// <returns></returns>
+/**
+ * @brief 修正内部数据
+ * @param cfg 配置
+ * @param idx 必要条件
+ */
 static void FixFCfg(FConfigItem_t* cfg, ushort idx)
 {
 	cfg->Index = idx;
@@ -135,9 +136,10 @@ static void FixFCfg(FConfigItem_t* cfg, ushort idx)
 	// cfg->Crc16 = CaclcCRC16_MODBUS(p,sizeof(FConfigItem_t) - 2);
 }
 
-/// <summary>检查配置是否有效</summary>
-/// <param name="cfg"></param>
-/// <returns></returns>
+/**
+ * @brief 检查配置是否有效
+ * @param cfg
+ */
 static bool FCfgIsOK(FConfigItem_t* cfg) 
 {
 	if(cfg == NULL)return false;
@@ -152,10 +154,11 @@ static bool FCfgIsOK(FConfigItem_t* cfg)
 	return true;
 }
 
-/// <summary>所在块的块地址</summary>
-/// <param name="ctl"></param>
-/// <param name="idx"></param>
-/// <returns></returns>
+/**
+ * @brief 所在块的块地址
+ * @param ctl
+ * @param idx
+ */
 static uint FCfgSecAddr(FCfgCtrl_t* ctl,int idx)
 {
 	// 块个数
@@ -170,10 +173,11 @@ static uint FCfgSecAddr(FCfgCtrl_t* ctl,int idx)
 // #define FSECADDR(ctl,idx)  (ctl->FSecAddrs[(idx & ((1 << ctl->FSecBit) - 1)))])
 // FSECADDR FCfgSecAddr
 
-/// <summary>块内偏移量</summary>
-/// <param name="ctl"></param>
-/// <param name="idx"></param>
-/// <returns></returns>
+/**
+ * @brief 块内偏移量
+ * @param ctl
+ * @param idx
+ */
 static uint FSecOffset(FCfgCtrl_t* ctl,int idx)
 {
 	// 块内编号
@@ -190,13 +194,15 @@ static uint FSecOffset(FCfgCtrl_t* ctl,int idx)
 // #define FSECOFFSET(ctl,idx)  (sizeof(FConfigItem_t) * ((idx >> ctl->FSecBit) & (1 << ctl->FSecCfgBit) - 1))))
 // #define FSECOFFSET FSecOffset
 
-/// <summary>初始化</summary>
-/// <param name="ctl"></param>
-/// <param name="api">NOR FLASH 接口</param>
-/// <param name="sad">FLASH 块地址数组</param>
-/// <param name="sadlen">块数组长度</param>
-/// <param name="ccnt">块内 存放配置的份数</param>
-/// <returns>0 无错</returns>
+/**
+ * @brief 初始化
+ * @param ctl
+ * @param api NOR FLASH 接口
+ * @param sad FLASH 块地址数组
+ * @param sadlen 块数组长度
+ * @param ccnt 块内 存放配置的份数
+ * @return 0 无错
+ */
 int FCfgInit(FCfgCtrl_t* ctl, NorFlash_t* api, uint* sad, byte sadlen, byte ccnt)
 {
 	int err = 0;
@@ -235,10 +241,11 @@ int FCfgInit(FCfgCtrl_t* ctl, NorFlash_t* api, uint* sad, byte sadlen, byte ccnt
 	return err;
 }
 
-/// <summary>扫描整个 FLASH 存储区,找到最新且有效的配置取出来</summary>
-/// <param name="ctl"></param>
-/// <param name="cfg"></param>
-/// <returns></returns>
+/**
+ * @brief 扫描整个 FLASH 存储区,找到最新且有效的配置取出来
+ * @param ctl
+ * @param cfg
+ */
 bool FCfgLoad(FCfgCtrl_t* ctl, Config_t* cfg) 
 {
 	if(ctl == NULL)return false;
@@ -335,10 +342,11 @@ bool FCfgLoad(FCfgCtrl_t* ctl, Config_t* cfg)
 	return true;
 }
 
-/// <summary>写配置进去,地址为块首地址的时候擦除块。</summary>
-/// <param name="ctl"></param>
-/// <param name="cfg"></param>
-/// <returns></returns>
+/**
+ * @brief 写配置进去,地址为块首地址的时候擦除块。
+ * @param ctl
+ * @param cfg
+ */
 static bool FCfgWrite(FCfgCtrl_t* ctl, FConfigItem_t* cfg)
 {
 	if(ctl->FApi.FlashWrite == NULL)return false;
@@ -359,10 +367,11 @@ static bool FCfgWrite(FCfgCtrl_t* ctl, FConfigItem_t* cfg)
 	return ctl->FApi.FlashWrite(addr + offset, (byte*)cfg, sizeof(FConfigItem_t));
 }
 
-/// <summary>保存配置</summary>
-/// <param name="ctl"></param>
-/// <param name="cfg"></param>
-/// <returns></returns>
+/**
+ * @brief 保存配置
+ * @param ctl
+ * @param cfg
+ */
 bool FCfgSave(FCfgCtrl_t* ctl, Config_t* cfg)
 {
 	if(ctl == NULL)return false;
@@ -390,10 +399,11 @@ bool FCfgSave(FCfgCtrl_t* ctl, Config_t* cfg)
 	return res;
 }
 
-/// <summary>删除一个配置</summary>
-/// <param name="ctl"></param>
-/// <param name="idx"></param>
-/// <returns></returns>
+/**
+ * @brief 删除一个配置
+ * @param ctl
+ * @param idx
+ */
 bool FCfgClean(FCfgCtrl_t* ctl, int idx)
 {
 	if(ctl->FApi.FlashWrite == NULL)return false;
@@ -411,9 +421,10 @@ bool FCfgClean(FCfgCtrl_t* ctl, int idx)
 	return ctl->FApi.FlashWrite(addr+offset, (byte*)&magic, sizeof(magic));
 }
 
-/// <summary>擦除所有 FLASH 区域,一个不留</summary>
-/// <param name="ctl"></param>
-/// <returns></returns>
+/**
+ * @brief 擦除所有 FLASH 区域,一个不留
+ * @param ctl
+ */
 bool FCfgCleanAll(FCfgCtrl_t* ctl)
 {
 	if(ctl == NULL)return false;
Modified +29 -23
diff --git a/Core/ConfigBase.h b/Core/ConfigBase.h
index 8ce565b..f0a42e6 100644
--- a/Core/ConfigBase.h
+++ b/Core/ConfigBase.h
@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
 
 #include "Type.h"
 
@@ -103,36 +103,42 @@ FCfgInit(&FCtl, &nfunc, secAddr, ArrayLength(secAddr), 8);
 
 */
 
-/// <summary>初始化</summary>
-/// <param name="ctl"></param>
-/// <param name="api">NOR FLASH 接口</param>
-/// <param name="sad">FLASH 块地址数组</param>
-/// <param name="sadlen">块数组长度</param>
-/// <param name="ccnt">块内 存放配置的份数</param>
-/// <returns>0 无错</returns>
+/**
+ * @brief 初始化
+ * @param ctl
+ * @param api NOR FLASH 接口
+ * @param sad FLASH 块地址数组
+ * @param sadlen 块数组长度
+ * @param ccnt 块内 存放配置的份数
+ * @return 0 无错
+ */
 int FCfgInit(FCfgCtrl_t* ctl, NorFlash_t* api, uint* sad, byte sadlen, byte ccnt);
 
-/// <summary>扫描整个 FLASH 存储区,找到最新且有效的配置取出来</summary>
-/// <param name="ctl"></param>
-/// <param name="cfg"></param>
-/// <returns></returns>
+/**
+ * @brief 扫描整个 FLASH 存储区,找到最新且有效的配置取出来
+ * @param ctl
+ * @param cfg
+ */
 bool FCfgLoad(FCfgCtrl_t* ctl, Config_t* cfg);
 
-/// <summary>保存配置</summary>
-/// <param name="ctl"></param>
-/// <param name="cfg"></param>
-/// <returns></returns>
+/**
+ * @brief 保存配置
+ * @param ctl
+ * @param cfg
+ */
 bool FCfgSave(FCfgCtrl_t* ctl, Config_t* cfg);
 
-/// <summary>删除一个配置,应该用不到</summary>
-/// <param name="ctl"></param>
-/// <param name="idx"></param>
-/// <returns></returns>
+/**
+ * @brief 删除一个配置,应该用不到
+ * @param ctl
+ * @param idx
+ */
 bool FCfgClean(FCfgCtrl_t* ctl, int idx);
 
-/// <summary>擦除所有 FLASH 区域,一个不留</summary>
-/// <param name="ctl"></param>
-/// <returns></returns>
+/**
+ * @brief 擦除所有 FLASH 区域,一个不留
+ * @param ctl
+ */
 bool FCfgCleanAll(FCfgCtrl_t* ctl);
 
 
Modified +1 -1
diff --git a/Core/Convert.h b/Core/Convert.h
index 0ecd55a..0ebb6d3 100644
--- a/Core/Convert.h
+++ b/Core/Convert.h
@@ -1,4 +1,4 @@
-
+
 
 #ifndef __Convert_H__
 #define __Convert_H__
Modified +1 -1
diff --git a/Core/Crc.c b/Core/Crc.c
index 840b7a1..2f70b47 100644
--- a/Core/Crc.c
+++ b/Core/Crc.c
@@ -1,4 +1,4 @@
-#include "stdint.h"
+#include "stdint.h"
 #include "Type.h"
 #ifdef DEBUG
 #include "Debug.h"
Modified +1 -1
diff --git a/Core/Crc.h b/Core/Crc.h
index d91bfd0..e330ee3 100644
--- a/Core/Crc.h
+++ b/Core/Crc.h
@@ -1,4 +1,4 @@
-#ifndef __BSP_CRC_H
+#ifndef __BSP_CRC_H
 #define __BSP_CRC_H 	
 
 
Modified +8 -3
diff --git a/Core/Debug.c b/Core/Debug.c
index 5666351..e5335ca 100644
--- a/Core/Debug.c
+++ b/Core/Debug.c
@@ -1,4 +1,4 @@
-#include "Debug.h"
+#include "Debug.h"
 // #include "Uart.h"
 
 #ifdef DEBUG
@@ -16,6 +16,11 @@ bool FputcRegister(FPutcFunc func)
 
 	for (int i = 0; i < ArrayLength(Fputs); i++)
 	{
+		if (Fputs[i] == func) return true;		
+	}
+
+	for (int i = 0; i < ArrayLength(Fputs); i++)
+	{
 		if (Fputs[i] == NULL)
 		{
 			Fputs[i] = func;
@@ -46,14 +51,14 @@ bool FputcUnRegister(FPutcFunc func)
 // 逐字节输出。 printf 的最终输出。
 int fputc(int ch, FILE* f)
 {
-	bool out = false;
+	// bool out = false;
 
 	for (int i = 0; i < ArrayLength(Fputs); i++)
 	{
 		if (Fputs[i] != NULL)
 		{
 			Fputs[i](ch,f); 
-			out = true;
+			// out = true;
 		}
 	}
 
Modified +6 -5
diff --git a/Core/HardwareVersion.c b/Core/HardwareVersion.c
index f96372c..e207246 100644
--- a/Core/HardwareVersion.c
+++ b/Core/HardwareVersion.c
@@ -1,4 +1,4 @@
-
+
 #include "HardwareVersion.h"
 
 #include "Type.h"
@@ -61,10 +61,11 @@ uint GetHardwareVersion(void)
 	return minuint;
 }
 
-/// <summary>获取硬件版本,参考 HardwareVersion.c</summary>
-/// <param name="addr">固件起始地址</param>
-/// <param name="len">固件大小</param>
-/// <returns></returns>
+/**
+ * @brief 获取硬件版本,参考 HardwareVersion.c
+ * @param addr 固件起始地址
+ * @param len 固件大小
+ */
 uint GetHardwareVersion2(uint addr, int len)
 {
 	char* head = "HardwareTime/";
Modified +6 -5
diff --git a/Core/HardwareVersion.h b/Core/HardwareVersion.h
index 30b57b8..1c1efd1 100644
--- a/Core/HardwareVersion.h
+++ b/Core/HardwareVersion.h
@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
 
 #include "Type.h"
 #include "HardwareInfo.h"
@@ -26,8 +26,9 @@ extern const char* HardwareTime;
 // 版本号使用电路板时间减去 2000-1-1 00:00:00 得到的分钟数。
 uint GetHardwareVersion(void);
 
-/// <summary>获取硬件版本</summary>
-/// <param name="addr">固件起始地址</param>
-/// <param name="len">固件大小</param>
-/// <returns></returns>
+/**
+ * @brief 获取硬件版本
+ * @param addr 固件起始地址
+ * @param len 固件大小
+ */
 uint GetHardwareVersion2(uint addr, int len);
Modified +1 -1
diff --git a/Core/HotDataBase.c b/Core/HotDataBase.c
index 386513e..f425b1d 100644
--- a/Core/HotDataBase.c
+++ b/Core/HotDataBase.c
@@ -1,4 +1,4 @@
-
+
 #include "HotDataBase.h"
 #ifdef DEBUG
 #include "Debug.h"
Modified +1 -1
diff --git a/Core/HotDataBase.h b/Core/HotDataBase.h
index 037bc32..8ce0e60 100644
--- a/Core/HotDataBase.h
+++ b/Core/HotDataBase.h
@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
 
 #include "Type.h"
 
Modified +1 -1
diff --git a/Core/LengthFieldCodec.c b/Core/LengthFieldCodec.c
index 0177490..54b4b72 100644
--- a/Core/LengthFieldCodec.c
+++ b/Core/LengthFieldCodec.c
@@ -1,4 +1,4 @@
-
+
 #include "LengthFieldCodec.h"
 #include "CircularQueue.h"
 #include "Stream.h"
Modified +1 -1
diff --git a/Core/LengthFieldCodec.h b/Core/LengthFieldCodec.h
index 0de5930..218f135 100644
--- a/Core/LengthFieldCodec.h
+++ b/Core/LengthFieldCodec.h
@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
 
 #include "Type.h"
 
Modified +31 -27
diff --git a/Core/ModbusMaster.c b/Core/ModbusMaster.c
index b4f48db..4b3b9d4 100644
--- a/Core/ModbusMaster.c
+++ b/Core/ModbusMaster.c
@@ -11,7 +11,7 @@
 #include "SysHelper.h"
 #define FILE_ID  (2)
 
-// modbus rtu ��������
+// modbus rtu 主机部分
 #if 1
 
 bool RtuWriteReg(RtuMst_t* thiss, ushort addr, ushort regaddr, ushort data, int timeout)
@@ -114,7 +114,7 @@ bool RtuReadReg(RtuMst_t* thiss, ushort addr, ushort regaddr, ushort* data, int 
 		}
 		if (pklen < 0)
 		{
-			// ������ȥ��һ���ֽڣ�������
+			// 出错,去掉一个字节,往后找
 			CircularQueueSeek(queue, 1);
 		}
 
@@ -152,7 +152,7 @@ bool RtuReadRegs(RtuMst_t* thiss, ushort addr, ushort regaddr, byte* data, int d
 		}
 		if (pklen < 0)
 		{
-			// ������ȥ��һ���ֽڣ�������
+			// 出错,去掉一个字节,往后找
 			CircularQueueSeek(queue, 1);
 		}
 
@@ -164,42 +164,45 @@ bool RtuReadRegs(RtuMst_t* thiss, ushort addr, ushort regaddr, byte* data, int d
 #endif
 
 
-// ����һ����Ŀ�Ĵ��룬�����ο���
+// 另外一个项目的代码,仅供参考。
 #if 0
 
 #include "RS485_2.h"
 static RtuMst_t RtuMst = { 0 };
 static void _DelayMs(int ms) { vTaskDelay(pdMS_TO_TICKS(ms)); }
 
-/// <summary>ִ�ж���</summary>
-/// <param name="devAddr"></param>
-/// <param name="value">��ͣ</param>
-/// <param name="speed">�ٶ�</param>
-/// <returns></returns>
+/**
+ * @brief 执行动作
+ * @param devAddr
+ * @param value 启停
+ * @param speed 速度
+ */
 bool _C41B_Act(int devAddr, bool value, ushort speed)
 {
 	dTraceThiss(FILE_ID);
 
 	if (value)
 	{
-		// ���쳣
+		// 清异常
 		if (!RtuWriteReg(&RtuMst, devAddr, 0x2007, 0x0001, 100))return false;
 		vTaskDelay(pdMS_TO_TICKS(5));
-		// �����ٶ�
+		// 设置速度
 		if (!RtuWriteReg(&RtuMst, devAddr, 0x2002, speed, 100))return false;
 		vTaskDelay(pdMS_TO_TICKS(5));
 	}
 
-	// ��ͣ
+	// 启停
 	bool result = RtuWriteReg(&RtuMst, devAddr, 0x2001, value ? 0x0001 : 0x0000, 100);
-	// �Ӹ��ӳ٣��������߷�æ
+	// 加个延迟,避免总线繁忙
 	if (result) vTaskDelay(pdMS_TO_TICKS(5));
 	return result;
 }
 
-/// <summary>���������</summary>
-/// <param name="devAddr"></param>
-/// <returns>0-300 ֮�䣬-1 δ����</returns>
+/**
+ * @brief 读电机电流
+ * @param devAddr
+ * @return 0-300 之间,-1 未读到
+ */
 int _C41B_Is(int devAddr)
 {
 	ushort Is = 0;
@@ -208,9 +211,10 @@ int _C41B_Is(int devAddr)
 	return Is;
 }
 
-/// <summary>������ٶ�</summary>
-/// <param name="devAddr"></param>
-/// <returns></returns>
+/**
+ * @brief 读电机速度
+ * @param devAddr
+ */
 bool _C41B_Speed(int devAddr, short* spd)
 {
 	short speed = 0;
@@ -223,11 +227,11 @@ bool _C41B_Speed(int devAddr, short* spd)
 #include "BitHelper.h"
 #include "SysInfo.h"
 
-/// <summary>�豸״̬���������״̬����״̬����</summary>
+/** @brief 设备状态,根据这个状态进行状态跟踪 */
 static ushort _Enables = 0;
 
 #define __DEF_SPEED 1500
-/// <summary>���Ĭ���ٶ�</summary>
+/** @brief 电机默认速度 */
 static ushort _Speed = __DEF_SPEED;
 
 void _C41B_Task(void* param)
@@ -262,13 +266,13 @@ void _C41B_Task(void* param)
 			{
 				vTaskDelay(pdMS_TO_TICKS(50));
 
-				// Ŀ��״̬
+				// 目标状态
 				bool en = GetBit((byte*)&_Enables, i);
 				int devAddr = i + 3;
 
 				for (int j = 0; j < 5; j++)
 				{
-					// // ����
+					// // 电流
 					// short currspeed = 0;
 					// if (!_C41B_Speed(devAddr, &currspeed))
 					// {
@@ -276,13 +280,13 @@ void _C41B_Task(void* param)
 					// 	continue;
 					// }
 
-					// ��ǰ״̬
+					// 当前状态
 					// bool run = (currspeed != 0);
 
-					// �޸Ĺ�ȥ
+					// 修改过去
 					// if (run != en)
 					{
-						// �ɹ��Ͳ�������
+						// 成功就不尝试了
 						if (_C41B_Act(devAddr, en, _Speed))
 						{
 							DebugPrintf("_C41B_Act(%d,%s,%d) true\r\n", devAddr, en ? "true" : "false", _Speed);
@@ -312,7 +316,7 @@ void C41B_SetEnable(int idx, bool value)
 		return;
 	}
 
-	// û�б仯��
+	// 没有变化。
 	if (old == value)return;
 	if (_TaskHandle != NULL)vTaskResume(_TaskHandle);
 	DebugPrintf("C41B_SetEnable %d %s\r\n", idx, value ? "true" : "false");
Modified +13 -9
diff --git a/Core/ModbusMaster.h b/Core/ModbusMaster.h
index fba5efa..9497ff7 100644
--- a/Core/ModbusMaster.h
+++ b/Core/ModbusMaster.h
@@ -3,16 +3,16 @@
 #include "Type.h"
 #include "CircularQueue.h"
 
-// modbus rtu ��������
+// modbus rtu 主机部分
 #if 1
 
 typedef struct
 {
-	/// <summary>����</summary>
+	/** @brief 发送 */
 	void(*Send)(byte* data, int len);
-	/// <summary>������</summary>
+	/** @brief 收数据 */
 	CircularQueue_t* RxQueue;
-	/// <summary>�ӳ٣��ȴ����ݣ�</summary>
+	/** @brief 延迟(等待数据) */
 	void(*Delay)(int ms);
 }RtuMst_t;
 
@@ -26,12 +26,16 @@ bool RtuReadRegs(RtuMst_t* thiss, ushort addr, ushort regaddr, byte* data, int d
 #endif
 
 /*
-/// <summary>C41B ��Ƶ����ͣ</summary>
-/// <param name="idx"></param>
-/// <param name="value"></param>
+/**
+ * @brief C41B 变频器启停
+ * @param idx
+ * @param value
+ */
 void C41B_SetEnable(int idx, bool value);
 
-/// <summary>�����ٶ�</summary>
-/// <param name="spd"></param>
+/**
+ * @brief 设置速度
+ * @param spd
+ */
 void C41B_SetSpeed(ushort spd);
 */
Modified +10 -6
diff --git a/Core/ModbusRtuCodec.c b/Core/ModbusRtuCodec.c
index d0b79c1..f2cee83 100644
--- a/Core/ModbusRtuCodec.c
+++ b/Core/ModbusRtuCodec.c
@@ -121,9 +121,11 @@ int MrcSlaveGetLenStream(Stream_t* st)
 	return MrcSlaveGetLength(p, remain);
 }
 
-/// <summary>通过包头计算数据长度,不校验</summary>
-/// <param name="p">最少给3个字节的数组</param>
-/// <returns>理论上包长。-1 数据包类型不对,0 p为null</returns>
+/**
+ * @brief 通过包头计算数据长度,不校验
+ * @param p 最少给3个字节的数组
+ * @return 理论上包长。-1 数据包类型不对,0 p为null
+ */
 static int _masterCalcRxLen(byte* p)
 {
 	if (p == NULL)return 0;
@@ -235,9 +237,11 @@ int MrcMasterGetRxLenStream(Stream_t* st)
 	return MrcMasterGetRxLength(p, remain);
 }
 
-/// <summary>获取应答消息内负载数据的偏移量</summary>
-/// <param name="pkt">已经校验通过的数据包</param>
-/// <returns>返回偏移量,-1 消息类型错误,0 无负载数据</returns>
+/**
+ * @brief 获取应答消息内负载数据的偏移量
+ * @param pkt 已经校验通过的数据包
+ * @return 返回偏移量,-1 消息类型错误,0 无负载数据
+ */
 int MrcMasterGetRxPyOffset(byte* pkt)
 {
 	if (pkt == NULL)return 0;
Modified +6 -4
diff --git a/Core/ModbusRtuCodec.h b/Core/ModbusRtuCodec.h
index fa8b476..8ed0128 100644
--- a/Core/ModbusRtuCodec.h
+++ b/Core/ModbusRtuCodec.h
@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
 
 #include "Type.h"
 #include "Stream.h"
@@ -65,9 +65,11 @@ int MrcMasterGetRxLength(byte* p, int len);
 int MrcMasterGetRxLenCircularQueue(CircularQueue_t* queue);
 int MrcMasterGetRxLenStream(Stream_t* st);
 
-/// <summary>获取应答消息内负载数据的偏移量</summary>
-/// <param name="pkt">已经校验通过的数据包</param>
-/// <returns>返回偏移量,-1 消息类型错误,0 无负载数据</returns>
+/**
+ * @brief 获取应答消息内负载数据的偏移量
+ * @param pkt 已经校验通过的数据包
+ * @return 返回偏移量,-1 消息类型错误,0 无负载数据
+ */
 int MrcMasterGetRxPyOffset(byte* pkt);
 
 
Modified +53 -53
diff --git a/Core/ModbusSlave.c b/Core/ModbusSlave.c
index 6c1ee97..03648d8 100644
--- a/Core/ModbusSlave.c
+++ b/Core/ModbusSlave.c
@@ -17,11 +17,11 @@ void ModbusRtuMsgProcess(const ModbusSlave_t* mrs, byte* p, int pklen, void* sen
 	if (mrs == NULL)return;
 	if (mrs->SlaveAddr == NULL)return;
 
-	// �����õĻ�����
+	// 发送用的缓冲区
 	byte tx[264];
 	byte* txpy = tx + 8;
 
-	// �����ݰ�
+	// 解数据包
 	byte addr = p[0];
 	byte cmd = p[1];
 
@@ -29,23 +29,23 @@ void ModbusRtuMsgProcess(const ModbusSlave_t* mrs, byte* p, int pklen, void* sen
 	{
 		switch (cmd)
 		{
-		case 1:	// �������Ȧ
-		case 2: // ������
+		case 1:	// 读输出线圈
+		case 2: // 读输入
 		{
-			// ����һ�´��
+			// 处理一下大端
 			ushort	regaddr = (p[2] << 8) + p[3];
 			ushort	bitcnt = (p[4] << 8) + p[5];
 
-			// ��ջ�����
+			// 清空缓冲区
 			memset(txpy, 0x00, bitcnt / 8 + 1);
-			// �� bit �ռ�
+			// 读 bit 空间
 			if (mrs->BitAreas != NULL) AreaRead2(mrs->BitAreas, regaddr, txpy, bitcnt, true);
 			int txlen = MrcResult01a02(addr, cmd, txpy, bitcnt, tx, sizeof(tx));
 
 			LogShowArray("-> ", tx, txlen, 16);
 			if (mrs->Send != NULL) mrs->Send(tx, txlen, sendparam);
 		}break;
-		// д�����Ȧ
+		// 写输出线圈
 		case 5:
 		{
 			ushort regaddr = (p[2] << 8) + p[3];
@@ -57,7 +57,7 @@ void ModbusRtuMsgProcess(const ModbusSlave_t* mrs, byte* p, int pklen, void* sen
 			LogShowArray("-> ", p, pklen, 16);
 			if (mrs->Send != NULL) mrs->Send(p, pklen, sendparam);
 		}break;
-		// д�����ȦS
+		// 写输出线圈S
 		case 0x0f:
 		{
 			ushort regaddr = (p[2] << 8) + p[3];
@@ -69,17 +69,17 @@ void ModbusRtuMsgProcess(const ModbusSlave_t* mrs, byte* p, int pklen, void* sen
 			LogShowArray("-> ", tx, txlen, 16);
 			if (mrs->Send != NULL) mrs->Send(tx, txlen, sendparam);
 		}break;
-		case 3:	// ��������ּĴ���
-		case 4:	// ������Ĵ���
+		case 3:	// 读多个保持寄存器
+		case 4:	// 读输入寄存器
 		{
-			// ����һ�´��
+			// 处理一下大端
 			ushort	regaddr = (p[2] << 8) + p[3];
 			ushort	regcnt = (p[4] << 8) + p[5];
 
-			// ��ջ�����
+			// 清空缓冲区
 			memset(txpy, 0x00, regcnt * 2);
-			// �� byte �ռ�
-			// modbus ��ַ��Ӧ���� 2�ֽڣ���ַ��Ҫ X2 ��Ӧ�ֽڿռ䡣
+			// 读 byte 空间
+			// modbus 地址对应的是 2字节,地址需要 X2 对应字节空间。
 			if (mrs->ByteAreas != NULL) AreaRead2(mrs->ByteAreas, regaddr * 2, txpy, regcnt * 2, false);
 			int txlen = MrcResult03a04(addr, cmd, txpy, regcnt, tx, sizeof(tx));
 
@@ -87,12 +87,12 @@ void ModbusRtuMsgProcess(const ModbusSlave_t* mrs, byte* p, int pklen, void* sen
 			if (mrs->Send != NULL) mrs->Send(tx, txlen, sendparam);
 		}
 		break;
-		case 6:	// д�����Ĵ���
+		case 6:	// 写单个寄存器
 		{
 			ushort regaddr = (p[2] << 8) + p[3];
 			ushort regdata = (p[4] << 8) + p[5];
 
-			// modbus ��ַ��Ӧ���� 2�ֽڣ���ַ��Ҫ X2 ��Ӧ�ֽڿռ䡣
+			// modbus 地址对应的是 2字节,地址需要 X2 对应字节空间。
 			if (mrs->ByteAreas != NULL) AreaWrite2(mrs->ByteAreas, regaddr * 2, (byte*)&regdata, 2, false);
 
 			LogShowArray("-> ", p, pklen, 16);
@@ -103,7 +103,7 @@ void ModbusRtuMsgProcess(const ModbusSlave_t* mrs, byte* p, int pklen, void* sen
 			ushort regaddr = (p[2] << 8) + p[3];
 			ushort regcnt = (p[4] << 8) + p[5];
 
-			// modbus ��ַ��Ӧ���� 2�ֽڣ���ַ��Ҫ X2 ��Ӧ�ֽڿռ䡣
+			// modbus 地址对应的是 2字节,地址需要 X2 对应字节空间。
 			if (mrs->ByteAreas != NULL) AreaWrite2(mrs->ByteAreas, regaddr * 2, &p[7], regcnt * 2, false);
 			int txlen = MrcResult10(addr, regaddr, regcnt, tx, sizeof(tx));
 
@@ -120,11 +120,11 @@ void ModbusRtuTryProcess(CircularQueue_t* queue, const ModbusSlave_t* mrs, void*
 {
 	if (queue == NULL)return;
 
-	// ���ݰ�����
+	// 数据包长度
 	int pklen = MrcSlaveGetLenCircularQueue(queue);
-	// ������
+	// 不够长
 	if (pklen == 0)return;
-	// �������
+	// 有问题的包
 	if (pklen < 0) 
 	{
 		// byte data = 0;
@@ -134,11 +134,11 @@ void ModbusRtuTryProcess(CircularQueue_t* queue, const ModbusSlave_t* mrs, void*
 		return; 
 	}
 
-	// ������
+	// 读数据
 	byte* p = (byte*)GlobleMalloc(pklen + 4);
 	CircularQueueReads(queue, p, pklen, false);
 
-	// ��������
+	// 处理数据
 	ModbusRtuMsgProcess(mrs, p, pklen, sendparam);
 
 	// free
@@ -155,49 +155,49 @@ void ModbusTcpMsgProcess(const ModbusSlave_t* mrs, byte* pk, int pklen, void* se
 
 	byte* p = pk + 6;
 
-	// TCP ����Ҫ byte addr = p[0];
-	// ����Ҫ head��ԭ�����ص� head
+	// TCP 不需要 byte addr = p[0];
+	// 但是要 head,原样返回的 head
 	MtcHead_t* head = (MtcHead_t*)pk;
 	byte cmd = p[1];
 
-	// �����õĻ�����
+	// 发送用的缓冲区
 	byte tx[272];
 	byte* txpy = tx + 16;
 	// int txpylen = sizeof(tx) - 16;
 
 	switch (cmd)
 	{
-		// ������
+		// 读输入
 	case 2:
 	{
 		ushort	regaddr = (p[2] << 8) + p[3];
 		ushort	bitcnt = (p[4] << 8) + p[5];
 
-		// ��ջ�����
+		// 清空缓冲区
 		memset(txpy, 0x00, bitcnt / 8 + 1);
-		// �� bit �ռ�
+		// 读 bit 空间
 		if (mrs->BitAreas != NULL)AreaRead2(mrs->BitAreas, regaddr, txpy, bitcnt, true);
 		int txlen = MtcResult01a02(head, cmd, txpy, bitcnt, tx, sizeof(tx));
 
 		LogShowArray("-> ", tx, txlen, 16);
 		if (mrs->Send != NULL)mrs->Send(tx, txlen, sendparam);
 	}break;
-	// �������Ȧ
+	// 读输出线圈
 	case 1:
 	{
 		ushort	regaddr = (p[2] << 8) + p[3];
 		ushort	bitcnt = (p[4] << 8) + p[5];
 
-		// ��ջ�����
+		// 清空缓冲区
 		memset(txpy, 0x00, bitcnt / 8 + 1);
-		// �� bit �ռ�
+		// 读 bit 空间
 		if (mrs->BitAreas != NULL)AreaRead2(mrs->BitAreas, regaddr, txpy, bitcnt, true);
 		int txlen = MtcResult01a02(head, cmd, txpy, bitcnt, tx, sizeof(tx));
 
 		LogShowArray("-> ", tx, txlen, 16);
 		if (mrs->Send != NULL)mrs->Send(tx, txlen, sendparam);
 	}break;
-	// д�����Ȧ
+	// 写输出线圈
 	case 5:
 	{
 		ushort regaddr = (p[2] << 8) + p[3];
@@ -209,7 +209,7 @@ void ModbusTcpMsgProcess(const ModbusSlave_t* mrs, byte* pk, int pklen, void* se
 		LogShowArray("-> ", pk, pklen, 16);
 		if (mrs->Send != NULL)mrs->Send(pk, pklen, sendparam);
 	}break;
-	// д�����ȦS
+	// 写输出线圈S
 	case 0x0f:
 	{
 		ushort regaddr = (p[2] << 8) + p[3];
@@ -223,17 +223,17 @@ void ModbusTcpMsgProcess(const ModbusSlave_t* mrs, byte* pk, int pklen, void* se
 	}break;
 
 
-	case 3:	// ��������ּĴ���
-	case 4:	// ������Ĵ���
+	case 3:	// 读多个保持寄存器
+	case 4:	// 读输入寄存器
 	{
-		// ����һ�´��
+		// 处理一下大端
 		ushort	regaddr = (p[2] << 8) + p[3];
 		ushort	regcnt = (p[4] << 8) + p[5];
 
-		// ��ջ�����
+		// 清空缓冲区
 		memset(txpy, 0x00, regcnt * 2);
-		// �� byte �ռ�
-		// modbus ��ַ��Ӧ���� 2�ֽڣ���ַ��Ҫ X2 ��Ӧ�ֽڿռ䡣
+		// 读 byte 空间
+		// modbus 地址对应的是 2字节,地址需要 X2 对应字节空间。
 		if (mrs->ByteAreas != NULL)AreaRead2(mrs->ByteAreas, regaddr * 2, txpy, regcnt * 2, false);
 		int txlen = MtcResult03a04(head, cmd, txpy, regcnt, tx, sizeof(tx));
 
@@ -241,12 +241,12 @@ void ModbusTcpMsgProcess(const ModbusSlave_t* mrs, byte* pk, int pklen, void* se
 		if (mrs->Send != NULL)mrs->Send(tx, txlen, sendparam);
 	}
 	break;
-	case 6:	// д�����Ĵ���
+	case 6:	// 写单个寄存器
 	{
 		ushort regaddr = (p[2] << 8) + p[3];
 		ushort regdata = (p[4] << 8) + p[5];
 
-		// modbus ��ַ��Ӧ���� 2�ֽڣ���ַ��Ҫ X2 ��Ӧ�ֽڿռ䡣
+		// modbus 地址对应的是 2字节,地址需要 X2 对应字节空间。
 		if (mrs->ByteAreas != NULL)AreaWrite2(mrs->ByteAreas, regaddr * 2, (byte*)&regdata, 2, false);
 
 		LogShowArray("-> ", pk, pklen, 16);
@@ -257,7 +257,7 @@ void ModbusTcpMsgProcess(const ModbusSlave_t* mrs, byte* pk, int pklen, void* se
 		ushort regaddr = (p[2] << 8) + p[3];
 		ushort regcnt = (p[4] << 8) + p[5];
 
-		// modbus ��ַ��Ӧ���� 2�ֽڣ���ַ��Ҫ X2 ��Ӧ�ֽڿռ䡣
+		// modbus 地址对应的是 2字节,地址需要 X2 对应字节空间。
 		if (mrs->ByteAreas != NULL)AreaWrite2(mrs->ByteAreas, regaddr * 2, &p[7], regcnt * 2, false);
 		int txlen = MtcResult10(head, regaddr, regcnt, tx, sizeof(tx));
 
@@ -274,16 +274,16 @@ void ModbusTcpTryProcess(CircularQueue_t* queue, const ModbusSlave_t* mrs, void*
 	if (queue == NULL)return;
 
 	int pklen = MtcGetLenCircularQueue(queue);
-	// ������
+	// 不够长
 	if (pklen == 0)return;
-	// �������
+	// 有问题的包
 	if (pklen < 0) { CircularQueueSeek(queue, 1); return; }
 
-	// ������
+	// 读数据
 	byte* pk = (byte*)GlobleMalloc(pklen + 4);
 	CircularQueueReads(queue, pk, pklen, false);
 
-	// ��������
+	// 处理数据
 	ModbusTcpMsgProcess(mrs, pk, pklen, sendparam);
 
 	// free
@@ -292,16 +292,16 @@ void ModbusTcpTryProcess(CircularQueue_t* queue, const ModbusSlave_t* mrs, void*
 
 void ModbusUdpTryProcess(Stream_t* ms, const ModbusSlave_t* mrs, void* sendparam)
 {
-	// ��Ϊ UDP ���������ݰ�ճ�����⣬������һ���Ե��
-	// û��ʹ�� CircularQueue_t �������
-	// ʹ�� Stream_t  ����  Buffer �����ԡ�
-	// UDP ���ݰ��� TCP ��ȫ��ͬ��
+	// 因为 UDP 不存在数据包粘连问题,而且是一次性到达。
+	// 没有使用 CircularQueue_t 的情况。
+	// 使用 Stream_t  或者  Buffer 都可以。
+	// UDP 数据包与 TCP 完全相同。
 	if (ms == NULL)return;
 	// if (StreamRemian(ms) < 12)return;
 	int pklen = MtcGetLenStream(ms);
-	// ������ ���� ���ݰ������⡣
+	// 不够长 或者 数据包有问题。
 	if (pklen <= 0)return;
 
-	// ��������
+	// 处理数据
 	ModbusTcpMsgProcess(mrs, ms->MemStart + ms->Position, pklen, sendparam);
 }
Modified +36 -27
diff --git a/Core/ModbusSlave.h b/Core/ModbusSlave.h
index 9ece7b2..3b07140 100644
--- a/Core/ModbusSlave.h
+++ b/Core/ModbusSlave.h
@@ -7,45 +7,54 @@
 
 typedef struct
 {
-	/// <summary>��վ��ַ,С�������ָ��</summary>
+	/** @brief 从站地址,小心这个是指针 */
 	byte* SlaveAddr;
-	/// <summary>���</summary>
+	/** @brief 位区域 */
 	Area_t* BitAreas;
-	/// <summary>�ֽ�����ע��modbus�Ĵ�����2�ֽ�</summary>
+	/** @brief 字节区域,注意modbus寄存器是2字节 */
 	Area_t* ByteAreas;
-	/// <summary>���ͺ�����param �ṩ���������Ŀ��ܣ����紮�ں�</summary>
+	/** @brief 发送函数,param 提供其他参数的可能,比如串口号 */
 	void(*Send)(byte* data, int len, void* param);
 }ModbusSlave_t;
 
-/// <summary>MODBUS RTU ���ݰ�����</summary>
-/// <param name="mrs"></param>
-/// <param name="p"></param>
-/// <param name="pklen"></param>
-/// <param name="sendparam">mrs->Send �����ĵ���������</param>
+/**
+ * @brief MODBUS RTU 数据包处理
+ * @param mrs
+ * @param p
+ * @param pklen
+ * @param sendparam mrs->Send 函数的第三个参数
+ */
 void ModbusRtuMsgProcess(const ModbusSlave_t* mrs, byte* p, int pklen, void* sendparam);
 
-/// <summary>���Դ��� MODBUS RTU ����</summary>
-/// <param name="queue"></param>
-/// <param name="mrs"></param>
-/// <param name="sendparam">mrs->Send �����ĵ���������</param>
+/**
+ * @brief 尝试处理 MODBUS RTU 数据
+ * @param queue
+ * @param mrs
+ * @param sendparam mrs->Send 函数的第三个参数
+ */
 void ModbusRtuTryProcess(CircularQueue_t* queue, const ModbusSlave_t* mrs, void* sendparam);
 
-/// <summary>MODBUS TCP ���ݰ�����</summary>
-/// <param name="mrs">ע�⣺��ʹ�� SlaveAddr �ֶ�</param>
-/// <param name="pk"></param>
-/// <param name="pklen"></param>
-/// <param name="sendparam">mrs->Send �����ĵ���������</param>
+/**
+ * @brief MODBUS TCP 数据包处理
+ * @param mrs 注意:不使用 SlaveAddr 字段
+ * @param pk
+ * @param pklen
+ * @param sendparam mrs->Send 函数的第三个参数
+ */
 void ModbusTcpMsgProcess(const ModbusSlave_t* mrs, byte* pk, int pklen, void* sendparam);
 
-/// <summary>���Դ��� MODBUS TCP ����</summary>
-/// <param name="queue"></param>
-/// <param name="mrs">ע�⣺��ʹ�� SlaveAddr �ֶ�</param>
-/// <param name="sendparam">mrs->Send �����ĵ���������</param>
+/**
+ * @brief 尝试处理 MODBUS TCP 数据
+ * @param queue
+ * @param mrs 注意:不使用 SlaveAddr 字段
+ * @param sendparam mrs->Send 函数的第三个参数
+ */
 void ModbusTcpTryProcess(CircularQueue_t* queue, const ModbusSlave_t* mrs, void* sendparam);
 
-/// <summary>���Դ��� MODBUS TCP/UDP ����</summary>
-/// <param name="ms"></param>
-/// <param name="mrs">ע�⣺��ʹ�� SlaveAddr �ֶ�</param>
-/// <param name="sendparam">mrs->Send �����ĵ���������</param>
-/// <remake>Modbus tcp/udp ���ݱ�������ͬ�ģ�udp ���� CircularQueue_t ����ճ�����⣬�� Stream_t �����</remake>
+/**
+ * @brief 尝试处理 MODBUS TCP/UDP 数据
+ * @param ms
+ * @param mrs 注意:不使用 SlaveAddr 字段
+ * @param sendparam mrs->Send 函数的第三个参数
+ */
 void ModbusUdpTryProcess(Stream_t* ms, const ModbusSlave_t* mrs, void* sendparam);
Modified +5 -3
diff --git a/Core/ModbusTcpCodec.c b/Core/ModbusTcpCodec.c
index e84031a..1f4234e 100644
--- a/Core/ModbusTcpCodec.c
+++ b/Core/ModbusTcpCodec.c
@@ -38,9 +38,11 @@ int MtcGetLenStream(Stream_t* st)
 	return res;
 }
 
-/// <summary>获取应答消息内负载数据的偏移量</summary>
-/// <param name="pkt">已经校验通过的数据包</param>
-/// <returns>返回偏移量,-1 消息类型错误,0 无负载数据</returns>
+/**
+ * @brief 获取应答消息内负载数据的偏移量
+ * @param pkt 已经校验通过的数据包
+ * @return 返回偏移量,-1 消息类型错误,0 无负载数据
+ */
 int MtcMasterGetRxPyOffset(byte* pkt)
 {
 	if (pkt == NULL)return 0;
Modified +6 -4
diff --git a/Core/ModbusTcpCodec.h b/Core/ModbusTcpCodec.h
index e514b02..dd0d67c 100644
--- a/Core/ModbusTcpCodec.h
+++ b/Core/ModbusTcpCodec.h
@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
 
 #include "Type.h"
 #include "Stream.h"
@@ -28,9 +28,11 @@ int MtcGetLength(byte* p, int len);
 int MtcGetLenCircularQueue(CircularQueue_t* queue);
 int MtcGetLenStream(Stream_t* st);
 
-/// <summary>获取应答消息内负载数据的偏移量</summary>
-/// <param name="pkt">已经校验通过的数据包</param>
-/// <returns>返回偏移量,-1 消息类型错误,0 无负载数据</returns>
+/**
+ * @brief 获取应答消息内负载数据的偏移量
+ * @param pkt 已经校验通过的数据包
+ * @return 返回偏移量,-1 消息类型错误,0 无负载数据
+ */
 int MtcMasterGetRxPyOffset(byte* pkt);
 
 #pragma pack(push)
Modified +1 -1
diff --git a/Core/MyList.c b/Core/MyList.c
index 8abea7d..f1d94a7 100644
--- a/Core/MyList.c
+++ b/Core/MyList.c
@@ -1,4 +1,4 @@
-#include "MyList.h"
+#include "MyList.h"
 
 /**
  * 获取链表长度
Modified +1 -1
diff --git a/Core/MyList.h b/Core/MyList.h
index 53746e8..d2ddfe9 100644
--- a/Core/MyList.h
+++ b/Core/MyList.h
@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
 
 #ifndef __MyList_H__
 #define __MyList_H__
Modified +1 -1
diff --git a/Core/MyString.c b/Core/MyString.c
index 0274844..eea3456 100644
--- a/Core/MyString.c
+++ b/Core/MyString.c
@@ -1,4 +1,4 @@
-
+
 #include "MyString.h"
 #include "Array.h"
 
Modified +1 -1
diff --git a/Core/MyString.h b/Core/MyString.h
index 4765e12..f2206c9 100644
--- a/Core/MyString.h
+++ b/Core/MyString.h
@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
 
 #include "Type.h"
 
Deleted +0 -138
Core/OtaImageLoad.c
Deleted +0 -36
Core/OtaImageLoad.h
Modified +89 -70
diff --git a/Core/RpcMsg.c b/Core/RpcMsg.c
index f3104ee..6949953 100644
--- a/Core/RpcMsg.c
+++ b/Core/RpcMsg.c
@@ -3,20 +3,22 @@
 // #include "Array.h"
 #include "Debug.h"
 
-// StreamCurrPoint() ����ȫ�������ٶ������١����ļ������жϺܶ࣬����ֱ��ȡָ��ͺá�
+// StreamCurrPoint() 更安全,但是速度慢不少。本文件参数判断很多,这里直接取指针就好。
 #define StCurPoint(st)  (&st->MemStart[st->Position])
 
 
-/// <summary>NewLife SRMP ���ݰ���ȡ����</summary>
-/// <param name="data">������</param>
-/// <param name="len">����������</param>
-/// <returns>�������ݰ����ȣ�С��0����ȡʧ��</returns>
+/**
+ * @brief NewLife SRMP 数据包获取长度
+ * @param data 缓冲区
+ * @param len 缓冲区长度
+ * @return 返回数据包长度;小于0,读取失败
+ */
 int SrmpTryGetLen(byte* data, int len)
 {
 	int remain = len;
 	if (remain < sizeof(SrmpHead_t))return -1;
 
-	// ��׼��
+	// 标准包
 	SrmpHead_t* head = (SrmpHead_t*)data;
 	int pklen = 0;
 
@@ -26,7 +28,7 @@ int SrmpTryGetLen(byte* data, int len)
 	}
 	else
 	{
-		// ��չ Head.LengthExt
+		// 扩展 Head.LengthExt
 		if (remain < sizeof(SrmpHead_t) + 4)return -1;
 
 		uint lenExt = 0;
@@ -39,17 +41,20 @@ int SrmpTryGetLen(byte* data, int len)
 	return pklen;
 }
 
-/// <summary>NewLife SRMP ���ݰ���ȡ����</summary>
-/// <param name="st">��</param>
-/// <returns></returns>
+/**
+ * @brief NewLife SRMP 数据包获取长度
+ * @param st 流
+ */
 int SrmpTryGetLen_Stream(Stream_t* st)
 {
 	return SrmpTryGetLen(StCurPoint(st), StreamRemian(st));
 }
 
-/// <summary>NewLife SRMP ���ݰ���ȡ����</summary>
-/// <param name="queue">�����</param>
-/// <returns>�������ݰ����ȣ�С��0����ȡʧ��</returns>
+/**
+ * @brief NewLife SRMP 数据包获取长度
+ * @param queue 环形队列
+ * @return 返回数据包长度;小于0,读取失败
+ */
 int SrmpTryGetLen_CircularQueue(CircularQueue_t* queue)
 {
 	byte cache[8];
@@ -80,10 +85,10 @@ int SrmpTryGetLen_CircularQueue(CircularQueue_t* queue)
 
 
 
-// Head.Flag �� 6bit ָ��ֵ��
+// Head.Flag 低 6bit 指定值。
 #define HEAD_FLAG_0_5  0x00
 
-// �������ݰ������� 65535 �ֽڵ����ݰ������� Head.LengthExt
+// 超大数据包,大于 65535 字节的数据包。启用 Head.LengthExt
 #define BIG_PKT 0
 
 
@@ -107,7 +112,7 @@ static int _RpcInit(byte* data, int datalen,
 	StreamInit(st, data, datalen);
 	StreamSeek(st, sizeof(SrmpHead_t), SeekBegin);
 
-	// action.length��7λѹ�����룩+ action
+	// action.length(7位压缩编码)+ action
 	StreamWriteCompressionUint(st, act_len);
 
 	rpc->Action = (char*)StCurPoint(st);
@@ -118,14 +123,14 @@ static int _RpcInit(byte* data, int datalen,
 		return -2;
 	}
 
-	// �����봦��
+	// 错误码处理
 	if ((errCode != 0) && replay)
 	{
 		rpc->Head->Flag |= 0x40;
 		StreamWriteUint(st, (uint)errCode);
 	}
 
-	// ���һ�����ȣ�����������⡣
+	// 检查一波长度,避免后续问题。
 	if (StreamRemian(st) < 4)
 	{
 		rpc->Payload = NULL;
@@ -143,12 +148,14 @@ static int _RpcInit(byte* data, int datalen,
 	return StreamRemian(st);
 }
 
-/// <summary>��װ RPC ͨѶ��ʽ</summary>
-/// <param name="data">�ڴ滺��</param>
-/// <param name="datalen">�ڴ��С</param>
-/// <param name="action">RPC ����</param>
-/// <param name="rpc">RPC ����</param>
-/// <returns>���ظ�����������󳤶�</returns>
+/**
+ * @brief 封装 RPC 通讯方式
+ * @param data 内存缓冲
+ * @param datalen 内存大小
+ * @param action RPC 名称
+ * @param rpc RPC 对象
+ * @return 返回负载允许的最大长度
+ */
 int RpcInit(byte* data, int datalen, char* action, RpcInfo_t* rpc)
 {
 	if (data == NULL)return -1;
@@ -162,13 +169,15 @@ int RpcInit(byte* data, int datalen, char* action, RpcInfo_t* rpc)
 #endif
 }
 
-/// <summary>��װ RPC ������Ϣ����</summary>
-/// <param name="data">�ڴ滺��</param>
-/// <param name="datalen">�ڴ��С</param>
-/// <param name="action">RPC ����</param>
-/// <param name="errCode">�����룬0�޴�</param>
-/// <param name="rpc">RPC ����</param>
-/// <returns>���ظ�����������󳤶�</returns>
+/**
+ * @brief 封装 RPC 返回消息构建
+ * @param data 内存缓冲
+ * @param datalen 内存大小
+ * @param action RPC 名称
+ * @param errCode 错误码,0无错
+ * @param rpc RPC 对象
+ * @return 返回负载允许的最大长度
+ */
 int RpcReplyInit(byte* data, int datalen, char* action, uint errCode, RpcInfo_t* rpc)
 {
 	if (data == NULL)return -1;
@@ -182,13 +191,15 @@ int RpcReplyInit(byte* data, int datalen, char* action, uint errCode, RpcInfo_t*
 #endif
 }
 
-/// <summary>�����ظ���Ϣ</summary>
-/// <param name="data">������</param>
-/// <param name="datalen">��������С</param>
-/// <param name="errCode">�����룬0�޴�</param>
-/// <param name="src">ԭ����Ϣ</param>
-/// <param name="dst">����������Ϣ</param>
-/// <returns>�������ߴ�</returns>
+/**
+ * @brief 创建回复消息
+ * @param data 缓冲区
+ * @param datalen 缓冲区大小
+ * @param errCode 错误码,0无错
+ * @param src 原有消息
+ * @param dst 创建的新消息
+ * @return 负载最大尺寸
+ */
 int RpcCreatReply(byte* data, int datalen, uint errCode, RpcInfo_t* src, RpcInfo_t* dst)
 {
 	if (data == NULL)return -1;
@@ -197,11 +208,11 @@ int RpcCreatReply(byte* data, int datalen, uint errCode, RpcInfo_t* src, RpcInfo
 	if (src->Action == NULL)return -1;
 #if BIG_PKT
 	if (datalen < 9 + 4)return -1;
-	// ��actionlen=0����С���ݰ� 9 + 4 �ֽڡ�
+	// (actionlen=0)最小数据包 9 + 4 字节。
 	if (src->ActionLen + 9 + 4 > datalen)return -1;
 #else
 	if (datalen < 9)return -1;
-	// ��actionlen=0����С���ݰ� 9�ֽڡ�
+	// (actionlen=0)最小数据包 9字节。
 	if (src->ActionLen + 9 > datalen)return -1;
 #endif
 
@@ -216,26 +227,28 @@ int RpcCreatReply(byte* data, int datalen, uint errCode, RpcInfo_t* src, RpcInfo
 	return pyMax;
 }
 
-/// <summary>����/���� RPC ���ݰ��ṹ</summary>
-/// <param name="rpc">RPC ����</param>
-/// <returns>����������Ϣ����</returns>
+/**
+ * @brief 修正/完善 RPC 数据包结构
+ * @param rpc RPC 对象
+ * @return 返回整条消息长度
+ */
 int RpcFix(RpcInfo_t* rpc)
 {
 	if (rpc == NULL)return -1;
 	if (rpc->Head == NULL)return -1;
 	if (rpc->Payload == NULL)return -1;
 
-	// ��䡾���س��ȡ�,�ڸ���ǰ��4�ֽ�
+	// 填充【负载长度】,在负载前面4字节
 	Stream_t pkst;
 	Stream_t* st = &pkst;
 	StreamInit(st, rpc->Payload - 4, 4);
 	StreamWriteUint(st, rpc->PayloadLen);
 
-	// ���ڴ�β-�ڴ�ͷ�� - ���ݰ�ͷ������
+	// (内存尾-内存头) - 数据包头部长度
 	SrmpHead_t* head = rpc->Head;
 	uint hLen = (uint)rpc->Payload + rpc->PayloadLen - (uint)head - sizeof(SrmpHead_t);
 
-	// �������ݰ�
+	// 正常数据包
 	if (hLen < 65535)
 	{
 		head->Length = hLen;
@@ -243,19 +256,19 @@ int RpcFix(RpcInfo_t* rpc)
 	}
 
 #if BIG_PKT
-	// �������ݰ��� ǰ������4�ֽڣ������ó���
-	// �ж� ��һ�ε��ñ�����
+	// 超长数据包。 前面空余的4字节,派上用场。
+	// 判断 第一次调用本函数
 	if ((uint)rpc->Action - (uint)rpc->Head - sizeof(SrmpHead_t) < 4)
 	{
 		byte* p = (byte*)rpc->Head;
 		SrmpHead_t* head = (SrmpHead_t*)(p - 4);
-		// �Ӻ�����ǰ copy �����ĸ������⣬ֱ���ϡ�
+		// 从后面往前 copy 不担心覆盖问题,直接上。
 		memcpy(head, rpc->Head, sizeof(SrmpHead_t));
-		// ���λ�λ��
+		// 移形换位。
 		rpc->Head = head;
 	}
 
-	// ���ȴ���
+	// 长度处理
 	head->Length = 0xffff;
 	StreamInit(st, (byte*)rpc->Head, 8);
 	StreamSeek(st, sizeof(SrmpHead_t), SeekCurrent);
@@ -263,15 +276,17 @@ int RpcFix(RpcInfo_t* rpc)
 
 	return hLen + sizeof(SrmpHead_t) + 4;
 #else
-	// ��֧�ֳ������ݰ�
+	// 不支持超大数据包
 	return 0;
 #endif
 }
 
-/// <summary>����/���� RPC ���ݰ��ṹ</summary>
-/// <param name="rpc">RPC ����</param>
-/// <param name="seq">��ϢSEQ���</param>
-/// <returns>����������Ϣ����</returns>
+/**
+ * @brief 修正/完善 RPC 数据包结构
+ * @param rpc RPC 对象
+ * @param seq 消息SEQ编号
+ * @return 返回整条消息长度
+ */
 int RpcFixWithSeq(RpcInfo_t* rpc, byte seq)
 {
 	if (rpc == NULL)return 0;
@@ -281,9 +296,11 @@ int RpcFixWithSeq(RpcInfo_t* rpc, byte seq)
 	return RpcFix(rpc);
 }
 
-/// <summary>��������Seqֵ</summary>
-/// <param name="data">���ݰ�</param>
-/// <param name="seq">Seq</param>
+/**
+ * @brief 设置数据Seq值
+ * @param data 数据包
+ * @param seq Seq
+ */
 void RpcPktSetSeq(byte* data, byte seq)
 {
 	if (data == NULL)return;
@@ -292,11 +309,13 @@ void RpcPktSetSeq(byte* data, byte seq)
 	head->Seq = seq;
 }
 
-/// <summary>���RPC����</summary>
-/// <param name="data">����</param>
-/// <param name="len">���ݴ�С</param>
-/// <param name="rpc">rpc����</param>
-/// <returns>С��0��ʾ����</returns>
+/**
+ * @brief 解包RPC数据
+ * @param data 数据
+ * @param len 数据大小
+ * @param rpc rpc解出位置
+ * @return 小于0表示出错
+ */
 int RpcPktParse(byte* data, int len, RpcInfo_t* rpc)
 {
 	if (data == NULL)return -1;
@@ -311,7 +330,7 @@ int RpcPktParse(byte* data, int len, RpcInfo_t* rpc)
 		if (head->Length + sizeof(SrmpHead_t) > len)return -2;
 	}
 
-	// FLAG ��־λ
+	// FLAG 标志位
 	if ((head->Flag & 0x80) != 0)rpc->Reply = true;
 	bool err = (head->Flag & 0x40) != 0;
 
@@ -319,18 +338,18 @@ int RpcPktParse(byte* data, int len, RpcInfo_t* rpc)
 	Stream_t* st = &pkst;
 	StreamInit(st, data, len);
 	StreamSeek(st, sizeof(SrmpHead_t), SeekBegin);
-	// ���� 64K ���������� Head.LengthExt ��
+	// 大于 64K 的包。长度在 Head.LengthExt 。
 	if (head->Length == 0xffff)
 	{
 		uint realLen;
 		if (StreamReadUint(st, &realLen) != 4)return -2;
-		// ���س���+��׼ͷ����+���ų����ֶ�
+		// 负载长度+标准头长度+扩张长度字段
 		if (realLen + sizeof(SrmpHead_t) + 4 > len)return -2;
 	}
 
 	rpc->Head = head;
 
-	// action.length��7λѹ�����룩+ action
+	// action.length(7位压缩编码)+ action
 	uint slen = 0;
 	StreamReadCompressionUint(st, &slen);
 	rpc->Action = (char*)StCurPoint(st);
@@ -353,7 +372,7 @@ int RpcPktParse(byte* data, int len, RpcInfo_t* rpc)
 	return 0;
 }
 
-/// <summary>��ӡRPC����</summary>
+/** @brief 打印RPC数据 */
 void RpcShow(RpcInfo_t* rpc)
 {
 	if (rpc == NULL)return;
@@ -361,7 +380,7 @@ void RpcShow(RpcInfo_t* rpc)
 	DebugPrintf("F %02X S %02X [%d]",
 		rpc->Head->Flag,rpc->Head->Seq,rpc->Head->Length);
 
-	// �����ַ���β���޸�Ϊ \0 , ��ԭ�� 
+	// 备份字符结尾,修改为 \0 , 还原。 
 	byte act_e = rpc->Action[rpc->ActionLen];
 	
 	DebugPrintf(" ACT ");
Modified +112 -89
diff --git a/Core/RpcMsg.h b/Core/RpcMsg.h
index 1579566..d3368f8 100644
--- a/Core/RpcMsg.h
+++ b/Core/RpcMsg.h
@@ -4,147 +4,167 @@
 
 /*
 
-���ļ�ʵ�ֵĺ�����Ӧ
+本文件实现的函数对应
 DefaultMessage(Newlife.Core)  -> SrmpHead_t
 JsonEncoder(Newlife.Remoting) -> RpcInfo_t
-RpcInfo_t ��������ʵ�� ApiClient (�Խ�ApiServer)
+RpcInfo_t 可以用于实现 ApiClient (对接ApiServer)
 
-����c�������ƣ��޷�ʵ��JsonEncoder��JSON�����л�/�����л�����Ҫ�ⲿʵ�֡�
-���ĺ�����ʹ��ʾ�������Բο���
+由于c语言限制,无法实现JsonEncoder中JSON的序列化/反序列化,需要外部实现。
+本文后面有使用示例,可以参考。
 
-��λ�����ᳬ�� 65535 �ĸ��أ�Ĭ�ϲ�ʹ����չ���ȣ�����֧����Ҫ��.c�ļ��� BIG_PKT �궨�塣
+下位机不会超过 65535 的负载,默认不使用扩展长度,如需支持需要打开.c文件的 BIG_PKT 宏定义。
 
-����SrmpHead_t�е�Flag��DefaultMessage��bit0-5����ΪDataKinds,��ApiClient�д��ֶ�Ϊ0 ��
-��Newlife�������У�DataKinds����û��ʹ�ã����Դ˴�����������
+关于SrmpHead_t中的Flag,DefaultMessage对bit0-5定义为DataKinds,在ApiClient中此字段为0 。
+在Newlife相关组件中,DataKinds基本没有使用,所以此处不做处理。
 
 */
 
 #pragma pack(push)
 #pragma pack(1)
 
-// NewLife SRMP ��׼���ݰ�ͷ
+// NewLife SRMP 标准数据包头
 typedef struct
 {
-	// Flag Ϊλ��־
+	// Flag 为位标志
 	// bit7  0x80  Reply
 	// bit6  0x40  Error
-	// bit 0-5	   ���ݰ���ʽ��Ĭ��ʹ��0 
-	// �������
+	// bit 0-5	   数据包格式,默认使用0 
+	// 其他未定义
 	byte Flag;
-	// ���ݰ� Seq
+	// 数据包 Seq
 	byte Seq;
-	// ���ݳ��ȣ�С��
+	// 数据长度,小端
 	ushort Length;
 
-	// �������ݰ������� Length=0XFFFF��Ȼ�� LengthExt=ʵ�ʳ��ȡ�
+	// 超长数据包,会让 Length=0XFFFF,然后 LengthExt=实际长度。
 	// uint LengthExt;
 } SrmpHead_t;
 
 #pragma pack(pop)
 
-// Ҳ����д�� NewLifeHead_t
+// 也可以写成 NewLifeHead_t
 #define NewLifeHead_t SrmpHead_t
 
 #include "Stream.h"
 #include "CircularQueue.h"
 
-/// <summary>NewLife SRMP ���ݰ���ȡ����</summary>
-/// <param name="data">������</param>
-/// <param name="len">����������</param>
-/// <returns>�������ݰ����ȣ�С��0����ȡʧ��</returns>
+/**
+ * @brief NewLife SRMP 数据包获取长度
+ * @param data 缓冲区
+ * @param len 缓冲区长度
+ * @return 返回数据包长度;小于0,读取失败
+ */
 int SrmpTryGetLen(byte* data, int len);
 
-/// <summary>NewLife SRMP ���ݰ���ȡ����</summary>
-/// <param name="st">��</param>
-/// <returns></returns>
+/**
+ * @brief NewLife SRMP 数据包获取长度
+ * @param st 流
+ */
 int SrmpTryGetLen_Stream(Stream_t* st);
 
-/// <summary>NewLife SRMP ���ݰ���ȡ����</summary>
-/// <param name="queue">�����</param>
-/// <returns>�������ݰ����ȣ�С��0����ȡʧ��</returns>
+/**
+ * @brief NewLife SRMP 数据包获取长度
+ * @param queue 环形队列
+ * @return 返回数据包长度;小于0,读取失败
+ */
 int SrmpTryGetLen_CircularQueue(CircularQueue_t* queue);
 
 
 typedef struct
 {
-	// ͷ��
+	// 头部
 	SrmpHead_t* Head;
 
-	// ������Ϣ
+	// 返回消息
 	bool Reply;
-	// �������
+	// 错误代码
 	int ErrCode;
 
-	// ��������
+	// 动作名称
 	char* Action;
-	// �����ַ�������
+	// 动作字符串长度
 	uint ActionLen;
 
-	// ����
+	// 负载
 	byte* Payload;
-	// ���س��ȡ� 
+	// 负载长度。 
 	uint PayloadLen;
 }RpcInfo_t;
 
-/// <summary>��װ RPC ͨѶ��ʽ</summary>
-/// <param name="data">�ڴ滺��</param>
-/// <param name="datalen">�ڴ��С</param>
-/// <param name="action">RPC ����</param>
-/// <param name="rpc">RPC ����</param>
-/// <returns>���ظ�����������󳤶�</returns>
+/**
+ * @brief 封装 RPC 通讯方式
+ * @param data 内存缓冲
+ * @param datalen 内存大小
+ * @param action RPC 名称
+ * @param rpc RPC 对象
+ * @return 返回负载允许的最大长度
+ */
 int RpcInit(byte* data, int datalen, char* action, RpcInfo_t* rpc);
 
-/// <summary>��װ RPC ������Ϣ����</summary>
-/// <param name="data">�ڴ滺��</param>
-/// <param name="datalen">�ڴ��С</param>
-/// <param name="action">RPC ����</param>
-/// <param name="errCode">�����룬0�޴�</param>
-/// <param name="rpc">RPC ����</param>
-/// <returns>���ظ�����������󳤶�</returns>
+/**
+ * @brief 封装 RPC 返回消息构建
+ * @param data 内存缓冲
+ * @param datalen 内存大小
+ * @param action RPC 名称
+ * @param errCode 错误码,0无错
+ * @param rpc RPC 对象
+ * @return 返回负载允许的最大长度
+ */
 int RpcReplyInit(byte* data, int datalen, char* action, uint errCode, RpcInfo_t* rpc);
 
-/// <summary>�����ظ���Ϣ</summary>
-/// <param name="data">������</param>
-/// <param name="datalen">��������С</param>
-/// <param name="errCode">�����룬0�޴�</param>
-/// <param name="src">ԭ����Ϣ</param>
-/// <param name="dst">����������Ϣ</param>
-/// <returns>�������ߴ�</returns>
+/**
+ * @brief 创建回复消息
+ * @param data 缓冲区
+ * @param datalen 缓冲区大小
+ * @param errCode 错误码,0无错
+ * @param src 原有消息
+ * @param dst 创建的新消息
+ * @return 负载最大尺寸
+ */
 int RpcCreatReply(byte* data, int datalen, uint errCode, RpcInfo_t* src, RpcInfo_t* dst);
 
-/// <summary>����/���� RPC ���ݰ��ṹ</summary>
-/// <param name="rpc">RPC ����</param>
-/// <returns>����������Ϣ����</returns>
+/**
+ * @brief 修正/完善 RPC 数据包结构
+ * @param rpc RPC 对象
+ * @return 返回整条消息长度
+ */
 int RpcFix(RpcInfo_t* rpc);
 
-/// <summary>����/���� RPC ���ݰ��ṹ</summary>
-/// <param name="rpc">RPC ����</param>
-/// <param name="seq">��ϢSEQ���</param>
-/// <returns>����������Ϣ����</returns>
+/**
+ * @brief 修正/完善 RPC 数据包结构
+ * @param rpc RPC 对象
+ * @param seq 消息SEQ编号
+ * @return 返回整条消息长度
+ */
 int RpcFixWithSeq(RpcInfo_t* rpc, byte seq);
 
-/// <summary>��������Seqֵ</summary>
-/// <param name="data">���ݰ�</param>
-/// <param name="seq">Seq</param>
+/**
+ * @brief 设置数据Seq值
+ * @param data 数据包
+ * @param seq Seq
+ */
 void RpcPktSetSeq(byte* data, byte seq);
 
-/// <summary>���RPC����</summary>
-/// <param name="data">����</param>
-/// <param name="len">���ݴ�С</param>
-/// <param name="rpc">rpc����</param>
-/// <returns>С��0��ʾ����</returns>
+/**
+ * @brief 解包RPC数据
+ * @param data 数据
+ * @param len 数据大小
+ * @param rpc rpc解出位置
+ * @return 小于0表示出错
+ */
 int RpcPktParse(byte* data, int len, RpcInfo_t* rpc);
 
-/// <summary>��ӡRPC����</summary>
+/** @brief 打印RPC数据 */
 void RpcShow(RpcInfo_t* rpc);
 
 /*
 
-/// <summary>ƥ������/��ά��</summary>
-/// <param name="codestr">����/����</param>
-/// <param name="buff"></param>
-/// <param name="bufflen"></param>
-/// <returns></returns>
+/**
+ * @brief 匹配条码/二维码
+ * @param codestr 条码/二维码
+ * @param buff
+ * @param bufflen
+ */
 int BuildMatchMsg(char* codestr, int posi, byte* buff, int bufflen)
 {
 	char* qr = codestr;
@@ -176,7 +196,7 @@ int BuildMatchMsg(char* codestr, int posi, byte* buff, int bufflen)
 		result = pklen;
 	}
 
-	// ʹ�� cJSON_Delete ��ʹ�õ� free ����
+	// 使用 cJSON_Delete 内使用的 free 函数
 	if (cJSON_free)cJSON_free(msgbuff);
 	else GlobleFree(msgbuff);
 
@@ -184,11 +204,12 @@ int BuildMatchMsg(char* codestr, int posi, byte* buff, int bufflen)
 	return result;
 }
 
-/// <summary>ƥ������/��ά��</summary>
-/// <param name="codestr">����/����</param>
-/// <param name="buff"></param>
-/// <param name="bufflen"></param>
-/// <returns></returns>
+/**
+ * @brief 匹配条码/二维码
+ * @param codestr 条码/二维码
+ * @param buff
+ * @param bufflen
+ */
 int BuildMatchMsg(char* codestr, int posi, byte* buff, int bufflen)
 {
 	RpcInfo_t rpc;
@@ -201,12 +222,14 @@ int BuildMatchMsg(char* codestr, int posi, byte* buff, int bufflen)
 }
 
 
-/// <summary>�������ݰ�����</summary>
-/// <param name="data"></param>
-/// <param name="bufflen"></param>
+/**
+ * @brief 网络数据包处理
+ * @param data
+ * @param bufflen
+ */
 void NetDataProcess(byte* data, int bufflen)
 {
-	// ��С���ݳ��ȣ�����Ҫ������ͷ�����ɡ�
+	// 最小数据长度,起码要把数据头放满吧。
 	if (bufflen < sizeof(SrmpHead_t))return;
 
 	SrmpHead_t* head = (SrmpHead_t*)data;
@@ -221,16 +244,16 @@ void NetDataProcess(byte* data, int bufflen)
 		return;
 	}
 
-	// ���ַ������־\0 �����ƻ���Ϣ���ݣ�ȷ���������Ӱ���ʹ�á�
+	// 加字符串结标志\0 ,会破坏消息内容,确定不会造成影响才使用。
 	rpc.Action[rpc.ActionLen] = '\0';
 	rpc.Payload[rpc.PayloadLen] = '\0';
 
 	if (!rpc.Reply)
 	{
-		// ������Ϣ������
+		// 请求消息处理。
 		// DebugPrintf("RpcPktParse %d\r\n", err);
 
-		// ��֧�ֱ�����Ĵ���
+		// 不支持被请求的处理
 		static byte cache[80];
 		RpcInfo_t rs;
 		int maxlen = RpcCreatReply(cache, sizeof(cache), 400, &rpc, &rs);
@@ -247,15 +270,15 @@ void NetDataProcess(byte* data, int bufflen)
 	}
 	else
 	{
-		// �ظ���Ϣ����
-		//		�����ӡ����
+		// 回复消息处理
+		//		错误打印出来
 		if (rpc.ErrCode != 0)
 		{
 			DebugPrintf("Rev %s Err %d\r\n\t%s\r\n", rpc.Action, rpc.ErrCode, rpc.Payload);
 			return;
 		}
 
-		//		��action�б����ҵ���Ӧ�Ĵ����������д���
+		//		从action列表中找到对应的处理函数进行处理
 		DebugPrintf("Rev %s %d\r\n\t%s\r\n", rpc.Action, rpc.ErrCode, rpc.Payload);
 		for (int i = 0; i < sizeof(ActionProcess) / sizeof(ActionProcess[0]); i++)
 		{
Modified +1 -1
diff --git a/Core/SHA1.c b/Core/SHA1.c
index ee1b615..c2b4e74 100644
--- a/Core/SHA1.c
+++ b/Core/SHA1.c
@@ -1,4 +1,4 @@
-#include "SHA1.h"
+#include "SHA1.h"
 
 uint swapInt32(uint value)
 {
Modified +1 -1
diff --git a/Core/SHA1.h b/Core/SHA1.h
index 6d398fd..30c567e 100644
--- a/Core/SHA1.h
+++ b/Core/SHA1.h
@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
 
 #include "Type.h"
 #include <stddef.h>
Modified +19 -13
diff --git a/Core/StateMachine.c b/Core/StateMachine.c
index 5dc14bb..0fd3064 100644
--- a/Core/StateMachine.c
+++ b/Core/StateMachine.c
@@ -1,17 +1,21 @@
 
 #include "StateMachine.h"
 
-/// <summary>初始化状态机</summary>
-/// <param name="sm"></param>
-/// <param name="items"></param>
+/**
+ * @brief 初始化状态机
+ * @param sm
+ * @param items
+ */
 void StateMachineInit(StateMachine_t* sm, SMItem_t* items)
 {
 	sm->Current = NULL;
 	sm->Next = items;
 }
 
-/// <summary>状态机主循环</summary>
-/// <param name="sm"></param>
+/**
+ * @brief 状态机主循环
+ * @param sm
+ */
 void StateMachineMain(StateMachine_t* sm)
 {
     if(sm == NULL)return;
@@ -43,9 +47,11 @@ void StateMachineMain(StateMachine_t* sm)
     }
 }
 
-/// <summary>切换状态</summary>
-/// <param name="sm"></param>
-/// <param name="next"></param>
+/**
+ * @brief 切换状态
+ * @param sm
+ * @param next
+ */
 void StateMachineGo(StateMachine_t* sm, SMItem_t* next)
 {
     if(next == NULL)return;
@@ -54,17 +60,17 @@ void StateMachineGo(StateMachine_t* sm, SMItem_t* next)
 
 /* 延迟状态举例
 
-/// <summary>延迟状态结构</summary>
+/** @brief 延迟状态结构 */
 typedef struct
 {
     SMItem_t DelayItem;
-    /// <summary>状态机主体,方便处理切换问题</summary>
+    /** @brief 状态机主体,方便处理切换问题 */
     StateMachine_t* SM;
-    /// <summary>延迟开始时间</summary>
+    /** @brief 延迟开始时间 */
     Time_t Start;
-    /// <summary>延时时间</summary>
+    /** @brief 延时时间 */
     int DelayMs;
-    /// <summary>延迟完成后进入的状态</summary>
+    /** @brief 延迟完成后进入的状态 */
     SMItem_t* Next;
 } SMDelay_t;
 
Modified +6 -6
diff --git a/Core/StateMachine.h b/Core/StateMachine.h
index 41718d4..d9173af 100644
--- a/Core/StateMachine.h
+++ b/Core/StateMachine.h
@@ -6,22 +6,22 @@
 
 typedef struct SMItem
 {
-    /// <summary>状态名称</summary>
+    /** @brief 状态名称 */
     const char* Name;
 
-    /// <summary>进入状态时执行的动作</summary>
+    /** @brief 进入状态时执行的动作 */
     void(*Enter)(struct SMItem*, void* sm);
-    /// <summary>运行状态时执行的动作</summary>
+    /** @brief 运行状态时执行的动作 */
     void (*Run)(struct SMItem*, void* sm);
-    /// <summary>退出状态时执行的动作</summary>
+    /** @brief 退出状态时执行的动作 */
     void (*Exit)(struct SMItem*, void* sm);
 }SMItem_t;
 
 typedef struct
 {
-    /// <summary>当前状态</summary>
+    /** @brief 当前状态 */
     struct SMItem* Current;
-    /// <summary>下一个状态</summary>
+    /** @brief 下一个状态 */
     struct SMItem* Next;
 }StateMachine_t;
 
Modified +1 -1
diff --git a/Core/Stream.h b/Core/Stream.h
index fcf5080..a203c9d 100644
--- a/Core/Stream.h
+++ b/Core/Stream.h
@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
 
 #include "Type.h"
 
Modified +1 -64
diff --git a/Core/Type.c b/Core/Type.c
index 34edde6..5416add 100644
--- a/Core/Type.c
+++ b/Core/Type.c
@@ -1,5 +1,4 @@
-
-#include "Debug.h"
+
 #include "Type.h"
 
 #if defined ( __CC_ARM )
@@ -26,65 +25,3 @@ void SetGlobleMemOpt(MallocFunc malloc, FreeFunc free)
 	GlobleMemOpt.malloc = malloc;
 	GlobleMemOpt.free = free;
 }
-
-__inline void InitBuffer(Buffer_t* data)	{ memset(data, 0x00, sizeof(Buffer_t));	data->free = GlobleFree;}
-__inline void InitBuffer2(Buffer2_t* data)	{ memset(data, 0x00, sizeof(Buffer2_t));data->free = GlobleFree;}
-
-__inline void TryCleanBuffer(Buffer_t* data)
-{
-	if (data->needFree)
-	{
-#ifdef DEBUG
-		if (data->free == NULL)ErrPrintf("TryCleanBuffer Free = NULL");
-		if (data->p == NULL)ErrPrintf("TryCleanBuffer p = NULL");
-#endif
-		data->free(data->p);
-		data->needFree = false;
-	}
-}
-
-__inline void TryCleanBuffer2(Buffer2_t* data)
-{
-	if (data->needFree)
-	{
-#ifdef DEBUG
-		if (data->free == NULL)ErrPrintf("TryCleanBuffer2 Free = NULL");
-		if (data->freePoint == NULL)ErrPrintf("TryCleanBuffer2 p = NULL");
-#endif
-		data->free(data->freePoint);
-		data->needFree = false;
-	}
-}
-
-void ShowArray(char* name, byte* pdata, int datalen, int showlen)
-{
-#ifdef DEBUG
-	uint printlen = datalen > showlen ? showlen : datalen;
-	DebugPrintf("%s [%d] = ", name, datalen);
-
-	if (printlen > 32)
-	{
-		for (int i = 0; i < printlen; i++)
-		{
-			if (i % 32 == 0)DebugPrintf("\r\n");
-			DebugPrintf("%02X ", pdata[i]);
-		}
-	}
-	else
-	{
-		for (int i = 0; i < printlen; i++)DebugPrintf("%02X ", pdata[i]);
-	}
-
-	DebugPrintf(printlen == datalen ? "\r\n" : "...\r\n");
-#endif
-}
-
-void ShowBuff(Buffer_t* buff, int len)
-{
-	ShowArray("",buff->p,buff->len,len);
-}
-
-void ShowBuff2(Buffer2_t* buff, int len)
-{
-	ShowArray("", buff->data, buff->len, len);
-}
Modified +16 -55
diff --git a/Core/Type.h b/Core/Type.h
index 73ef0ba..04e8508 100644
--- a/Core/Type.h
+++ b/Core/Type.h
@@ -1,6 +1,14 @@
-#ifndef __TYPE_H__
+#ifndef __TYPE_H__
 #define __TYPE_H__
 
+#include <stdbool.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdint.h>
+#include <cType.h>
+// #include <math.h>
+
 typedef char					sbyte;
 typedef unsigned char			byte;
 typedef unsigned short			ushort;
@@ -12,20 +20,6 @@ typedef unsigned long long int	uint64;
 typedef uint64 Time_t;
 #define Time_Max (UINT64_MAX - 60000)
 
-#include <stdbool.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdint.h>
-#include <cType.h>
-// #include <math.h>
-
-// 没有参数和返回值的委托
-typedef void(*Func)(void);
-// 一个参数没有返回值的委托,一般param参数用作目标对象,调用者用静态函数包装成员函数
-typedef void(*Action)(void* param);
-typedef void(*Action2)(void*, void*);
-typedef void(*Action3)(void*, void*, void*);
 // 事件处理委托,一般sender表示事件发出者,param用作目标对象,调用者用静态函数包装成员函数
 typedef void(*EventHandler)(void* sender, void* param);
 
@@ -48,46 +42,13 @@ extern MemOptions_t GlobleMemOpt;
 // 一次设置 GlobleMalloc  GlobleFree  GlobleMemOpt
 void SetGlobleMemOpt(MallocFunc malloc, FreeFunc free);
 
-
-// 缓冲区
-typedef struct
-{
-	byte* p;
-	int len;
-	bool needFree;
-	FreeFunc free;
-}Buffer_t;
-
-// 缓冲区, 用于从特定内存中抽取一部分数据。
-typedef struct
-{
-	// 数据指针
-	byte* data;
-	// 数据长度
-	uint len;
-
-	// 是否需要 Free
-	bool needFree;
-	// Free 函数指针
-	FreeFunc free;
-	// Free 函数测参数  data在这其中。
-	byte* freePoint;
-}Buffer2_t;
-
-void InitBuffer(Buffer_t* data);
-void InitBuffer2(Buffer2_t* data);
-
-void TryCleanBuffer(Buffer_t* data);
-void TryCleanBuffer2(Buffer2_t* data);
-
-void ShowBuff(Buffer_t* buff, int len);
-void ShowBuff2(Buffer2_t* buff, int len);
-
-/// <summary>打印数组内容</summary>
-/// <param name="head">数组名称</param>
-/// <param name="pdata">数组指针</param>
-/// <param name="datalen">数组长度</param>
-/// <param name="showlen">打印长度</param>
+/**
+ * @brief 打印数组内容
+ * @param head 数组名称
+ * @param pdata 数组指针
+ * @param datalen 数组长度
+ * @param showlen 打印长度
+ */
 void ShowArray(char* name, byte* pdata, int datalen, int showlen);
 // 数组长度
 #define ArrayLength(arr) ((int)(sizeof(arr)/sizeof(arr[0])))
Deleted +0 -57
Core/Update.c
Deleted +0 -29
Core/Update.h
Modified +6 -5
diff --git a/Core/Version.c b/Core/Version.c
index 543184f..3156fd5 100644
--- a/Core/Version.c
+++ b/Core/Version.c
@@ -1,4 +1,4 @@
-
+
 #include "Type.h"
 #ifdef DEBUG
 #include "Debug.h"
@@ -117,10 +117,11 @@ uint GetVersion(void)
 	return minuint;
 }
 
-/// <summary>获取软件版本,参考 Version.c</summary>
-/// <param name="addr">固件起始地址</param>
-/// <param name="len">固件大小</param>
-/// <returns></returns>
+/**
+ * @brief 获取软件版本,参考 Version.c
+ * @param addr 固件起始地址
+ * @param len 固件大小
+ */
 uint GetFwVersion(uint addr, int len)
 {
 	char* head = "FirmwareBuildTime/";
Modified +15 -12
diff --git a/Core/Version.h b/Core/Version.h
index b091820..0f099a7 100644
--- a/Core/Version.h
+++ b/Core/Version.h
@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
 
 #include "Type.h"
 #include "time.h"
@@ -39,10 +39,11 @@ tm_min		// 分 - 取值区间为[0,59]
 tm_sec		// 秒 - 取值区间为[0,59]
 */
 
-/// <summary>获取软件版本</summary>
-/// <param name="addr">固件起始地址</param>
-/// <param name="len">固件大小</param>
-/// <returns></returns>
+/**
+ * @brief 获取软件版本
+ * @param addr 固件起始地址
+ * @param len 固件大小
+ */
 uint GetFwVersion(uint addr, int len);
 
 
@@ -54,19 +55,21 @@ uint GetFwVersion(uint addr, int len);
 #define GITINFO "NO GIT"
 #endif
 
-/// <summary>GIT仓库信息</summary>
+/** @brief GIT仓库信息 */
 typedef struct
 {
-	/// <summary>git最后提交时间 减去 2000-1-1 00:00:00 得到的分钟数</summary>
+	/** @brief git最后提交时间 减去 2000-1-1 00:00:00 得到的分钟数 */
 	uint TimeMin;
-	/// <summary>提交对应的 SHA-1 值</summary>
+	/** @brief 提交对应的 SHA-1 值 */
 	byte Md5[20];
-	/// <summary>分支信息</summary>
+	/** @brief 分支信息 */
 	char* Branch;
 }GitVersion_t;
 
-/// <summary>获取GIT仓库的提交</summary>
-/// <param name="ver">版本信息</param>
-/// <returns>获取成功</returns>
+/**
+ * @brief 获取GIT仓库的提交
+ * @param ver 版本信息
+ * @return 获取成功
+ */
 bool GetGitVersion(GitVersion_t* ver);
 
Modified +38 -30
diff --git a/Core/VirtualArea.c b/Core/VirtualArea.c
index 982c390..2643974 100644
--- a/Core/VirtualArea.c
+++ b/Core/VirtualArea.c
@@ -3,7 +3,7 @@
 #include "Stream.h"
 #include "BitHelper.h"
 
-// ���ռ��Ƿ��н���
+// 检测空间是否有交集
 static bool AreaCheck(Area_t* a1, Area_t* a2)
 {
 	uint a1end = a1->Addr + a1->Size;
@@ -20,7 +20,7 @@ static int min(int a, int b)
 	return b;
 }
 
-// �� src ������д�� dst �ڡ�
+// 将 src 的数据写到 dst 内。
 int AreaByteCopy(Area_t* dst, Area_t* src)
 {
 	Stream_t dstSt;
@@ -28,17 +28,17 @@ int AreaByteCopy(Area_t* dst, Area_t* src)
 
 	if (dst->Addr <= src->Addr)
 	{
-		// �� src ͷ����д�� dst ����λ�á�
+		// 从 src 头读,写到 dst 后面位置。
 		int posi = src->Addr - dst->Addr;
 		StreamSeek(&dstSt, posi, SeekBegin);
 
-		// dst �ռ�ʣ���Խ��,ȡ��Сֵ���ɡ�
+		// dst 空间剩余别越界,取最小值即可。
 		int remian = StreamRemian(&dstSt);
 		return StreamWriteBytes(&dstSt, src->Buff, min(remian, src->Size));
 	}
 	else
 	{
-		// �� src ���λ�ã�д�� dst ͷ����
+		// 从 src 半截位置,写到 dst 头部。
 		byte* src_p = src->Buff;
 		byte src_len = src->Size;
 
@@ -46,18 +46,18 @@ int AreaByteCopy(Area_t* dst, Area_t* src)
 		src_p += posi;
 		src_len -= posi;
 
-		// ����һ��ʣ���Խ�硣
+		// 控制一下剩余别越界。
 		int remain = StreamRemian(&dstSt);
 		return StreamWriteBytes(&dstSt, src_p, min(remain, src_len));
 	}
 }
 
-// �� src �� bit ����д�� dst �ڡ�
+// 将 src 的 bit 数据写到 dst 内。
 int AreaBitCopy(Area_t* dst, Area_t* src)
 {
 	if (dst->Addr <= src->Addr)
 	{
-		// �� src ͷ����д�� dst ����λ�á�
+		// 从 src 头读,写到 dst 后面位置。
 		int dst_offset = src->Addr - dst->Addr;
 
 		int cplen = min(dst->Size - dst_offset, src->Size);
@@ -78,10 +78,12 @@ int AreaBitCopy(Area_t* dst, Area_t* src)
 	}
 }
 
-/// <summary>������ռ����ݣ��ϲ������</summary>
-/// <param name="dst">Ŀ��ռ�</param>
-/// <param name="srcs">�ռ����飬���һ��� SIZE С�� 1</param>
-/// <param name="isBit">�Ƿ���bit�ռ�</param>
+/**
+ * @brief 读多个空间数据,合并,半截
+ * @param dst 目标空间
+ * @param srcs 空间数组,最后一项的 SIZE 小于 1
+ * @param isBit 是否是bit空间
+ */
 void AreaRead(Area_t* dst, Area_t* srcs, bool isBit)
 {
 	if (dst->Init)dst->Init(dst);
@@ -102,12 +104,14 @@ void AreaRead(Area_t* dst, Area_t* srcs, bool isBit)
 	}
 }
 
-/// <summary>�Ӷ���ռ��ȡ����</summary>
-/// <param name="srcs">�����ռ�s</param>
-/// <param name="addr">����ַ</param>
-/// <param name="data">������</param>
-/// <param name="len">������</param>
-/// <param name="isBit">�Ƿ���bit�ռ�</param>
+/**
+ * @brief 从多个空间读取数据
+ * @param srcs 被读空间s
+ * @param addr 读地址
+ * @param data 读缓冲
+ * @param len 读长度
+ * @param isBit 是否是bit空间
+ */
 void AreaRead2(Area_t* srcs, int addr, byte* data, int len, bool isBit)
 {
 	Area_t ar;
@@ -120,10 +124,12 @@ void AreaRead2(Area_t* srcs, int addr, byte* data, int len, bool isBit)
 	AreaRead(&ar, srcs, isBit);
 }
 
-/// <summary>д����ռ����ݣ��Ӵ�ռ��С�ռ䣬����� fresh һ��</summary>
-/// <param name="dsts">Ŀ��ռ����飬���һ��� SIZE С�� 1</param>
-/// <param name="src">Դ</param>
-/// <param name="isBit">�Ƿ���bit�ռ�</param>
+/**
+ * @brief 写多个空间数据,从大空间拆到小空间,拆出来 fresh 一下
+ * @param dsts 目标空间数组,最后一项的 SIZE 小于 1
+ * @param src 源
+ * @param isBit 是否是bit空间
+ */
 void AreaWrite(Area_t* dsts, Area_t* src, bool isBit)
 {
 	if (src->Init)src->Init(src);
@@ -135,10 +141,10 @@ void AreaWrite(Area_t* dsts, Area_t* src, bool isBit)
 		if (AreaCheck(dsts, src))
 		{
 			if (dsts->Init)dsts->Init(dsts);
-			// �ֳ�ȥ
+			// 分出去
 			if (isBit)AreaBitCopy(dsts, src);
 			else AreaByteCopy(dsts, src);
-			// ˢ��һ�£����磺ʹ������
+			// 刷新一下,比如:使用数据
 			if (dsts->Fresh)dsts->Fresh(dsts);
 		}
 
@@ -146,12 +152,14 @@ void AreaWrite(Area_t* dsts, Area_t* src, bool isBit)
 	}
 }
 
-/// <summary>�����ռ�д����</summary>
-/// <param name="dsts">���</param>
-/// <param name="addr">д���ַ</param>
-/// <param name="data">�����</param>
-/// <param name="len">д�볤��</param>
-/// <param name="isBit">�Ƿ���bit�ռ�</param>
+/**
+ * @brief 向多个空间写数据
+ * @param dsts 被写入
+ * @param addr 写入地址
+ * @param data 写入数据
+ * @param len 写入长度
+ * @param isBit 是否是bit空间
+ */
 void AreaWrite2(Area_t* dsts, int addr, byte* data, int len, bool isBit)
 {
 	Area_t ar;
Modified +50 -42
diff --git a/Core/VirtualArea.h b/Core/VirtualArea.h
index a7b5b7b..1489c5a 100644
--- a/Core/VirtualArea.h
+++ b/Core/VirtualArea.h
@@ -3,112 +3,120 @@
 #include "Type.h"
 
 /*
-* ӳ��������ַ�ռ�����ݲ�����
-* ͨѶ�и�����ַ��д����������ҵ�����С�
-* ���� modbus ϵ�е�ͨѶ��
+* 映射的虚拟地址空间的数据操作。
+* 通讯中给定地址读写数据以驱动业务运行。
+* 比如 modbus 系列的通讯。
 */
 
-/// <summary>�ռ�Ƭ�ζ���</summary>
+/** @brief 空间片段定义 */
 typedef struct VirtualArea
 {
-	// ��ʼ�����ַ
+	// 起始虚拟地址
 	uint Addr;
-	// �ռ��С
+	// 空间大小
 	uint Size;
 
-	// ʵ�ʴ洢
+	// 实际存储
 	byte* Buff;
-	// ʹ�ÿռ�֮ǰ�Ĵ���,�����Լ�
+	// 使用空间之前的处理,传参自己
 	void(*Init)(struct VirtualArea* thiss);
-	// д�����ݺ�ˢ�£������Լ�
+	// 写入数据后刷新,传参自己
 	void(*Fresh)(struct VirtualArea* thiss);
 }Area_t;
 
-// �� src ������д�� dst �ڡ�
+// 将 src 的数据写到 dst 内。
 int AreaByteCopy(Area_t* dst, Area_t* src);
 
-// �� src �� bit ����д�� dst �ڡ�
+// 将 src 的 bit 数据写到 dst 内。
 int AreaBitCopy(Area_t* dst, Area_t* src);
 
-/// <summary>������ռ����ݣ��ϲ������</summary>
-/// <param name="dst">Ŀ��ռ�</param>
-/// <param name="srcs">�ռ����飬���һ��� SIZE С�� 1</param>
-/// <param name="isBit">�Ƿ���bit�ռ�</param>
+/**
+ * @brief 读多个空间数据,合并,半截
+ * @param dst 目标空间
+ * @param srcs 空间数组,最后一项的 SIZE 小于 1
+ * @param isBit 是否是bit空间
+ */
 void AreaRead(Area_t* dst, Area_t* srcs, bool isBit);
 
-/// <summary>д����ռ����ݣ��Ӵ�ռ��С�ռ䣬����� fresh һ��</summary>
-/// <param name="dsts">Ŀ��ռ����飬���һ��� SIZE С�� 1</param>
-/// <param name="src">Դ</param>
-/// <param name="isBit">�Ƿ���bit�ռ�</param>
+/**
+ * @brief 写多个空间数据,从大空间拆到小空间,拆出来 fresh 一下
+ * @param dsts 目标空间数组,最后一项的 SIZE 小于 1
+ * @param src 源
+ * @param isBit 是否是bit空间
+ */
 void AreaWrite(Area_t* dsts, Area_t* src, bool isBit);
 
 
-/// <summary>�Ӷ���ռ��ȡ����</summary>
-/// <param name="srcs">�����ռ�s</param>
-/// <param name="addr">����ַ</param>
-/// <param name="data">������</param>
-/// <param name="len">������</param>
-/// <param name="isBit">�Ƿ���bit�ռ�</param>
+/**
+ * @brief 从多个空间读取数据
+ * @param srcs 被读空间s
+ * @param addr 读地址
+ * @param data 读缓冲
+ * @param len 读长度
+ * @param isBit 是否是bit空间
+ */
 void AreaRead2(Area_t* srcs, int addr, byte* data, int len, bool isBit);
 
-/// <summary>�����ռ�д����</summary>
-/// <param name="dsts">���</param>
-/// <param name="addr">д���ַ</param>
-/// <param name="data">�����</param>
-/// <param name="len">д�볤��</param>
-/// <param name="isBit">�Ƿ���bit�ռ�</param>
+/**
+ * @brief 向多个空间写数据
+ * @param dsts 被写入
+ * @param addr 写入地址
+ * @param data 写入数据
+ * @param len 写入长度
+ * @param isBit 是否是bit空间
+ */
 void AreaWrite2(Area_t* dsts, int addr, byte* data, int len, bool isBit);
 
 
 /*
-modbus �ο�ʹ�á�
+modbus 参考使用。
 
 void OutInit(Area_t* thiss)
 {
-	// �����״̬
+	// 读输出状态
 	static byte local[1];
 	thiss->Buff = local;
 }
 
 void OutFresh(Area_t* thiss)
 {
-	// ˢ�� IO ���
+	// 刷新 IO 输出
 }
 
 void InInit(Area_t* thiss)
 {
-	// ������״̬
+	// 读输入状态
 	static byte local[1];
 	thiss->Buff = local;
 }
 
 Area_t BitAreas[] =
 {
-	// ��Ȧ
+	// 线圈
 	{.Addr = 0x0000,.Size = 6,.Init = OutInit,.Fresh = OutFresh },
-	// ��ɢ����
+	// 离散输入
 	{.Addr = 0x2020,.Size = 6,.Init = InInit,.Fresh = NULL },
 	{.Size = 0 }
 };
 
 void InfoInit(Area_t* thiss)
 {
-	// ��Ʒ��Ϣ
+	// 产品信息
 }
 
-// ע�⣬����ĵ�ַ�� �ֽڵ�ַ������ modbus ��Ҫ X2 ����
+// 注意,这里的地址是 字节地址,碰到 modbus 需要 X2 处理
 Area_t ByteAreas[] =
 {
-	// �Ĵ���
+	// 寄存器
 	{.Addr = 0x8000,.Size = 16,.Init = InfoInit,.Fresh = NULL },
 	{.Size = 0 }
 };
 
-// bit ��Ȧ in/out ����
+// bit 线圈 in/out 操作
 AreaRead2(BitAreas, addr, data, len ,true);
 AreaWrite2(BitAreas, addr, data, len ,true);
 
-// �Ĵ�����������Ϊ�Ĵ����� short λ������ַ��Ҫ X 2 
+// 寄存器操作,因为寄存器是 short 位宽,地址需要 X 2 
 AreaRead2(BitAreas, regaddr * 2, data, regcnt * 2 ,true);
 AreaWrite2(BitAreas, regaddr * 2, data, regcnt * 2 ,true);