Quellcode durchsuchen

add slave send and master recv

haitao vor 1 Jahr
Ursprung
Commit
6c88328611
63 geänderte Dateien mit 16997 neuen und 6647 gelöschten Zeilen
  1. 1 1
      app/CORE/startup_stm32f2xx.s
  2. 4 2
      app/HARDWARE/includes/usart.h
  3. 143 13
      app/HARDWARE/sources/usart.c
  4. 4 0
      app/MDKProject/.vscode/c_cpp_properties.json
  5. 26 0
      app/MDKProject/.vscode/keil-assistant.log
  6. 8474 3278
      app/MDKProject/JLinkLog.txt
  7. 1808 1122
      app/MDKProject/Listings/lora_gateway.map
  8. 13 13
      app/MDKProject/Listings/startup_stm32f2xx.lst
  9. 392 419
      app/MDKProject/lora_gateway.uvguix.16936
  10. 177 77
      app/MDKProject/lora_gateway.uvoptx
  11. 47 2
      app/MDKProject/lora_gateway.uvprojx
  12. BIN
      app/OBJ/dlt645.crf
  13. 10 0
      app/OBJ/dlt645.d
  14. BIN
      app/OBJ/dlt645_1997.crf
  15. 9 0
      app/OBJ/dlt645_1997.d
  16. BIN
      app/OBJ/dlt645_2007.crf
  17. 9 0
      app/OBJ/dlt645_2007.d
  18. BIN
      app/OBJ/dlt645_data.crf
  19. 9 0
      app/OBJ/dlt645_data.d
  20. BIN
      app/OBJ/dlt645_port.crf
  21. 43 0
      app/OBJ/dlt645_port.d
  22. BIN
      app/OBJ/gateway_message.crf
  23. BIN
      app/OBJ/log.crf
  24. BIN
      app/OBJ/lora_gateway.axf
  25. 3 32
      app/OBJ/lora_gateway.build_log.htm
  26. 2700 1371
      app/OBJ/lora_gateway.htm
  27. 7 0
      app/OBJ/lora_gateway.lnp
  28. 258 81
      app/OBJ/lora_gateway_Target 1.dep
  29. BIN
      app/OBJ/main.crf
  30. BIN
      app/OBJ/mmodbus.crf
  31. 45 0
      app/OBJ/mmodbus.d
  32. BIN
      app/OBJ/node_data_acquisition.crf
  33. 48 0
      app/OBJ/node_data_acquisition.d
  34. BIN
      app/OBJ/node_message.crf
  35. BIN
      app/OBJ/protocol.crf
  36. BIN
      app/OBJ/task.crf
  37. 7 0
      app/OBJ/task.d
  38. BIN
      app/OBJ/usart.crf
  39. 5 3
      app/SYSTEM/includes/gateway_message.h
  40. 7 0
      app/SYSTEM/includes/node_data_acquisition.h
  41. 4 2
      app/SYSTEM/includes/node_message.h
  42. 2 2
      app/SYSTEM/includes/protocol.h
  43. 91 75
      app/SYSTEM/source/gateway_message.c
  44. 96 0
      app/SYSTEM/source/node_data_acquisition.c
  45. 0 1
      app/SYSTEM/source/node_message.c
  46. 352 85
      app/SYSTEM/source/protocol.c
  47. 109 63
      app/SYSTEM/source/task.c
  48. 4 5
      app/USER/main.c
  49. 46 0
      app/dlt/inc/dlt645.h
  50. 11 0
      app/dlt/inc/dlt645_1997.h
  51. 53 0
      app/dlt/inc/dlt645_1997_private.h
  52. 11 0
      app/dlt/inc/dlt645_2007.h
  53. 128 0
      app/dlt/inc/dlt645_2007_private.h
  54. 56 0
      app/dlt/inc/dlt645_private.h
  55. 138 0
      app/dlt/port/dlt645_port.c
  56. 10 0
      app/dlt/port/dlt645_port.h
  57. 131 0
      app/dlt/src/dlt645.c
  58. 141 0
      app/dlt/src/dlt645_1997.c
  59. 279 0
      app/dlt/src/dlt645_2007.c
  60. 289 0
      app/dlt/src/dlt645_data.c
  61. 613 0
      app/modbus/mmodbus.c
  62. 166 0
      app/modbus/mmodbus.h
  63. 18 0
      app/modbus/mmodbusConfig.h

+ 1 - 1
app/CORE/startup_stm32f2xx.s

@@ -33,7 +33,7 @@
 ;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
 ; </h>
 
-Stack_Size      EQU     0x00004000
+Stack_Size      EQU     0x00005000
 
                 AREA    STACK, NOINIT, READWRITE, ALIGN=3
 Stack_Mem       SPACE   Stack_Size

+ 4 - 2
app/HARDWARE/includes/usart.h

@@ -74,8 +74,8 @@
 #define USART_485_IRQHandler                  USART3_IRQHandler
 #define USART_485_IRQ                 				USART3_IRQn
 //485¿ØÖÆÒý½Å
-#define USART_485_DE_GPIO_PORT 								GPIOA
-#define USART_485_DE_GPIO_CLK									RCC_AHB1Periph_GPIOA
+#define USART_485_DE_GPIO_PORT 								GPIOC
+#define USART_485_DE_GPIO_CLK									RCC_AHB1Periph_GPIOC
 #define USART_485_DE_PIN											GPIO_Pin_12
 
 void Debug_USART_Config(void);
@@ -86,6 +86,8 @@ void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch);
 void USART_DMA_Config(void);
 void DEBUG_USART_Config(void);
 void USART_232_config();
+void Usart_SendHex( USART_TypeDef * pUSARTx, uint8_t *str,uint16_t hexLength);
+void USART_485_config();
 
 extern uint8_t UART6_RX_BUF[BUFF_SIZE];
 extern uint8_t UART6_RX_STAT;

+ 143 - 13
app/HARDWARE/sources/usart.c

@@ -142,28 +142,126 @@ void DMA2_Stream5_IRQHandler() {
 }
 
 /*
-	485串口在未配置情况下,初始化的参数
+	485串口de控制端口
 */
+void USART_485_DE_init()
+{
+	GPIO_InitTypeDef GPIO_InitStruct;
+	RCC_AHB1PeriphClockCmd(USART_485_DE_GPIO_CLK, ENABLE);
+	GPIO_InitStruct.GPIO_Pin = USART_485_DE_PIN; 
+  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
+  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
+  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
+  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
+  GPIO_Init(USART_485_DE_GPIO_PORT, &GPIO_InitStruct);
 
+}
+void USART_485_DE_TX()
+{
+	GPIO_WriteBit(USART_485_DE_GPIO_PORT,USART_485_DE_PIN,1);
+}
+void USART_485_DE_RX()
+{
+	GPIO_WriteBit(USART_485_DE_GPIO_PORT,USART_485_DE_PIN,0);
+}
+void USART_485_Send(uint8_t *message,uint16_t size)
+{
+	uint16_t i=0;
+	USART_485_DE_TX();
+	for(i=0;i<size;i++)
+	{
+		USART_SendData(USART_232,*(message+i));
+		while (USART_GetFlagStatus(USART_232, USART_FLAG_TC) == RESET);
+	}
+	USART_485_DE_RX();
+}
+//void _485_Config(void)
+//{
+//	GPIO_InitTypeDef GPIO_InitStructure;
+//	USART_InitTypeDef USART_InitStructure;
+
+//	/* config USART clock */
+//	RCC_AHB1PeriphClockCmd(_485_USART_RX_GPIO_CLK|_485_USART_TX_GPIO_CLK|_485_RE_GPIO_CLK, ENABLE);
+//	RCC_APB1PeriphClockCmd(_485_USART_CLK, ENABLE); 
+
+//	
+//	  /* Connect PXx to USARTx_Tx*/
+//  GPIO_PinAFConfig(_485_USART_RX_GPIO_PORT,_485_USART_RX_SOURCE, _485_USART_RX_AF);
+
+//  /* Connect PXx to USARTx_Rx*/
+//  GPIO_PinAFConfig(_485_USART_TX_GPIO_PORT,_485_USART_TX_SOURCE,_485_USART_TX_AF);
+
+//	
+//	/* USART GPIO config */
+//   /* Configure USART Tx as alternate function push-pull */
+//  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+//  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
+//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
+
+//  GPIO_InitStructure.GPIO_Pin = _485_USART_TX_PIN  ;
+//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+//  GPIO_Init(_485_USART_TX_GPIO_PORT, &GPIO_InitStructure);
+
+//  /* Configure USART Rx as alternate function  */
+//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; 
+//	GPIO_InitStructure.GPIO_Pin = _485_USART_RX_PIN;
+//  GPIO_Init(_485_USART_RX_GPIO_PORT, &GPIO_InitStructure);
+
+//  
+//  /* 485收发控制管脚 */
+//  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
+//  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
+//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
+//  GPIO_InitStructure.GPIO_Pin = _485_RE_PIN  ;
+//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+//  GPIO_Init(_485_RE_GPIO_PORT, &GPIO_InitStructure);
+//	  
+//	/* USART mode config */
+//	USART_InitStructure.USART_BaudRate = _485_USART_BAUDRATE;
+//	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
+//	USART_InitStructure.USART_StopBits = USART_StopBits_1;
+//	USART_InitStructure.USART_Parity = USART_Parity_No ;
+//	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
+//	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
+
+//	USART_Init(_485_USART, &USART_InitStructure); 
+//  USART_Cmd(_485_USART, ENABLE);
+//	
+//	NVIC_Configuration();
+//	/* 使能串口接收中断 */
+//	USART_ITConfig(_485_USART, USART_IT_RXNE, ENABLE);
+//	
+//	GPIO_ResetBits(_485_RE_GPIO_PORT,_485_RE_PIN); //默认进入接收模式
+//}
+
+/*
+	485串口在未配置情况下,初始化的参数
+*/
 void USART_485_config()
 {
+
+	USART_485_DE_init();
 	USART_InitTypeDef USART_InitStruct;
   GPIO_InitTypeDef GPIO_InitStruct;
 
-  RCC_AHB1PeriphClockCmd(USART_485_CLK, ENABLE);
-
-  RCC_AHB1PeriphClockCmd(USART_485_RX_GPIO_CLK, ENABLE);
-
-  GPIO_InitStruct.GPIO_Pin = USART_485_RX_PIN | USART_485_TX_PIN; 
+	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
+  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
+	
+	GPIO_PinAFConfig(USART_485_RX_GPIO_PORT, USART_485_RX_SOURCE, USART_485_RX_AF);
+  GPIO_PinAFConfig(USART_485_TX_GPIO_PORT, USART_485_TX_SOURCE, USART_485_TX_AF);
+	
+  GPIO_InitStruct.GPIO_Pin = USART_485_TX_PIN ;
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
   GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
-  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
+  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOC, &GPIO_InitStruct);
+	
+  GPIO_InitStruct.GPIO_Pin = USART_485_RX_PIN;
+	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
+	GPIO_Init(GPIOC, &GPIO_InitStruct);
 
-  GPIO_PinAFConfig(USART_485_RX_GPIO_PORT, USART_485_RX_SOURCE, USART_485_RX_AF);
-  GPIO_PinAFConfig(USART_485_TX_GPIO_PORT, USART_485_TX_SOURCE, USART_485_TX_AF);
-
+	
   USART_InitStruct.USART_BaudRate = USART_485_BAUDRATE;
   USART_InitStruct.USART_WordLength = USART_WordLength_8b;
   USART_InitStruct.USART_StopBits = USART_StopBits_1;
@@ -173,8 +271,17 @@ void USART_485_config()
   USART_Init(USART_485, &USART_InitStruct);
 
   USART_Cmd(USART_485, ENABLE);
+	
+	USART_ClearFlag(USART_485, USART_FLAG_TC);
 	USART_ITConfig(USART_485,USART_IT_RXNE,ENABLE);
 	USART_ITConfig(USART_485,USART_IT_IDLE,ENABLE);
+	
+	NVIC_InitTypeDef NVIC_InitStruct;
+	NVIC_InitStruct.NVIC_IRQChannel = USART_485_IRQ;
+	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
+	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
+	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
+	NVIC_Init(&NVIC_InitStruct);
 }
 /*
  *  函数名:void Config_485_Port(uint32_t baudrate, uint8_t databits, uint8_t stopbits, uint8_t parity, uint8_t flowcontrol)
@@ -196,9 +303,9 @@ void Config_485_Port(uint32_t baudrate, uint8_t databits, uint8_t stopbits, uint
 
   RCC_AHB1PeriphClockCmd(USART_485_CLK, ENABLE);
 
-  RCC_AHB1PeriphClockCmd(USART_485_RX_GPIO_CLK, ENABLE);
+  RCC_APB2PeriphClockCmd(USART_485_RX_GPIO_CLK, ENABLE);
 
-   GPIO_InitStruct.GPIO_Pin = USART_485_RX_PIN | USART_485_TX_PIN; 
+  GPIO_InitStruct.GPIO_Pin = USART_485_RX_PIN | USART_485_TX_PIN; 
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
   GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
   GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
@@ -219,8 +326,18 @@ void Config_485_Port(uint32_t baudrate, uint8_t databits, uint8_t stopbits, uint
   USART_Init(USART_485, &USART_InitStruct);
 
   USART_Cmd(USART_485, ENABLE);
+	USART_ClearFlag(USART1, USART_FLAG_TC);
 	USART_ITConfig(USART_485,USART_IT_RXNE,ENABLE);
 	USART_ITConfig(USART_485,USART_IT_IDLE,ENABLE);
+	
+	 // 配置485接收中断优先级
+	NVIC_InitTypeDef NVIC_InitStruct;
+	NVIC_InitStruct.NVIC_IRQChannel = USART_485_IRQ;
+	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
+	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
+	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
+	NVIC_Init(&NVIC_InitStruct);
+	
 }
 /*
 	232串口配置
@@ -299,7 +416,20 @@ void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
   while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
   {}
 }
-
+/*****************  输出Hex字符串可能包含0x00**********************/
+void Usart_SendHex( USART_TypeDef * pUSARTx, uint8_t *str,uint16_t hexLength)
+{
+	unsigned int k=0;
+	do 
+  {
+      Usart_SendByte( pUSARTx, *(str + k) );
+      k++;
+  } while(k==hexLength);
+  
+  /* 等待发送完成 */
+  while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
+  {}
+}
 /*****************  发送一个16位数 **********************/
 void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)
 {

+ 4 - 0
app/MDKProject/.vscode/c_cpp_properties.json

@@ -14,6 +14,10 @@
                 "d:\\Project\\Lora_gateway_sx1278\\app\\SYSTEM\\includes",
                 "d:\\Project\\Lora_gateway_sx1278\\app\\Sx1278\\radio",
                 "d:\\Project\\Lora_gateway_sx1278\\app\\Sx1278\\platform",
+                "d:\\Project\\Lora_gateway_sx1278\\app\\modbus",
+                "d:\\Project\\Lora_gateway_sx1278\\app\\dlt\\inc",
+                "d:\\Project\\Lora_gateway_sx1278\\app\\dlt\\port",
+                "d:\\Project\\Lora_gateway_sx1278\\app\\dlt\\src",
                 "D:\\workSoftware\\stm32Software\\mdk\\mdkcore\\ARM\\ARMCC\\include",
                 "D:\\workSoftware\\stm32Software\\mdk\\mdkcore\\ARM\\ARMCC\\include\\rw",
                 "d:\\Project\\Lora_gateway_sx1278\\app\\SYSTEM\\source",

+ 26 - 0
app/MDKProject/.vscode/keil-assistant.log

@@ -95,3 +95,29 @@
 
 [info] Log at : 2023/8/11|08:29:18|GMT+0800
 
+[info] Log at : 2023/8/14|16:27:08|GMT+0800
+
+[info] Log at : 2023/8/14|17:14:30|GMT+0800
+
+[info] Log at : 2023/8/14|20:03:30|GMT+0800
+
+[info] Log at : 2023/8/14|21:01:00|GMT+0800
+
+[info] Log at : 2023/8/14|21:04:20|GMT+0800
+
+[info] Log at : 2023/8/15|10:50:25|GMT+0800
+
+[info] Log at : 2023/8/15|13:46:53|GMT+0800
+
+[info] Log at : 2023/8/15|17:06:51|GMT+0800
+
+[info] Log at : 2023/8/21|10:25:52|GMT+0800
+
+[info] Log at : 2023/8/21|13:40:48|GMT+0800
+
+[info] Log at : 2023/8/21|19:39:11|GMT+0800
+
+[info] Log at : 2023/8/21|20:00:04|GMT+0800
+
+[info] Log at : 2023/8/22|14:42:02|GMT+0800
+

Datei-Diff unterdrückt, da er zu groß ist
+ 8474 - 3278
app/MDKProject/JLinkLog.txt


Datei-Diff unterdrückt, da er zu groß ist
+ 1808 - 1122
app/MDKProject/Listings/lora_gateway.map


+ 13 - 13
app/MDKProject/Listings/startup_stm32f2xx.lst

@@ -53,31 +53,31 @@ ARM Macro Assembler    Page 1
    33 00000000         ;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
    34 00000000         ; </h>
    35 00000000         
-   36 00000000 00004000 
+   36 00000000 00005000 
                        Stack_Size
-                               EQU              0x00004000
+                               EQU              0x00005000
    37 00000000         
    38 00000000                 AREA             STACK, NOINIT, READWRITE, ALIGN
 =3
    39 00000000         Stack_Mem
                                SPACE            Stack_Size
-   40 00004000         __initial_sp
-   41 00004000         
+   40 00005000         __initial_sp
+   41 00005000         
 
 
 
 ARM Macro Assembler    Page 2 
 
 
-   42 00004000         ; <h> Heap Configuration
-   43 00004000         ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
-   44 00004000         ; </h>
-   45 00004000         
-   46 00004000 00004000 
+   42 00005000         ; <h> Heap Configuration
+   43 00005000         ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+   44 00005000         ; </h>
+   45 00005000         
+   46 00005000 00004000 
                        Heap_Size
                                EQU              0x00004000
-   47 00004000         
-   48 00004000                 AREA             HEAP, NOINIT, READWRITE, ALIGN=
+   47 00005000         
+   48 00005000                 AREA             HEAP, NOINIT, READWRITE, ALIGN=
 3
    49 00000000         __heap_base
    50 00000000         Heap_Mem
@@ -862,7 +862,7 @@ Symbol: Stack_Mem
    Uses
       None
 Comment: Stack_Mem unused
-__initial_sp 00004000
+__initial_sp 00005000
 
 Symbol: __initial_sp
    Definitions
@@ -1884,7 +1884,7 @@ Symbol: Heap_Size
    Uses
       At line 50 in file ..\CORE\startup_stm32f2xx.s
 Comment: Heap_Size used once
-Stack_Size 00004000
+Stack_Size 00005000
 
 Symbol: Stack_Size
    Definitions

Datei-Diff unterdrückt, da er zu groß ist
+ 392 - 419
app/MDKProject/lora_gateway.uvguix.16936


+ 177 - 77
app/MDKProject/lora_gateway.uvoptx

@@ -157,25 +157,25 @@
         <Bp>
           <Number>0</Number>
           <Type>0</Type>
-          <LineNumber>131</LineNumber>
+          <LineNumber>88</LineNumber>
           <EnabledFlag>1</EnabledFlag>
-          <Address>0</Address>
+          <Address>134248924</Address>
           <ByteObject>0</ByteObject>
           <HtxType>0</HtxType>
           <ManyObjects>0</ManyObjects>
           <SizeOfObject>0</SizeOfObject>
           <BreakByAccess>0</BreakByAccess>
-          <BreakIfRCount>0</BreakIfRCount>
-          <Filename>..\SYSTEM\source\gateway_message.c</Filename>
+          <BreakIfRCount>1</BreakIfRCount>
+          <Filename>..\SYSTEM\source\task.c</Filename>
           <ExecCommand></ExecCommand>
-          <Expression></Expression>
+          <Expression>\\lora_gateway\../SYSTEM/source/task.c\88</Expression>
         </Bp>
       </Breakpoint>
       <MemoryWindow1>
         <Mm>
           <WinNumber>1</WinNumber>
-          <SubType>8</SubType>
-          <ItemText>paramString</ItemText>
+          <SubType>0</SubType>
+          <ItemText>lora_config_json</ItemText>
           <AccSizeX>0</AccSizeX>
         </Mm>
       </MemoryWindow1>
@@ -233,7 +233,7 @@
 
   <Group>
     <GroupName>USER</GroupName>
-    <tvExp>1</tvExp>
+    <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
@@ -333,7 +333,7 @@
       <GroupNumber>2</GroupNumber>
       <FileNumber>8</FileNumber>
       <FileType>1</FileType>
-      <tvExp>1</tvExp>
+      <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
       <PathWithFileName>..\SYSTEM\source\protocol.c</PathWithFileName>
@@ -353,6 +353,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>10</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\SYSTEM\source\node_data_acquisition.c</PathWithFileName>
+      <FilenameWithoutPath>node_data_acquisition.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
@@ -363,7 +375,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>10</FileNumber>
+      <FileNumber>11</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -375,7 +387,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>11</FileNumber>
+      <FileNumber>12</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -387,7 +399,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>12</FileNumber>
+      <FileNumber>13</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -399,7 +411,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>13</FileNumber>
+      <FileNumber>14</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -411,7 +423,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>14</FileNumber>
+      <FileNumber>15</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -423,7 +435,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>15</FileNumber>
+      <FileNumber>16</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -435,7 +447,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>16</FileNumber>
+      <FileNumber>17</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -447,7 +459,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>17</FileNumber>
+      <FileNumber>18</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -459,7 +471,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>18</FileNumber>
+      <FileNumber>19</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -471,7 +483,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>19</FileNumber>
+      <FileNumber>20</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -483,7 +495,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>20</FileNumber>
+      <FileNumber>21</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -495,7 +507,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>21</FileNumber>
+      <FileNumber>22</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -507,7 +519,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>22</FileNumber>
+      <FileNumber>23</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -519,7 +531,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>23</FileNumber>
+      <FileNumber>24</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -531,7 +543,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>24</FileNumber>
+      <FileNumber>25</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -543,7 +555,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>25</FileNumber>
+      <FileNumber>26</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -555,7 +567,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>26</FileNumber>
+      <FileNumber>27</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -567,7 +579,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>27</FileNumber>
+      <FileNumber>28</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -579,7 +591,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>28</FileNumber>
+      <FileNumber>29</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -591,7 +603,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>29</FileNumber>
+      <FileNumber>30</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -603,7 +615,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>30</FileNumber>
+      <FileNumber>31</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -615,7 +627,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>31</FileNumber>
+      <FileNumber>32</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -627,7 +639,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>32</FileNumber>
+      <FileNumber>33</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -639,7 +651,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>33</FileNumber>
+      <FileNumber>34</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -651,7 +663,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>34</FileNumber>
+      <FileNumber>35</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -663,7 +675,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>35</FileNumber>
+      <FileNumber>36</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -675,7 +687,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>36</FileNumber>
+      <FileNumber>37</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -687,7 +699,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>37</FileNumber>
+      <FileNumber>38</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -699,7 +711,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>38</FileNumber>
+      <FileNumber>39</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -711,7 +723,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>39</FileNumber>
+      <FileNumber>40</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -723,7 +735,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>40</FileNumber>
+      <FileNumber>41</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -737,13 +749,13 @@
 
   <Group>
     <GroupName>CORE</GroupName>
-    <tvExp>1</tvExp>
+    <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>41</FileNumber>
+      <FileNumber>42</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -763,7 +775,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>42</FileNumber>
+      <FileNumber>43</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -775,7 +787,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>43</FileNumber>
+      <FileNumber>44</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -787,7 +799,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>44</FileNumber>
+      <FileNumber>45</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -799,7 +811,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>45</FileNumber>
+      <FileNumber>46</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -811,7 +823,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>46</FileNumber>
+      <FileNumber>47</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -823,7 +835,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>47</FileNumber>
+      <FileNumber>48</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -835,7 +847,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>48</FileNumber>
+      <FileNumber>49</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -847,7 +859,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>49</FileNumber>
+      <FileNumber>50</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -859,7 +871,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>50</FileNumber>
+      <FileNumber>51</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -873,13 +885,13 @@
 
   <Group>
     <GroupName>FatFS</GroupName>
-    <tvExp>1</tvExp>
+    <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>51</FileNumber>
+      <FileNumber>52</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -891,7 +903,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>52</FileNumber>
+      <FileNumber>53</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -903,7 +915,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>53</FileNumber>
+      <FileNumber>54</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -923,7 +935,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>54</FileNumber>
+      <FileNumber>55</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -935,7 +947,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>55</FileNumber>
+      <FileNumber>56</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -947,7 +959,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>56</FileNumber>
+      <FileNumber>57</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -959,7 +971,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>57</FileNumber>
+      <FileNumber>58</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -971,7 +983,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>58</FileNumber>
+      <FileNumber>59</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -983,7 +995,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>59</FileNumber>
+      <FileNumber>60</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -995,7 +1007,7 @@
     </File>
     <File>
       <GroupNumber>7</GroupNumber>
-      <FileNumber>60</FileNumber>
+      <FileNumber>61</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1015,7 +1027,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>61</FileNumber>
+      <FileNumber>62</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1027,7 +1039,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>62</FileNumber>
+      <FileNumber>63</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1039,7 +1051,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>63</FileNumber>
+      <FileNumber>64</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1051,7 +1063,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>64</FileNumber>
+      <FileNumber>65</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1063,7 +1075,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>65</FileNumber>
+      <FileNumber>66</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1075,7 +1087,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>66</FileNumber>
+      <FileNumber>67</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1087,7 +1099,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>67</FileNumber>
+      <FileNumber>68</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1099,7 +1111,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>68</FileNumber>
+      <FileNumber>69</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1111,7 +1123,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>69</FileNumber>
+      <FileNumber>70</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1123,7 +1135,7 @@
     </File>
     <File>
       <GroupNumber>8</GroupNumber>
-      <FileNumber>70</FileNumber>
+      <FileNumber>71</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1143,7 +1155,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>71</FileNumber>
+      <FileNumber>72</FileNumber>
       <FileType>5</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1155,7 +1167,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>72</FileNumber>
+      <FileNumber>73</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1167,7 +1179,7 @@
     </File>
     <File>
       <GroupNumber>9</GroupNumber>
-      <FileNumber>73</FileNumber>
+      <FileNumber>74</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1187,7 +1199,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>10</GroupNumber>
-      <FileNumber>74</FileNumber>
+      <FileNumber>75</FileNumber>
       <FileType>5</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1199,7 +1211,7 @@
     </File>
     <File>
       <GroupNumber>10</GroupNumber>
-      <FileNumber>75</FileNumber>
+      <FileNumber>76</FileNumber>
       <FileType>5</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -1211,4 +1223,92 @@
     </File>
   </Group>
 
+  <Group>
+    <GroupName>DLT645</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>11</GroupNumber>
+      <FileNumber>77</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\dlt\src\dlt645.c</PathWithFileName>
+      <FilenameWithoutPath>dlt645.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>11</GroupNumber>
+      <FileNumber>78</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\dlt\src\dlt645_1997.c</PathWithFileName>
+      <FilenameWithoutPath>dlt645_1997.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>11</GroupNumber>
+      <FileNumber>79</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\dlt\src\dlt645_2007.c</PathWithFileName>
+      <FilenameWithoutPath>dlt645_2007.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>11</GroupNumber>
+      <FileNumber>80</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\dlt\src\dlt645_data.c</PathWithFileName>
+      <FilenameWithoutPath>dlt645_data.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>11</GroupNumber>
+      <FileNumber>81</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\dlt\port\dlt645_port.c</PathWithFileName>
+      <FilenameWithoutPath>dlt645_port.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>MODBUS</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>12</GroupNumber>
+      <FileNumber>82</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\modbus\mmodbus.c</PathWithFileName>
+      <FilenameWithoutPath>mmodbus.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
 </ProjectOpt>

+ 47 - 2
app/MDKProject/lora_gateway.uvprojx

@@ -52,7 +52,7 @@
           <OutputName>lora_gateway</OutputName>
           <CreateExecutable>1</CreateExecutable>
           <CreateLib>0</CreateLib>
-          <CreateHexFile>0</CreateHexFile>
+          <CreateHexFile>1</CreateHexFile>
           <DebugInformation>1</DebugInformation>
           <BrowseInformation>1</BrowseInformation>
           <ListingPath>.\Listings\</ListingPath>
@@ -338,7 +338,7 @@
               <MiscControls></MiscControls>
               <Define>USE_STDPERIPH_DRIVER,DATA_IN_ExtSRAM,MASTER</Define>
               <Undefine></Undefine>
-              <IncludePath>..\CORE;..\Libraries\inc;..\USER;..\HARDWARE\includes;..\USER\FatFS\src;..\UCOS-II\CONFIG;..\UCOS-II\Ports;..\UCOS-II\Source;..\SYSTEM\includes;..\Sx1278\radio;..\Sx1278\platform</IncludePath>
+              <IncludePath>..\CORE;..\Libraries\inc;..\USER;..\HARDWARE\includes;..\USER\FatFS\src;..\UCOS-II\CONFIG;..\UCOS-II\Ports;..\UCOS-II\Source;..\SYSTEM\includes;..\Sx1278\radio;..\Sx1278\platform;..\modbus;..\dlt\inc;..\dlt\port;..\dlt\src</IncludePath>
             </VariousControls>
           </Cads>
           <Aads>
@@ -432,6 +432,11 @@
               <FileType>1</FileType>
               <FilePath>..\SYSTEM\source\node_message.c</FilePath>
             </File>
+            <File>
+              <FileName>node_data_acquisition.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\SYSTEM\source\node_data_acquisition.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>
@@ -804,6 +809,46 @@
             </File>
           </Files>
         </Group>
+        <Group>
+          <GroupName>DLT645</GroupName>
+          <Files>
+            <File>
+              <FileName>dlt645.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\dlt\src\dlt645.c</FilePath>
+            </File>
+            <File>
+              <FileName>dlt645_1997.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\dlt\src\dlt645_1997.c</FilePath>
+            </File>
+            <File>
+              <FileName>dlt645_2007.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\dlt\src\dlt645_2007.c</FilePath>
+            </File>
+            <File>
+              <FileName>dlt645_data.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\dlt\src\dlt645_data.c</FilePath>
+            </File>
+            <File>
+              <FileName>dlt645_port.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\dlt\port\dlt645_port.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>MODBUS</GroupName>
+          <Files>
+            <File>
+              <FileName>mmodbus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\modbus\mmodbus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
       </Groups>
     </Target>
   </Targets>

BIN
app/OBJ/dlt645.crf


+ 10 - 0
app/OBJ/dlt645.d

@@ -0,0 +1,10 @@
+..\obj\dlt645.o: ..\dlt\src\dlt645.c
+..\obj\dlt645.o: ..\dlt\inc\dlt645_private.h
+..\obj\dlt645.o: ..\dlt\inc\dlt645.h
+..\obj\dlt645.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\dlt645.o: ..\UCOS-II\Source\ucos_ii.h
+..\obj\dlt645.o: ..\UCOS-II\CONFIG\os_cfg.h
+..\obj\dlt645.o: ..\UCOS-II\Ports\os_cpu.h
+..\obj\dlt645.o: ..\dlt\inc\dlt645_1997.h
+..\obj\dlt645.o: ..\dlt\inc\dlt645_2007.h
+..\obj\dlt645.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\string.h

BIN
app/OBJ/dlt645_1997.crf


+ 9 - 0
app/OBJ/dlt645_1997.d

@@ -0,0 +1,9 @@
+..\obj\dlt645_1997.o: ..\dlt\src\dlt645_1997.c
+..\obj\dlt645_1997.o: ..\dlt\inc\dlt645_private.h
+..\obj\dlt645_1997.o: ..\dlt\inc\dlt645.h
+..\obj\dlt645_1997.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\dlt645_1997.o: ..\UCOS-II\Source\ucos_ii.h
+..\obj\dlt645_1997.o: ..\UCOS-II\CONFIG\os_cfg.h
+..\obj\dlt645_1997.o: ..\UCOS-II\Ports\os_cpu.h
+..\obj\dlt645_1997.o: ..\dlt\inc\dlt645_1997_private.h
+..\obj\dlt645_1997.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\string.h

BIN
app/OBJ/dlt645_2007.crf


+ 9 - 0
app/OBJ/dlt645_2007.d

@@ -0,0 +1,9 @@
+..\obj\dlt645_2007.o: ..\dlt\src\dlt645_2007.c
+..\obj\dlt645_2007.o: ..\dlt\inc\dlt645_private.h
+..\obj\dlt645_2007.o: ..\dlt\inc\dlt645.h
+..\obj\dlt645_2007.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\dlt645_2007.o: ..\UCOS-II\Source\ucos_ii.h
+..\obj\dlt645_2007.o: ..\UCOS-II\CONFIG\os_cfg.h
+..\obj\dlt645_2007.o: ..\UCOS-II\Ports\os_cpu.h
+..\obj\dlt645_2007.o: ..\dlt\inc\dlt645_2007_private.h
+..\obj\dlt645_2007.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\string.h

BIN
app/OBJ/dlt645_data.crf


+ 9 - 0
app/OBJ/dlt645_data.d

@@ -0,0 +1,9 @@
+..\obj\dlt645_data.o: ..\dlt\src\dlt645_data.c
+..\obj\dlt645_data.o: ..\dlt\inc\dlt645_private.h
+..\obj\dlt645_data.o: ..\dlt\inc\dlt645.h
+..\obj\dlt645_data.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\dlt645_data.o: ..\UCOS-II\Source\ucos_ii.h
+..\obj\dlt645_data.o: ..\UCOS-II\CONFIG\os_cfg.h
+..\obj\dlt645_data.o: ..\UCOS-II\Ports\os_cpu.h
+..\obj\dlt645_data.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\string.h
+..\obj\dlt645_data.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\math.h

BIN
app/OBJ/dlt645_port.crf


+ 43 - 0
app/OBJ/dlt645_port.d

@@ -0,0 +1,43 @@
+..\obj\dlt645_port.o: ..\dlt\port\dlt645_port.c
+..\obj\dlt645_port.o: ..\dlt\inc\dlt645.h
+..\obj\dlt645_port.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\dlt645_port.o: ..\UCOS-II\Source\ucos_ii.h
+..\obj\dlt645_port.o: ..\UCOS-II\CONFIG\os_cfg.h
+..\obj\dlt645_port.o: ..\UCOS-II\Ports\os_cpu.h
+..\obj\dlt645_port.o: ..\USER\stm32f2xx.h
+..\obj\dlt645_port.o: ..\CORE\core_cm3.h
+..\obj\dlt645_port.o: ..\CORE\core_cmInstr.h
+..\obj\dlt645_port.o: ..\CORE\core_cmFunc.h
+..\obj\dlt645_port.o: ..\USER\system_stm32f2xx.h
+..\obj\dlt645_port.o: ..\USER\stm32f2xx_conf.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_adc.h
+..\obj\dlt645_port.o: ..\USER\stm32f2xx.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_can.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_crc.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_cryp.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_dac.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_dbgmcu.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_dcmi.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_dma.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_exti.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_flash.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_fsmc.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_hash.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_gpio.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_i2c.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_iwdg.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_pwr.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_rcc.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_rng.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_rtc.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_sdio.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_spi.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_syscfg.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_tim.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_usart.h
+..\obj\dlt645_port.o: ..\Libraries\inc\stm32f2xx_wwdg.h
+..\obj\dlt645_port.o: ..\Libraries\inc\misc.h
+..\obj\dlt645_port.o: ..\HARDWARE\includes\delay.h
+..\obj\dlt645_port.o: ..\HARDWARE\includes\usart.h
+..\obj\dlt645_port.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdio.h
+..\obj\dlt645_port.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\string.h

BIN
app/OBJ/gateway_message.crf


BIN
app/OBJ/log.crf


BIN
app/OBJ/lora_gateway.axf


+ 3 - 32
app/OBJ/lora_gateway.build_log.htm

@@ -22,41 +22,12 @@ Dialog DLL:      TCM.DLL V1.36.5.0
  
 <h2>Project:</h2>
 D:\Project\Lora_gateway_sx1278\app\MDKProject\lora_gateway.uvprojx
-Project File Date:  08/11/2023
+Project File Date:  08/21/2023
 
 <h2>Output:</h2>
 *** Using Compiler 'V5.06 update 6 (build 750)', folder: 'D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin'
 Build target 'Target 1'
-compiling gateway_message.c...
-..\SYSTEM\includes\gateway_message.h(106): warning:  #1295-D: Deprecated declaration get_gateway_config_params - give arg types
-  GATEWAY_PARAMS *get_gateway_config_params();
-..\SYSTEM\includes\protocol.h(12): warning:  #1-D: last line of file ends without a newline
-  #endif
-..\SYSTEM\source\gateway_message.c(43): warning:  #223-D: function "sprintf" declared implicitly
-  			sprintf(nodeStart,"node_%d",nodeIndex);
-..\SYSTEM\source\gateway_message.c(85): warning:  #223-D: function "sprintf" declared implicitly
-          sprintf(device, "\"device_%d\":", deviceIndex);
-..\SYSTEM\source\gateway_message.c(71): warning:  #177-D: variable "deviceString"  was declared but never referenced
-      char *deviceString = (char *)nodestring; // 用于移位解析device设备信息
-..\SYSTEM\source\gateway_message.c(170): warning:  #1182-D: a declaration cannot have a label
-          NODE_READ_DLT645_COMMAND *read_dlt645_command = malloc(sizeof(NODE_READ_DLT645_COMMAND));
-..\SYSTEM\source\gateway_message.c(188): warning:  #1182-D: a declaration cannot have a label
-          NODE_READ_MODBUS_COMMAND *read_modbus_command = malloc(sizeof(NODE_READ_MODBUS_COMMAND));
-..\SYSTEM\source\gateway_message.c(166): warning:  #546-D: transfer of control bypasses initialization of:
-            variable "read_dlt645_command"  (declared at line 170)
-            variable "read_modbus_command"  (declared at line 188)
-      switch (device->protocol)
-      ^
-..\SYSTEM\source\gateway_message.c(229): warning:  #223-D: function "sscanf" declared implicitly
-      sscanf(ptr, "%[^\"],", value);
-..\SYSTEM\source\gateway_message.c(247): warning:  #223-D: function "sprintf" declared implicitly
-      sprintf(node_index, "node_%d", nodeNum);
-..\SYSTEM\source\gateway_message.c(248): warning:  #167-D: argument of type "uint8_t *" is incompatible with parameter of type "const char *"
-      strstr(ptr, node_index); // 将指针指向第一个节点
-..\SYSTEM\source\gateway_message.c: 11 warnings, 0 errors
-linking...
-Program Size: Code=30132 RO-data=176472 RW-data=204 ZI-data=662564  
-"..\OBJ\lora_gateway.axf" - 0 Error(s), 11 Warning(s).
+"..\OBJ\lora_gateway.axf" - 0 Error(s), 0 Warning(s).
 
 <h2>Software Packages used:</h2>
 
@@ -70,7 +41,7 @@ Package Vendor: Keil
   D:\workSoftware\stm32Software\mdk\mdkpack\Keil\STM32F2xx_DFP\2.9.0\Drivers\CMSIS\Device\ST\STM32F2xx\Include
 
 <h2>Collection of Component Files used:</h2>
-Build Time Elapsed:  00:00:00
+Build Time Elapsed:  00:00:01
 </pre>
 </body>
 </html>

Datei-Diff unterdrückt, da er zu groß ist
+ 2700 - 1371
app/OBJ/lora_gateway.htm


+ 7 - 0
app/OBJ/lora_gateway.lnp

@@ -8,6 +8,7 @@
 "..\obj\myfile.o"
 "..\obj\protocol.o"
 "..\obj\node_message.o"
+"..\obj\node_data_acquisition.o"
 "..\obj\misc.o"
 "..\obj\stm32f2xx_adc.o"
 "..\obj\stm32f2xx_can.o"
@@ -71,6 +72,12 @@
 "..\obj\os_tmr.o"
 "..\obj\os_cpu_a.o"
 "..\obj\os_cpu_c.o"
+"..\obj\dlt645.o"
+"..\obj\dlt645_1997.o"
+"..\obj\dlt645_2007.o"
+"..\obj\dlt645_data.o"
+"..\obj\dlt645_port.o"
+"..\obj\mmodbus.o"
 --library_type=microlib --strict --scatter "..\OBJ\lora_gateway.sct"
 --summary_stderr --info summarysizes --map --load_addr_map_info --xref --callgraph --symbols
 --info sizes --info totals --info unused --info veneers

Datei-Diff unterdrückt, da er zu groß ist
+ 258 - 81
app/OBJ/lora_gateway_Target 1.dep


BIN
app/OBJ/main.crf


BIN
app/OBJ/mmodbus.crf


+ 45 - 0
app/OBJ/mmodbus.d

@@ -0,0 +1,45 @@
+..\obj\mmodbus.o: ..\modbus\mmodbus.c
+..\obj\mmodbus.o: ..\modbus\mmodbus.h
+..\obj\mmodbus.o: ..\USER\stm32f2xx.h
+..\obj\mmodbus.o: ..\CORE\core_cm3.h
+..\obj\mmodbus.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\mmodbus.o: ..\CORE\core_cmInstr.h
+..\obj\mmodbus.o: ..\CORE\core_cmFunc.h
+..\obj\mmodbus.o: ..\USER\system_stm32f2xx.h
+..\obj\mmodbus.o: ..\USER\stm32f2xx_conf.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_adc.h
+..\obj\mmodbus.o: ..\USER\stm32f2xx.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_can.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_crc.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_cryp.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_dac.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_dbgmcu.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_dcmi.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_dma.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_exti.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_flash.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_fsmc.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_hash.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_gpio.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_i2c.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_iwdg.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_pwr.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_rcc.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_rng.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_rtc.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_sdio.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_spi.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_syscfg.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_tim.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_usart.h
+..\obj\mmodbus.o: ..\Libraries\inc\stm32f2xx_wwdg.h
+..\obj\mmodbus.o: ..\Libraries\inc\misc.h
+..\obj\mmodbus.o: ..\modbus\mmodbusConfig.h
+..\obj\mmodbus.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\mmodbus.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\string.h
+..\obj\mmodbus.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdio.h
+..\obj\mmodbus.o: ..\UCOS-II\Source\ucos_ii.h
+..\obj\mmodbus.o: ..\UCOS-II\CONFIG\os_cfg.h
+..\obj\mmodbus.o: ..\UCOS-II\Ports\os_cpu.h
+..\obj\mmodbus.o: ..\HARDWARE\includes\usart.h
+..\obj\mmodbus.o: ..\HARDWARE\includes\delay.h

BIN
app/OBJ/node_data_acquisition.crf


+ 48 - 0
app/OBJ/node_data_acquisition.d

@@ -0,0 +1,48 @@
+..\obj\node_data_acquisition.o: ..\SYSTEM\source\node_data_acquisition.c
+..\obj\node_data_acquisition.o: ..\SYSTEM\includes\node_data_acquisition.h
+..\obj\node_data_acquisition.o: ..\modbus\mmodbus.h
+..\obj\node_data_acquisition.o: ..\USER\stm32f2xx.h
+..\obj\node_data_acquisition.o: ..\CORE\core_cm3.h
+..\obj\node_data_acquisition.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\node_data_acquisition.o: ..\CORE\core_cmInstr.h
+..\obj\node_data_acquisition.o: ..\CORE\core_cmFunc.h
+..\obj\node_data_acquisition.o: ..\USER\system_stm32f2xx.h
+..\obj\node_data_acquisition.o: ..\USER\stm32f2xx_conf.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_adc.h
+..\obj\node_data_acquisition.o: ..\USER\stm32f2xx.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_can.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_crc.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_cryp.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_dac.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_dbgmcu.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_dcmi.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_dma.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_exti.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_flash.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_fsmc.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_hash.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_gpio.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_i2c.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_iwdg.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_pwr.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_rcc.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_rng.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_rtc.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_sdio.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_spi.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_syscfg.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_tim.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_usart.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\stm32f2xx_wwdg.h
+..\obj\node_data_acquisition.o: ..\Libraries\inc\misc.h
+..\obj\node_data_acquisition.o: ..\modbus\mmodbusConfig.h
+..\obj\node_data_acquisition.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\node_data_acquisition.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\string.h
+..\obj\node_data_acquisition.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdio.h
+..\obj\node_data_acquisition.o: ..\UCOS-II\Source\ucos_ii.h
+..\obj\node_data_acquisition.o: ..\UCOS-II\CONFIG\os_cfg.h
+..\obj\node_data_acquisition.o: ..\UCOS-II\Ports\os_cpu.h
+..\obj\node_data_acquisition.o: ..\dlt\inc\dlt645.h
+..\obj\node_data_acquisition.o: ..\dlt\port\dlt645_port.h
+..\obj\node_data_acquisition.o: ..\SYSTEM\includes\node_message.h
+..\obj\node_data_acquisition.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\math.h

BIN
app/OBJ/node_message.crf


BIN
app/OBJ/protocol.crf


BIN
app/OBJ/task.crf


+ 7 - 0
app/OBJ/task.d

@@ -60,3 +60,10 @@
 ..\obj\task.o: ..\Sx1278\radio\sx1276.h
 ..\obj\task.o: D:\workSoftware\stm32Software\mdk\mdkcore\ARM\ARMCC\Bin\..\include\stdbool.h
 ..\obj\task.o: ..\Sx1278\radio\radio.h
+..\obj\task.o: ..\SYSTEM\includes\protocol.h
+..\obj\task.o: ..\HARDWARE\includes\usart.h
+..\obj\task.o: ..\SYSTEM\includes\node_data_acquisition.h
+..\obj\task.o: ..\modbus\mmodbus.h
+..\obj\task.o: ..\modbus\mmodbusConfig.h
+..\obj\task.o: ..\dlt\inc\dlt645.h
+..\obj\task.o: ..\dlt\port\dlt645_port.h

BIN
app/OBJ/usart.crf


+ 5 - 3
app/SYSTEM/includes/gateway_message.h

@@ -17,6 +17,7 @@ typedef struct _NODE_WRITE_MODBUS_COMMAND
 	uint8_t bigLittleFormat;
 	uint16_t registerAddress;	// 寄存器地址
 	uint8_t write_command_flag; // 是否成功写入的标志
+	struct _NODE_WRITE_MODBUS_COMMAND *nextParams;
 } NODE_WRITE_MODBUS_COMMAND;
 // 节点所存储的modbus读命令
 typedef struct _NODE_READ_MODBUS_COMMAND
@@ -31,6 +32,7 @@ typedef struct _NODE_READ_MODBUS_COMMAND
 	uint8_t value[4];          //读取到的数据值
 	uint16_t registerByteNum;
 	uint8_t decimalPoint;
+	struct _NODE_READ_MODBUS_COMMAND *nextParams;
 } NODE_READ_MODBUS_COMMAND;
 // 节点所存储都DLT645读指令
 typedef struct _NODE_READ_DLT645_COMMAND
@@ -40,6 +42,7 @@ typedef struct _NODE_READ_DLT645_COMMAND
 	uint32_t Identification; // 645数据标识
 	uint8_t data[9];	   // 读到的数据
 	uint8_t rxLen;		   // 从机应答值的长度
+	struct _NODE_READ_DLT645_COMMAND *nextParams;
 } NODE_READ_DLT645_COMMAND;
 
 typedef struct _PARAMS_PROTOCOL_COMMAND
@@ -47,7 +50,6 @@ typedef struct _PARAMS_PROTOCOL_COMMAND
 	NODE_READ_MODBUS_COMMAND   *node_read_modbus_command;
 	NODE_WRITE_MODBUS_COMMAND  *node_write_modbus_command;
 	NODE_READ_DLT645_COMMAND   *node_read_dlt645_command;
-	struct _PARAMS_PROTOCOL_COMMAND *nextParams;
 }PARAMS_PROTOCOL_COMMAND;
 
 // 节点包含的设备信息
@@ -61,8 +63,8 @@ typedef struct _DEVICE_PARAMS
 } DEVICE_PARAMS;
 
 typedef struct _NODE_PARAMS
-{
-	uint8_t node_address[10];
+{                    
+	uint8_t node_address[3];
 	// 外设的串口工作属性仅只有一个
 	uint32_t baudrate;	 // 波特率
 	uint8_t dataBits;	 // 数据位

+ 7 - 0
app/SYSTEM/includes/node_data_acquisition.h

@@ -0,0 +1,7 @@
+#ifndef _NODE_DATA_ACQUISITION_H
+#define _NODE_DATA_ACQUISITION_H
+#include "mmodbus.h"
+#include "dlt645.h"
+#include "dlt645_port.h"
+void data_acquisition(void);
+#endif

+ 4 - 2
app/SYSTEM/includes/node_message.h

@@ -19,7 +19,8 @@ typedef struct _NODE_DLT645_PARAMS
     uint32_t dataType645;           //645数据标识
     uint8_t deviceType645[6];       //645地址
     uint8_t datalength;
-    uint8_t value[9];             
+    uint8_t value[10];
+    uint8_t rxLen;             
 }NODE_DLT645_PARAMS;
 typedef struct _NODE_MODBUS_READ
 {
@@ -31,7 +32,8 @@ typedef struct _NODE_MODBUS_READ
    uint8_t precision;
    uint8_t bigLittleFormat;
    uint8_t flag;                     //此属性读取是否成功
-   uint8_t callback[4];              //对应读取到的数据存储于此           
+   uint8_t callback[4];              //对应读取到的数据存储于此
+   uint8_t rxLen;           
 }NODE_MODBUS_READ;
 typedef struct _NODE_MODBUS_WRITE
 {

+ 2 - 2
app/SYSTEM/includes/protocol.h

@@ -7,6 +7,6 @@
 #define	DLT645_07 2
 #define	DLT645_97 1
 
-
-
+int masterSendNodeString(uint8_t nodeIndex, uint8_t *string, uint16_t *size);
+uint8_t SlaveProtocolAnalysis(uint8_t *buff, uint16_t len);
 #endif

+ 91 - 75
app/SYSTEM/source/gateway_message.c

@@ -26,60 +26,64 @@ void addSensorListParams(char *paramString, DEVICE_PARAMS *device);
  */
 void addGatewayParams(char *gatewayString)
 {
-		
+
     parseStringField(gatewayString, "\"commandTopic\":\"", (char *)&gateway_config_params.commandTopic);
     parseStringField(gatewayString, "\"messageTopic\":\"", (char *)&gateway_config_params.messageTopic);
     parseStringField(gatewayString, "\"deviceId\":\"", (char *)&gateway_config_params.deviceId);
     parseStringField(gatewayString, "\"host\":\"", (char *)&gateway_config_params.host);
     gateway_config_params.port = parseIntField(gatewayString, "\"port\":");
-	  gateway_config_params.node_params=NULL;
+    gateway_config_params.node_params = NULL;
     gateway_config_params.pollTime = parseIntField(gatewayString, "\"pollTime\":");
     uint8_t nodeIndex = 1;
-    char nodeStart[6];
-		char nodeEnd[6];
-		char *nodeString=mymalloc(SRAMEX,5*1024);
+    char nodeStart[7];
+    char nodeEnd[7];
+    char *nodeString = mymalloc(SRAMEX, 8 * 1024);
     while (1)
     {
-			sprintf(nodeStart,"node_%d",nodeIndex);
-			sprintf(nodeEnd,"node_%d",nodeIndex+1);
-			if(extract_substring(gatewayString,nodeStart,nodeEnd,nodeString))
-			{
-				addNode(nodeString);
-				nodeIndex++;
-			}
-			else
-			{
-				break;
-			}
+        sprintf(nodeStart, "node_%d", nodeIndex);
+        sprintf(nodeEnd, "node_%d", nodeIndex + 1);
+        if (extract_substring(gatewayString, nodeStart, nodeEnd, nodeString))
+        {
+            addNode(nodeString);
+            nodeIndex++;
+        }
+        else
+        {
+            break;
+        }
     }
-		myfree(SRAMEX,nodeString);
-		GATEWAY_PARAMS *get=get_gateway_config_params();
-		GATEWAY_PARAMS *set=get_gateway_config_params();
-		
+    myfree(SRAMEX, nodeString);
 }
 
 /**
  * @brief  解析输入的字符串节点信息,并将此节点信息挂载在网关结构体的节点下面
  * @param  char *nodestring
  * @retval 无
-		注:node内包含的设备名称device_1在别的节点下也可能包含,所以在解析节点时要先将数据截取出来让匹配不会越界到别的节点
+        注:node内包含的设备名称device_1在别的节点下也可能包含,所以在解析节点时要先将数据截取出来让匹配不会越界到别的节点
  */
 
 void addNode(char *nodestring)
 {
     // 新增一个节点的设备并解析最外层的节点属性
     char *deviceString = (char *)nodestring; // 用于移位解析device设备信息
-		NODE_PARAMS *newNode=mymalloc(SRAMIN,sizeof(NODE_PARAMS));
+    NODE_PARAMS *newNode = malloc(sizeof(NODE_PARAMS));
     newNode->device_params = NULL; // 先将其设备挂载为NULL
     newNode->nextNode = NULL;      // 下一个设备的挂载为NULL
-    parseStringField(nodestring, "\"nodeId\":\"", (char *)&newNode->node_address);
+	  char nodeIdString[5];
+    parseStringField(nodestring, "\"nodeId\":\"", (char *)&nodeIdString);
+    for (int j = 0; j < 2; j++)
+    {
+      uint8_t byte;
+      sscanf((const char *)&nodeIdString[j * 2], "%2hhx", &byte);
+      newNode->node_address[j]=byte;
+    }
     newNode->RFFrequency = parseIntField(nodestring, "\"RFFrequency\":");
     newNode->SignalBw = parseIntField(nodestring, "\"SignalBw\":");
     newNode->SpreadingFactor = parseIntField(nodestring, "\"SpreadingFactor\":");
     newNode->ErrorCoding = parseIntField(nodestring, "\"ErrorCoding\":");
 
     uint8_t deviceIndex = 1;
-		char *device=mymalloc(SRAMIN,20);
+    char *device = mymalloc(SRAMIN, 20);
     while (1)
     {
         sprintf(device, "\"device_%d\":", deviceIndex);
@@ -96,7 +100,7 @@ void addNode(char *nodestring)
         }
         /* code */
     }
-    myfree(SRAMIN,device);
+    myfree(SRAMIN, device);
 
     // 添加节点到网关链表中
     if (gateway_config_params.node_params == NULL)
@@ -120,35 +124,34 @@ void addNode(char *nodestring)
  */
 void addDevice(char *deviceString, NODE_PARAMS *node)
 {
-		char *paramString=(char *)deviceString;                                          //属性指针
+    char *paramString = (char *)deviceString; // 属性指针
     // 创建新设备页
     DEVICE_PARAMS *newDevicePage = (DEVICE_PARAMS *)malloc(sizeof(DEVICE_PARAMS));
     newDevicePage->nextDevice = NULL;
     parseStringField(deviceString, "\"deviceId\":\"", (char *)&newDevicePage->deviceID);
     newDevicePage->protocol = parseIntField(deviceString, "\"protocol\":");
-		newDevicePage->params = malloc(sizeof(PARAMS_PROTOCOL_COMMAND));
-		
-  	paramString=strstr(paramString,"\"sensorList\":[");                             //找到该节点的轮询上发属性
-	  while(1)                                                                           //此处数据是以数组形式存储所以解析方法和上面不一样
-		{
-			addSensorListParams(paramString,newDevicePage);                                //解析一个属性并挂载该属性于该属性下
-			paramString=strstr(paramString,"}");                                           //移动到下一条属性
-			paramString++;
-			if(paramString[0]==']')
-			{
-				paramString=(char *)deviceString;                                              //复原指针位置
-				break;                                                                         //找到了结束符,跳出循环
-			}
-		}                                 
-		//解析下发的mqtt存储信息下发控制指令
-		if(newDevicePage->protocol==MODBUS)
-		{
-			paramString=strstr(paramString,"\"commandList\":[");
-			while(1)
-			{
-				
-			}
-		}
+    newDevicePage->params = (PARAMS_PROTOCOL_COMMAND *)malloc(sizeof(DEVICE_PARAMS));
+
+    paramString = strstr(paramString, "\"sensorList\":["); // 找到该节点的轮询上发属性
+    while (1)                                              // 此处数据是以数组形式存储所以解析方法和上面不一样
+    {
+        addSensorListParams(paramString, newDevicePage); // 解析一个属性并挂载该属性于该属性下
+        paramString = strstr(paramString, "}");          // 移动到下一条属性
+        paramString++;
+        if (paramString[0] == ']')
+        {
+            paramString = (char *)deviceString; // 复原指针位置
+            break;                              // 找到了结束符,跳出循环
+        }
+    }
+    // 解析下发的mqtt存储信息下发控制指令
+//    if (newDevicePage->protocol == MODBUS)
+//    {
+//        paramString = strstr(paramString, "\"commandList\":[");
+//        while (1)
+//        {
+//        }
+//    }
     // 添加设备页到链表末尾
     if (node->device_params == NULL)
     {
@@ -171,8 +174,6 @@ void addDevice(char *deviceString, NODE_PARAMS *node)
  */
 void addSensorListParams(char *paramString, DEVICE_PARAMS *device)
 {
-    
-
     switch (device->protocol)
     {
     case DLT645_97:
@@ -180,22 +181,32 @@ void addSensorListParams(char *paramString, DEVICE_PARAMS *device)
         NODE_READ_DLT645_COMMAND *read_dlt645_command = malloc(sizeof(NODE_READ_DLT645_COMMAND));
         read_dlt645_command->Identification = parseIntField(paramString, "\"identifier645\":");
         parseStringField(paramString, "\"identifier\":\"", (char *)&read_dlt645_command->keyword);
+        char *string = mymalloc(SRAMIN, 13);
+        parseStringField(paramString, "\"deviceID645\":\"", string);
+        for (int j = 0; j < 6; j++)
+        {
+          uint8_t byte;
+          sscanf((const char *)&string[j * 2], "%2hhx", &byte);
+          read_dlt645_command->deviceID645[j]=byte;
+        }
+        myfree(SRAMIN, string);
         if (device->params->node_read_dlt645_command == NULL)
         {
-            device->params->node_read_dlt645_command= read_dlt645_command;
+            device->params->node_read_dlt645_command = read_dlt645_command;
         }
         else
         {
-            PARAMS_PROTOCOL_COMMAND *current= device->params;
-            while (current->nextParams->node_read_modbus_command!= NULL)
+            NODE_READ_DLT645_COMMAND *current = device->params->node_read_dlt645_command;
+            while (current->nextParams != NULL)
             {
                 current = current->nextParams;
             }
-            current->nextParams->node_read_dlt645_command = read_dlt645_command;
+            current->nextParams = read_dlt645_command;
         }
         break;
     case MODBUS:
         NODE_READ_MODBUS_COMMAND *read_modbus_command = malloc(sizeof(NODE_READ_MODBUS_COMMAND));
+				parseStringField(paramString,"\"identifier\":\"",read_modbus_command->keyword);
         read_modbus_command->bigLittleFormat = parseIntField(paramString, "\"bigLittleFormat\":");
         read_modbus_command->dataType = parseIntField(paramString, "\"dataType\":");
         read_modbus_command->decimalPoint = parseIntField(paramString, "\"precise\":");
@@ -203,24 +214,23 @@ void addSensorListParams(char *paramString, DEVICE_PARAMS *device)
         read_modbus_command->slaveAddress = parseIntField(paramString, "\"slaveAddress\":");
         read_modbus_command->registerAddress = parseIntField(paramString, "\"registerAddress\":");
         read_modbus_command->registerByteNum = parseIntField(paramString, "\"registerByteNum\":");
-        if (device->params->node_read_dlt645_command == NULL)
+        if (device->params->node_read_modbus_command == NULL)
         {
-            device->params->node_read_dlt645_command= read_dlt645_command;
+            device->params->node_read_modbus_command = read_modbus_command;
         }
         else
         {
-            PARAMS_PROTOCOL_COMMAND *current= device->params;
-            while (current->nextParams!= NULL)
+            NODE_READ_MODBUS_COMMAND *current = device->params->node_read_modbus_command;
+            while (current->nextParams != NULL)
             {
                 current = current->nextParams;
             }
-            current->nextParams->node_read_dlt645_command = read_dlt645_command;
+            current->nextParams = read_modbus_command;
         }
         break;
     default:
         break;
     }
-		
 }
 /**
  * @brief  解析输入字符串的paramString数据,将数据保存到至该设备结构体下,此处解析commandList
@@ -229,7 +239,7 @@ void addSensorListParams(char *paramString, DEVICE_PARAMS *device)
  */
 void addCommandListParams(char *paramString, DEVICE_PARAMS *device)
 {
-	
+    NODE_READ_MODBUS_COMMAND *write_modbus_command = malloc(sizeof(NODE_READ_MODBUS_COMMAND));
 }
 // 提取int数据
 int parseIntField(const char *data, const char *field)
@@ -266,33 +276,39 @@ void processStringJson(uint8_t *data)
     strstr(ptr, node_index); // 将指针指向第一个节点
     while (*ptr == NULL)
     {
+
     }
     free(node_index);
 }
 /**
  * @brief  从输入的input_string中寻找开始到结束位置的字符串数据,并将数据截取出来,传给result;
  * @param  input_string输入字符串,start_token字符串起始位置,end_token字符串结束位置,result截取出的字符串
-* @retval 0:没有被截取到的字符串。1:有被截取到的字符串。
+ * @retval 0:没有被截取到的字符串。1:有被截取到的字符串。
  */
-int extract_substring(const char *input_string, const char *start_token, const char *end_token, char *result) {
+int extract_substring(const char *input_string, const char *start_token, const char *end_token, char *result)
+{
     const char *start_ptr = strstr(input_string, start_token);
-    
-    if (start_ptr == NULL) {
-        return 0;  // 未找到起始标记
+
+    if (start_ptr == NULL)
+    {
+        return 0; // 未找到起始标记
     }
-    
-    start_ptr += strlen(start_token);  // 移动指针到起始标记之后
-    
+
+    start_ptr += strlen(start_token); // 移动指针到起始标记之后
+
     const char *end_ptr = strstr(start_ptr, end_token);
-    
-    if (end_ptr == NULL) {
+
+    if (end_ptr == NULL)
+    {
         // 如果未找到结束标记,将从起始标记开始的字符串一直复制到 \0 结束
         strcpy(result, start_ptr);
-    } else {
+    }
+    else
+    {
         // 找到结束标记,计算截取的长度并复制
         size_t length = end_ptr - start_ptr;
         strncpy(result, start_ptr, length);
-        result[length] = '\0';  // 添加字符串结束符
+        result[length] = '\0'; // 添加字符串结束符
     }
-		return 1;
+    return 1;
 }

+ 96 - 0
app/SYSTEM/source/node_data_acquisition.c

@@ -0,0 +1,96 @@
+#include "node_data_acquisition.h"
+#include "node_message.h"
+
+#include <math.h>
+void data_acquisition(void)
+{
+	NODE_DEVICE_PARAMS *node;
+	node = get_node_receive_params();
+	int i = 0;
+	while (i != 20)
+	{
+		if (node->params[i].protcol == MODBUS_READ)
+		{
+			uint16_t data[node->params[i].modbus_read->registerLength / 2]; // modbus¼Ä´æÆ÷³¤¶È
+			mmodbus_set16bitOrder(node->params[i].modbus_read->bigLittleFormat);
+			if (node->params[i].modbus_read->functionCode == 0x03)
+			{
+				bool success = mmodbus_readHoldingRegisters16i(node->params[i].modbus_read->slaveAddress,
+															   node->params[i].modbus_read->registerAddress,
+															   node->params[i].modbus_read->registerLength / 2,
+															   data);
+				if (success)
+				{
+					uint32_t value;
+					if (node->params[i].modbus_read->registerLength == 4)
+					{
+						value = (uint32_t)data[0] | data[1];
+						node->params[i].modbus_read->rxLen = 4;
+					}
+					else if (node->params[i].modbus_read->registerLength == 2)
+					{
+						value = data[0];
+						node->params[i].modbus_read->rxLen = 4;
+					}
+					if (node->params[i].modbus_read->precision == 0)
+					{
+						node->params[i].modbus_read->callback[0] = value;
+						node->params[i].modbus_read->callback[1] = value << 8;
+						node->params[i].modbus_read->callback[2] = value << 16;
+						node->params[i].modbus_read->callback[3] = value << 24;
+					}
+					else
+					{
+						float convertedValue = (float)value / pow(10, node->params[i].modbus_read->precision);
+						memcpy(node->params[i].modbus_read->callback, &convertedValue, 4);
+					}
+				}
+			}
+		}
+		else if (node->params[i].protcol == MODBUS_WRITE)
+		{
+		
+		}
+		else if (node->params[i].protcol == DLT645_07 || node->params[i].protcol == DLT645_97)
+		{
+			uint8_t read_buf[10];
+			
+			node->params[i].dlt645_params->rxLen = 0;
+			memset(read_buf, 0, 10);
+			memset(node->params[i].dlt645_params->value, 0, 10);
+
+			dlt645_set_addr(&dlt645, node->params[i].dlt645_params->deviceType645);
+			int8_t rs;
+			if (node->params[i].protcol == DLT645_07)
+			{
+				rs = dlt645_read_data(&dlt645, node->params[i].dlt645_params->dataType645, read_buf, DLT645_2007);
+			}
+			else if (node->params[i].protcol == DLT645_97)
+			{
+				rs = dlt645_read_data(&dlt645, node->params[i].dlt645_params->dataType645, read_buf, DLT645_1997);
+			}
+			if (rs != -1)
+			{
+				if (rs <= 4)
+				{
+					memcpy(node->params[i].modbus_read->callback, read_buf, 4);
+					node->params[i].dlt645_params->rxLen = rs;
+				}
+				else if (rs == 5)
+				{
+					memcpy(node->params[i].modbus_read->callback, read_buf, 5);
+					node->params[i].dlt645_params->rxLen = rs;
+				}
+				else if (rs > 5)
+				{
+					memcpy(node->params[i].modbus_read->callback, read_buf, 9);
+					node->params[i].dlt645_params->rxLen = rs;
+				}
+			}
+			else
+			{
+				node->params[i].dlt645_params->rxLen =0;
+			}
+		}
+	}
+}

+ 0 - 1
app/SYSTEM/source/node_message.c

@@ -7,7 +7,6 @@ static NODE_DEVICE_PARAMS node_receive_params = {0};
 
 NODE_DEVICE_PARAMS *get_node_receive_params()
 {
-
 	return &node_receive_params;
 }
 /*

+ 352 - 85
app/SYSTEM/source/protocol.c

@@ -15,7 +15,6 @@ static volatile int startDeviceNum = 0; // 
 static volatile int startParamsNum = 0; // 记录轮询读取设备属性的开始位置
 void insertHexData(uint8_t *String, const uint8_t *hexData, uint8_t insertIndex, uint8_t length);
 
-
 enum
 {
 	protocol_dlt645_97 = 0x08,
@@ -49,7 +48,7 @@ typedef enum
 *********************************************************************************************************
 *	函 数 名: void masterSendNodeString(uint8_t nodeIndex)Index下标从0开始
 *	功能说明: 负责取出网关第nodeIndex下的数据组成下发格式的数据,注:此处没有对node是否为NULL进行判断,请确保有该节点的信息
-*	形    参:
+*	形    参:nodeIndex第几个节点数据、string所总成的传递的字符串、size组成的字符串大小
 *	返 回 值: 0:该节点下已经没有属性需要在去读出了,1:该节点下还拥有其他属性等待读出。
 	注:其一次性只能传输20条属性的值若超出其范围还有数据则要多次组成发送
 	逻辑:每次调用该函数都会总成一条string,属性足够的时候会组成一条具有20个属性的指令,并记录结束的设备链表位置,属性链表位置,下次再调用从结束位置再开始,到最后可能就组成不了20个属性的string了,此时将开始的设备num,属性都归位
@@ -65,6 +64,7 @@ int masterSendNodeString(uint8_t nodeIndex, uint8_t *string, uint16_t *size)
 	int nowparamsNum = paramsNum;
 	GATEWAY_PARAMS *gateway;
 	gateway = get_gateway_config_params();
+
 	// 将当前的节点指针指到需要读取的节点位置
 	NODE_PARAMS *currentNode = gateway->node_params;
 	while (nodeIndex)
@@ -72,101 +72,149 @@ int masterSendNodeString(uint8_t nodeIndex, uint8_t *string, uint16_t *size)
 		currentNode = currentNode->nextNode;
 		nodeIndex--;
 	}
-	string = malloc(257);
-	memset(string, 0, 257);
+	memset(string, 0, 256); // 清除上一次数据
 	// 将首字符用nodeAdress
 	string[0] = currentNode->node_address[0];
 	string[1] = currentNode->node_address[1];
 	// 找到当前的设备结束位置
 	DEVICE_PARAMS *currentDevice = currentNode->device_params;
-	while (!nowDeviceNum)
+	while (nowDeviceNum)
 	{
 		currentDevice = currentDevice->nextDevice;
 		nowDeviceNum--;
 	}
-	PARAMS_PROTOCOL_COMMAND *currentParams = currentDevice->params;
+
 	// 移动位置到结束位置属性的下一位
-	while (!nowparamsNum)
-	{
-		currentParams = currentParams->nextParams;
-		nowparamsNum--;
-	}
-	if (currentParams == NULL)
+	NODE_READ_MODBUS_COMMAND *currentModbusParams = currentDevice->params->node_read_modbus_command;
+	NODE_READ_DLT645_COMMAND *currentDlt645Params = currentDevice->params->node_read_dlt645_command;
+	switch (currentDevice->protocol)
 	{
-		currentDevice = currentDevice->nextDevice;
-		// 判断当前还有没有设备没有读取了
-		if (currentDevice == NULL) // 且当前链表无后续设备了则跳出循环
+	case MODBUS:
+		while (nowparamsNum)
+		{
+			currentModbusParams = currentModbusParams->nextParams;
+			nowparamsNum--;
+		}
+		break;
+	case DLT645_07:
+	case DLT645_97:
+
+		while (nowparamsNum)
 		{
-			deviceNum = 0; // 将结束位置全部归0
-			paramsNum = 0;
-			return -1;
+			currentDlt645Params = currentDlt645Params->nextParams;
+			nowparamsNum--;
 		}
-		currentParams = currentDevice->params; // 有则更新当前指针位置
-		nowDeviceNum++;
-		nowparamsNum = 0;
+		break;
+	default:
+		break;
 	}
 
 	// 最多进行20次循环组成下发数据
 	int i = 0;
-	int len = strlen((char *)&string);
+	int len;
+	len = strlen(string);
 	do
 	{
 		switch (currentDevice->protocol)
 		{
 		case MODBUS_READ:
-			insertHexData(string, (uint8_t *)protocol_modbus_read, len, 1); // 插入modbus长度
+		{
+			uint8_t protocolHexData = protocol_modbus_read;
+			insertHexData(string, &protocolHexData, len, 1); // 插入modbus长度
 			len++;
-			insertHexData(string, &currentParams->node_read_modbus_command->functionCode, len, 1); // 插入读取功能码
+			insertHexData(string, &currentModbusParams->functionCode, len, 1); // 插入读取功能码
 			len++;
-			insertHexData(string, &currentParams->node_read_modbus_command->dataType, len, 1); // 插入读取的数据格式
+			insertHexData(string, &currentModbusParams->dataType, len, 1); // 插入读取的数据格式
 			len++;
-			insertHexData(string, &currentParams->node_read_modbus_command->slaveAddress, len, 1); // 插入modbus从站地址
+			insertHexData(string, &currentModbusParams->slaveAddress, len, 1); // 插入modbus从站地址
 			len++;
-			insertHexData(string, (uint8_t *)&currentParams->node_read_modbus_command->registerAddress, len, 2); // 插入modbus寄存器地址
+			insertHexData(string, (uint8_t *)&currentModbusParams->registerAddress, len, 2); // 插入modbus寄存器地址
 			len += 2;
-			insertHexData(string, &currentParams->node_read_modbus_command->decimalPoint, len, 1); // 插入小数点位数
+			insertHexData(string, &currentModbusParams->decimalPoint, len, 1); // 插入小数点位数
 			len++;
-			insertHexData(string, &currentParams->node_read_modbus_command->bigLittleFormat, len, 1); // 插入大小端
+			insertHexData(string, &currentModbusParams->bigLittleFormat, len, 1); // 插入大小端
 			len++;
+			// 属性读取完毕,移位到下一个属性
+			i++;
+			currentModbusParams = currentModbusParams->nextParams;
+			if (currentModbusParams == NULL)
+			{
+				currentDevice = currentDevice->nextDevice;
+				if (currentModbusParams == NULL)
+				{
+					deviceNum = 0; // 将结束位置全部归0
+					paramsNum = 0;
+					*size = len;
+					return 1;
+				}
+				currentModbusParams = currentDevice->params->node_read_modbus_command;
+				nowDeviceNum++;
+				nowparamsNum = 0;
+			}
 			break;
+		}
 		case DLT645_07:
-			insertHexData(string, (uint8_t *)protocol_dlt645_07, len, 1); // 插入dlt645_07数据长度
+		{
+			uint8_t protocolHexData = protocol_dlt645_07;
+			insertHexData(string, &protocolHexData, len, 1); // 插入dlt645_07数据长度
 			len++;
-			insertHexData(string, (uint8_t *)&currentParams->node_read_dlt645_command->deviceID645, len, 6); // 插入dlt645地址域
+			insertHexData(string, (uint8_t *)&currentDlt645Params->deviceID645, len, 6); // 插入dlt645地址域
 			len += 6;
-			insertHexData(string, (uint8_t *)&currentParams->node_read_dlt645_command->Identification, len, 4);
+			insertHexData(string, (uint8_t *)&currentDlt645Params->Identification, len, 4);
 			len += 4;
+			// 属性读取完毕,移位到下一个属性
+			i++;
+			currentDlt645Params = currentDlt645Params->nextParams;
+			if (currentDlt645Params == NULL)
+			{
+				currentDevice = currentDevice->nextDevice;
+				if (currentDevice == NULL)
+				{
+					deviceNum = 0; // 将结束位置全部归0
+					paramsNum = 0;
+					*size = len;
+					return 1;
+				}
+				currentDlt645Params = currentDevice->params->node_read_dlt645_command;
+				nowDeviceNum++;
+				nowparamsNum = 0;
+			}
 			break;
+		}
 		case DLT645_97:
-			insertHexData(string, (uint8_t *)protocol_dlt645_97, len, 1); // 插入dlt645_97数据长度
+		{
+			uint8_t protocolHexData = protocol_dlt645_97;
+			insertHexData(string, &protocolHexData, len, 1); // 插入dlt645_97数据长度
 			len++;
-			insertHexData(string, (uint8_t *)&currentParams->node_read_dlt645_command->deviceID645, len, 6); // 插入dlt645_97地址域
+			insertHexData(string, (uint8_t *)&currentDlt645Params->deviceID645, len, 6); // 插入dlt645_97地址域
 			len += 6;
-			insertHexData(string, (uint8_t *)&currentParams->node_read_dlt645_command->Identification, len, 2); // 插入dlt645_97数据标识
+			insertHexData(string, (uint8_t *)&currentDlt645Params->Identification, len, 2); // 插入dlt645_97数据标识
 			len += 2;
-		default:
-			break;
-		}
-		i++;
-		currentParams = currentParams->nextParams;
-		// 判断当前设备有没有属性可读了
-		if (currentParams == NULL)
-		{
-			currentDevice = currentDevice->nextDevice;
-			// 判断当前还有没有设备没有读取了
-			if (currentDevice == NULL) // 且当前链表无后续设备了则跳出循环
+			// 属性读取完毕,移位到下一个属性
+			i++;
+			currentDlt645Params = currentDlt645Params->nextParams;
+			if (currentDlt645Params == NULL)
 			{
-				deviceNum = 0; // 将结束位置全部归0
-				paramsNum = 0;
-				break;
+				currentDevice = currentDevice->nextDevice;
+				if (currentDlt645Params == NULL)
+				{
+					deviceNum = 0; // 将结束位置全部归0
+					paramsNum = 0;
+					*size = len;
+					return 1;
+				}
+				currentDlt645Params = currentDevice->params->node_read_dlt645_command; // 还有属性则更新位置
+				nowDeviceNum++;
+				nowparamsNum = 0;
 			}
-			currentParams = currentDevice->params; // 有则更新当前指针位置
-			nowDeviceNum++;
-			nowparamsNum = 0;
+			break;
+		}
+		default:
+			goto end_while;
 		}
 		nowparamsNum++;
-	} while (i == 20);
-
+	} while (i != 20);
+end_while:
 	// 更新结束的位置分为两种情况,一种还在当前设备的属性中轮询此时nowDeviceNum没有改变过,另外一种情况设备内的属性
 	if (nowDeviceNum == 0)
 	{
@@ -176,9 +224,10 @@ int masterSendNodeString(uint8_t nodeIndex, uint8_t *string, uint16_t *size)
 	else
 	{
 		deviceNum = startDeviceNum + nowDeviceNum;
-		paramsNum = nowparamsNum;
+		paramsNum = nowparamsNum - 1;
 	}
 	*size = len;
+	return 0;
 }
 /*
 *********************************************************************************************************
@@ -198,18 +247,18 @@ void insertHexData(uint8_t *String, const uint8_t *hexData, uint8_t insertIndex,
 *	函 数 名: uint8_t SlaveProtocolAnalysis(uint8_t *buff,uint16_t len)
 *	形    参:uint8_t *buff等待解析的字符串数据,
 *	返 回 值: 0:不是该节点的消息,数据没有进行任何处理。1:为该节点信息,接收到要进行的相应的切换工作
-	解析这段数据时要先判断是否为该节点的消息,stuct B *p=malloc(sizeof(struct B); 
+	解析这段数据时要先判断是否为该节点的消息,stuct B *p=malloc(sizeof(struct B);
 *********************************************************************************************************
 */
 #ifdef slave
-#define LocalAddress 0x1F1A
+#define LocalAddress 0x1F6E
 uint8_t SlaveProtocolAnalysis(uint8_t *buff, uint16_t len)
 {
 	NODE_DEVICE_PARAMS *node_receive_params;
 	node_receive_params = get_node_receive_params();
-	uint16_t slaveAdress = buff[0] << 8 || buff[1];
+	uint16_t slaveAdress = buff[0] << 8 | buff[1];
 	int protocol_location = 2; // 起始的协议所处位置
-	uint8_t i=0;
+	uint8_t i = 0;
 	while (1)
 	{
 		if (slaveAdress == LocalAddress) // 判断此消息是否为该节点的消息,如果不是则跳出
@@ -217,54 +266,272 @@ uint8_t SlaveProtocolAnalysis(uint8_t *buff, uint16_t len)
 			switch (buff[protocol_location]) // 读取接收到的数据属于什么协议
 			{
 			case protocol_modbus_read:
+				protocol_location++;
 				node_receive_params->params[i].protcol = MODBUS_READ;
-				node_receive_params->params[i].dlt645_params=NULL;
-				node_receive_params->params[i].modbus_read=malloc(sizeof(NODE_MODBUS_READ));
-				node_receive_params->params[i].modbus_write=NULL;
-				node_receive_params->params[i].modbus_read->functionCode=buff[protocol_location+1];                                        //读出functionCode
-				node_receive_params->params[i].modbus_read->dataType=buff[protocol_location+2];                                            //读出数据格式
-				node_receive_params->params[i].modbus_read->slaveAddress=buff[protocol_location+3];                                        //读出从站地址
-				node_receive_params->params[i].modbus_read->registerAddress=buff[protocol_location+5]<<8||buff[protocol_location+4];      //读出寄存器地址
-				node_receive_params->params[i].modbus_read->registerLength=buff[protocol_location+7]<<8||buff[protocol_location+6];       //读出要读的寄存器长度
-				node_receive_params->params[i].modbus_read->precision=buff[protocol_location+8];                                           //读出小数点精度
-				node_receive_params->params[i].modbus_read->bigLittleFormat=buff[protocol_location+9];                                     //读出数据大小端格式
-				protocol_location += protocol_modbus_read; 
+				node_receive_params->params[i].dlt645_params = NULL;
+				node_receive_params->params[i].modbus_read = malloc(sizeof(NODE_MODBUS_READ));
+				node_receive_params->params[i].modbus_write = NULL;
+				node_receive_params->params[i].modbus_read->functionCode = buff[protocol_location + 1];										   // 读出functionCode
+				node_receive_params->params[i].modbus_read->dataType = buff[protocol_location + 2];											   // 读出数据格式
+				node_receive_params->params[i].modbus_read->slaveAddress = buff[protocol_location + 3];										   // 读出从站地址
+				node_receive_params->params[i].modbus_read->registerAddress = buff[protocol_location + 5] << 8 || buff[protocol_location + 4]; // 读出寄存器地址
+				node_receive_params->params[i].modbus_read->registerLength = buff[protocol_location + 7] << 8 || buff[protocol_location + 6];  // 读出要读的寄存器长度
+				node_receive_params->params[i].modbus_read->precision = buff[protocol_location + 8];										   // 读出小数点精度
+				node_receive_params->params[i].modbus_read->bigLittleFormat = buff[protocol_location + 9];									   // 读出数据大小端格式
+				protocol_location += protocol_modbus_read;
 				break;
 			case protocol_dlt645_07:
+				protocol_location++;
 				node_receive_params->params[i].protcol = DLT645_07;
-				node_receive_params->params[i].dlt645_params=malloc(sizeof(NODE_DLT645_PARAMS));;
-				node_receive_params->params[i].modbus_read=NULL;
-				node_receive_params->params[i].modbus_write=NULL;
-				memcpy(node_receive_params->params[i].dlt645_params->deviceType645,buff+protocol_location,6);
-				memcpy((uint8_t *)&node_receive_params->params[i].dlt645_params->dataType645,buff+protocol_location+6,4);
+				node_receive_params->params[i].dlt645_params = malloc(sizeof(NODE_DLT645_PARAMS));
+				node_receive_params->params[i].modbus_read = NULL;
+				node_receive_params->params[i].modbus_write = NULL;
+				memcpy(node_receive_params->params[i].dlt645_params->deviceType645, buff + protocol_location, 6);
+				memcpy((uint8_t *)&node_receive_params->params[i].dlt645_params->dataType645, buff + protocol_location + 6, 4);
 				protocol_location += protocol_dlt645_07;
 				break;
 			case protocol_dlt645_97:
+				protocol_location++;
 				node_receive_params->params[i].protcol = DLT645_97;
-				node_receive_params->params[i].dlt645_params=malloc(sizeof(NODE_DLT645_PARAMS));;
-				node_receive_params->params[i].modbus_read=NULL;
-				node_receive_params->params[i].modbus_write=NULL;
-				memcpy(node_receive_params->params[i].dlt645_params->deviceType645,buff+protocol_location,6);
-				memcpy((uint8_t *)&node_receive_params->params[i].dlt645_params->dataType645,buff+protocol_location+6,2);
+				node_receive_params->params[i].dlt645_params = malloc(sizeof(NODE_DLT645_PARAMS));
+				node_receive_params->params[i].modbus_read = NULL;
+				node_receive_params->params[i].modbus_write = NULL;
+				memcpy(node_receive_params->params[i].dlt645_params->deviceType645, buff + protocol_location, 6);
+				memcpy((uint8_t *)&node_receive_params->params[i].dlt645_params->dataType645, buff + protocol_location + 6, 2);
 				protocol_location += protocol_dlt645_97;
 				break;
-			case 0:
+			default: // 解析没满20个属性
 				return 1;
-			default:
-				return 0;
 			}
 		}
 		else
 		{
-			node_receive_params->Index=i;//记录本次有多少数据传输过来了
+			node_receive_params->Index = i; // 记录本次有多少数据传输过来了
 			return 0;
 		}
 		i++;
-		if(protocol_location>len)             //判断数据解析是否越界了,越界则跳转出
+		if (protocol_location > len) // 判断数据解析是否越界了,越界则跳转出
 		{
 			return 1;
 		}
 	}
 }
+/*
+*********************************************************************************************************
+*	函 数 名: nodeSendReadValue(uint8_t *string)
+*	形    参:组成node回传数据,传输数据为0x
+*	返 回 值: 无
+*********************************************************************************************************
+*/
+void nodeSendReadValue(uint8_t *string)
+{
+	NODE_DEVICE_PARAMS *node_receive_params;
+	node_receive_params = get_node_receive_params();
+	int i = 0;
+	int len = 0;
+	while (i == 20)
+	{
+		switch (node_receive_params->params[i].protcol)
+		{
+		case DLT645_07:
+		case DLT645_97:
+			if (node_receive_params->params[i].dlt645_params->rxLen <= 4)
+			{
+				string[len] = 0x04;
+				len++;
+				memcpy(string[len], node_receive_params->params[i].dlt645_params->value, 4);
+				len += 4;
+			}
+			else if (node_receive_params->params[i].dlt645_params->rxLen == 5)
+			{
+				string[len] = 0x05;
+				len++;
+				memcpy(string[len], node_receive_params->params[i].dlt645_params->value, 5);
+				len += 5;
+			}
+			else if (node_receive_params->params[i].dlt645_params->rxLen == 9)
+			{
+				string[len] = 0x09;
+				len++;
+				memcpy(string[len], node_receive_params->params[i].dlt645_params->value, 9);
+				len += 9;
+			}
+			else
+			{
+				string[len] = 0x00;
+				len++;
+			}
+			break;
+		case MODBUS:
+			if (node_receive_params->params[i].modbus_read->rxLen == 4)
+			{
+				string[len] = 0x04;
+				len++;
+				memcpy(string[len], node_receive_params->params[i].dlt645_params->value, 4);
+				len += 4;
+			}
+			else
+			{
+				string[len] = 0x00;
+				len++;
+			}
+			break;
+		default:
+			return;
+		}
+		i++;
+	}
+}
+/*
+*********************************************************************************************************
+*	函 数 名: GatewayProtocolAnalysis(uint8_t *string)
+*	形    参:将节点应答信息依次解析为json数据
+*	返 回 值: 0未读到json数据,1读到了json数据
+*********************************************************************************************************
+*/
+int GatewayProtocolAnalysis(uint8_t *string, uint16_t len)
+{
+	char json[1024];
+	sprintf(json, "{\"data\":[");
+	// 读取上次循环最终停止位置
+	int nowDeviceNum = deviceNum;
+	int nowparamsNum = paramsNum - 1;
+	GATEWAY_PARAMS *gateway;
+	gateway = get_gateway_config_params();
+	uint16_t nodeId = string[0] << 8 | string[1];
+	// 将当前的节点指针指到需要读取的节点位置
+	NODE_PARAMS *currentNode = gateway->node_params;
+	uint16_t currentNodeId = currentNode->node_address[0] << 8 | currentNode->node_address[1];
+	while (currentNodeId != nodeId)
+	{
+		currentNode = currentNode->nextNode;
+		if (currentNode == NULL)
+		{
+			// 没有找到对应该节点信息不是给本机
+			return;
+		}
+		currentNodeId = currentNode->node_address[0] << 8 | currentNode->node_address[1];
+	}
+	// 找到该节点进行轮询
+	DEVICE_PARAMS *currentDevice = currentNode->device_params;
+	while (nowDeviceNum)
+	{
+		currentDevice = currentDevice->nextDevice;
+		nowDeviceNum--;
+	}
+	// 移动位置到开始属性
+	NODE_READ_MODBUS_COMMAND *currentModbusParams = currentDevice->params->node_read_modbus_command;
+	NODE_READ_DLT645_COMMAND *currentDlt645Params = currentDevice->params->node_read_dlt645_command;
+	switch (currentDevice->protocol)
+	{
+	case MODBUS:
+		while (nowparamsNum)
+		{
+			currentModbusParams = currentModbusParams->nextParams;
+			nowparamsNum--;
+		}
+		break;
+	case DLT645_07:
+	case DLT645_97:
 
+		while (nowparamsNum)
+		{
+			currentDlt645Params = currentDlt645Params->nextParams;
+			nowparamsNum--;
+		}
+		break;
+	default:
+		break;
+	}
+	int index = 2; // 子节点地址
+	while (index >= len)
+	{
+		switch (currentDevice->protocol)
+		{
+		case MODBUS:
+			// modbus协议
+			switch (*(string + index))
+			{
+			case 0x00:
+				// 没有数据
+				index++;
+				break;
+			case 0x04:
+				if (currentModbusParams->dataType == 0x01 && currentModbusParams->decimalPoint == 0x00) // modbus底层存储的数据类型 1INT 2float
+				{
+					uint32_t value;
+					value = string[index + 1] + string[index + 2] >> 8 + string[index + 3] >> 16 + string[index + 4] >> 24;
+					sprintf(json + strlen(json), "{\"deviceId\":\"%s\",\"%s\":%d},", currentDevice->deviceID, currentModbusParams->keyword, value);
+				}
+				else // 如果是int且有小数点,或者底层就是float按照float来计算
+				{
+					float value;
+					memcmp(&value, string[index + 1], 4);
+					sprintf(json + strlen(json), "{\"deviceId\":\"%s\",\"%s\":%d},", currentDevice->deviceID, value);
+				}
+				index += 4;
+				break;
+			default:
+				break;
+			}
+			currentModbusParams = currentModbusParams->nextParams;
+			if (currentModbusParams == NULL)
+			{
+				currentDevice = currentDevice->nextDevice;
+				currentModbusParams = currentDevice->params;
+			}
+			break;
+
+		case DLT645_07:
+		case DLT645_97:
+			switch (*(string + index))
+			{
+			case 0x00:
+			index++;
+			break;
+			case 0x04:
+			{
+				float value;
+				memcmp(&value, string[index + 1], 4);
+				sprintf(json + strlen(json), "{\"deviceId\":\"%s\",\"%s\":%d},", currentDevice->deviceID, currentDlt645Params->keyword, value);
+				index += 4;
+			}
+			break;
+			case 0x05:
+			{
+				//%02依次为年月日时分
+				sprintf(json + strlen(json), "{\"deviceId\":\"%s\",\"%s\": \"%02X%02X%02X%02X%02X\"},",
+						currentDevice->deviceID, currentDlt645Params->keyword, string[index + 5], string[index + 4], string[index + 3], string[index + 2], string[index + 1]);
+				index += 5;
+			}
+			break;
+			case 9:
+			{
+				float value;
+				memcpy(&value, string[index + 1], 4);
+				sprintf(json + strlen(json), "{\"deviceId\":\"%s\",\"%s\":\"%02X%02X%02X%02X%02X%.2f\"},",
+						currentDevice->deviceID, currentDlt645Params->keyword, string[index + 9], string[index + 8], string[index + 7], string[index + 6], string[index + 5], value);
+				index+=9;
+			}
+			break;
+			default:
+				break;
+			}
+			currentDlt645Params = currentDlt645Params->nextParams;
+			if (currentDlt645Params == NULL)
+			{
+				currentDevice = currentDevice->nextDevice;
+				currentDlt645Params = currentDevice->params;
+			}
+			break;
+		default:
+			break;
+		}
+	}
+	if(strlen(string)<10)
+	{
+		return 0;
+	}
+	sprintf(json+strlen(json)-1,"]}");
+}
 #endif

+ 109 - 63
app/SYSTEM/source/task.c

@@ -6,14 +6,15 @@
 #include "malloc.h"
 #include "sx1276.h"
 #include "radio.h"
-
-
-void master_task(char *string);
+#include "protocol.h"
+#include "usart.h"
+#include "node_data_acquisition.h"
+void master_task(uint8_t *string,uint16_t stringlength);
 void slave_task();
 
 tRadioDriver *Radio = NULL;
 
-uint16_t BufferSize ;
+uint16_t BufferSize;
 uint8_t Buffer[256];
 
 uint32_t rx_num = 0;
@@ -33,29 +34,78 @@ void data_task(void *pdata)
 {
 	OS_CPU_SR cpu_sr;
 	pdata = pdata;
-	char *lora_config_json =mymalloc(SRAMEX,9*1024);
-	read_file("lora_json.txt",lora_config_json);
-	addGatewayParams(lora_config_json);
-	free(lora_config_json);
+	//初始化lora
+	Radio = RadioDriverInit();
+	Radio->Init();
+	
+	dlt645_init(100);
+	mmodbus_init(100);
+	
 	
-//	Radio = RadioDriverInit();
-//	Radio->Init();
-//#ifdef MASTER
-//	Radio->SetTxPacket(PingMsg, strlen((const char *)PingMsg));
-//	printf("MASTER");
-//#else
-//	Radio->StartRx();
-//	printf("SLAVE");
+	
+	char *lora_config_json = mymalloc(SRAMEX, 9 * 1024);
+	read_file("lora_json.txt", lora_config_json);
+	addGatewayParams(lora_config_json);
+	myfree(SRAMEX, lora_config_json);
+#ifdef MASTER
+	GATEWAY_PARAMS *get;
+	get= get_gateway_config_params();
+	int nodeIndex=0;
+	NODE_PARAMS *current_node=get->node_params;
+	uint8_t string[256];
+	uint16_t bufferLength;
+ 	while (current_node!=NULL)
+	{
+		while(!masterSendNodeString(nodeIndex,string,&bufferLength))       //轮询读出
+		{
+			//测试代码不经过转发直接测试
+			SlaveProtocolAnalysis(string,BufferSize);
+			data_acquisition();
+ 			/*
+			master_task(string,bufferLength);                             //进入发送流程
+			int i=0;
+			*/
+		}
+		if(current_node->nextNode!=NULL)
+		{
+			current_node=current_node->nextNode;
+			nodeIndex++;
+		}
+		else
+		{
+			nodeIndex=0;
+			current_node=get->node_params;
+		}
+	}
+#else
+	Radio->StartRx();
+	while (1)
+	{
+		slave_task();
+		OSTimeDlyHMSM(0, 0, 0, 200);
+	}
+#endif
+	while (1)
+	{
+	}
+	//	Radio = RadioDriverInit();
+	//	Radio->Init();
+	// #ifdef MASTER
+	//	Radio->SetTxPacket(PingMsg, strlen((const char *)PingMsg));
+	//	printf("MASTER");
+	// #else
+	//	Radio->StartRx();
+	//	printf("SLAVE");
 
-//#endif
-//	while (1)
-//	{
-//#ifdef MASTER
-//		master_task("a");
-//#else
-//		slave_task();
-//#endif
-//	}
+	// #endif
+	//	while (1)
+	//	{
+	// #ifdef MASTER
+	//		master_task("a");
+	// #else
+	//		slave_task();
+	// #endif
+	//	}
 }
 
 /*
@@ -67,38 +117,36 @@ void data_task(void *pdata)
 *********************************************************************************************************
 */
 
-volatile uint32_t startTime;             //记录开始的时间
-void master_task(char *string)
+volatile uint32_t startTime; // 记录开始的时间且开始时间到结束时间超过一定范围则判定为超时状态,这时对其进行再次发送
+void master_task(uint8_t *string,uint16_t stringlength)
 {
-	
-	switch (Radio->Process())
+	int retry_count=0;                                    //发送计数,暂时不开启失败重发机制
+	while (1)
 	{
+		switch (Radio->Process())
+		{
 		case RF_RX_DONE:
 			Radio->GetRxPacket(Buffer, &BufferSize);
-			printf("Master_Task:RX_____%s,Rx_num:%d\n", Buffer, rx_num);
-			rx_num++;
-			if (strncmp((const char *)Buffer, (const char *)PongMsg, strlen((const char *)PongMsg)) == 0)
-			{
-				Radio->SetTxPacket(PingMsg, strlen((const char *)PingMsg));
-				startTime=OSTimeGet();
-				delay_ms(1000);
-			}
 			break;
 		case RF_TX_DONE:
-			startTime=OSTimeGet();
+			startTime = OSTimeGet();
 			Radio->StartRx();
 		case RF_BUSY:
 		case RF_IDLE:
-			if(OSTimeGet()-startTime>10000)                                          //每次发送信号时记录上一次发送的时间如果超过一段时间没有响应则进行下一次发送
-				{
-					Radio->SetTxPacket(PingMsg, strlen((const char *)PingMsg));
-					startTime=OSTimeGet();                                     
-					delay_ms(1000);
-				}
+			if(retry_count==0)   //第一次发送
+			{
+				Radio->SetTxPacket(string, stringlength);
+				retry_count++;
+			}
+			if (OSTimeGet() - startTime > 10000) // 每次发送信号时记录上一次发送的时间如果超过一段时间没有响应则进行下一次发送
+			{
+				return;
+			}
 		default:
-			OSTimeDlyHMSM(0, 0, 0, 500);
+			OSTimeDlyHMSM(0, 0, 0, 200);
 			break;
 		}
+	}
 }
 /*
 *********************************************************************************************************
@@ -108,28 +156,26 @@ void master_task(char *string)
 *	返 回 值: 无
 *********************************************************************************************************
 */
-volatile bool rxflag=false;
+volatile bool rxflag = false;
 void slave_task()
 {
 	switch (Radio->Process())
 	{
-		case RF_RX_DONE:
-			Radio->GetRxPacket(Buffer, &BufferSize);
-			printf("Slave_Task:RX_____%s,Rx_num:%d\n", Buffer, rx_num);
-			rx_num++;
-			if (strncmp((const char *)Buffer, (const char *)PingMsg, strlen((const char *)PingMsg)) == 0)
-			{
-				Radio->SetTxPacket(PongMsg, strlen((const char *)PongMsg));
-				delay_ms(1000);
-			}
-			break;
-		case RF_TX_DONE:
-			Radio->StartRx();
-			break;
-		case RF_IDLE:
-		case RF_BUSY:
-		default:
-		OSTimeDlyHMSM(0, 0, 0, 500);
+	case RF_RX_DONE:
+		Radio->GetRxPacket(Buffer, &BufferSize);
+	  if(SlaveProtocolAnalysis(Buffer,BufferSize))           //判断是否为该节点信息
+		{
+			data_acquisition();
+		}
+		Radio->StartRx();
+		break;
+	case RF_TX_DONE:
+		Radio->StartRx();
+		break;
+	case RF_IDLE:
+	case RF_BUSY:
+	default:
+		OSTimeDlyHMSM(0, 0, 0, 200);
 	}
 }
 void processString(char *string)

Datei-Diff unterdrückt, da er zu groß ist
+ 4 - 5
app/USER/main.c


+ 46 - 0
app/dlt/inc/dlt645.h

@@ -0,0 +1,46 @@
+#ifndef _DLT645_H
+#define _DLT645_H
+
+#include <stdint.h>
+#include "ucos_ii.h"
+#define DL645_MAX_READ_LEN 200 //读数据的最大数据长度
+#define DL645_MAX_WRITE_LEN 50 //写数据的最大数据长度
+
+// port setting
+#define DLT645_DEFAULT_RESPONSE_TIMEOUT 500 //500ms
+#define MAX_DEVICE_NAME_LEN 10              //最大设备名长度
+
+#define dlt_malloc malloc
+#define dlt_free free
+#define gettick( )                           ( OSTimeGet() )
+//DLT645 环境结构体
+typedef struct dlt645
+{
+    uint8_t addr[6];    //从机地址
+    uint8_t debug;      //调试标志
+    int (*write)(struct dlt645 *ctx, uint8_t *buf, uint16_t len);     //底层写函数
+    int (*read) (struct dlt645 *ctx, uint8_t *msg, uint16_t len);     //底层读函数
+    void *port_data;                                            //移植层拓展接口
+} dlt645_t;
+
+typedef enum
+{
+    DLT645_2007 = 1,
+    DLT645_1997
+} dlt645_protocal;
+
+//设置从机地址
+extern void dlt645_set_addr(dlt645_t *ctx, uint8_t *addr);
+//设置调试开关
+extern int dlt645_set_debug(dlt645_t *ctx, int flag);
+//数据采集
+extern int dlt645_read_data(dlt645_t *ctx, uint32_t code, uint8_t *read_data, dlt645_protocal protocal);
+//十进制转BCD码(32位)
+extern uint32_t dec_to_bcd(uint32_t val);
+//字符串转BCD形式
+extern int str_to_bcd(char *str, uint8_t *bcd_store_address, uint16_t bcd_len);
+
+extern void dlt645_init(uint32_t timeout);
+extern void dlt_callback(void);
+
+#endif

+ 11 - 0
app/dlt/inc/dlt645_1997.h

@@ -0,0 +1,11 @@
+#ifndef __DLT645_1997_H
+#define __DLT645_1997_H
+
+#include "dlt645.h"
+
+//基于 DLT645 2007 协议读取数据
+int dlt645_1997_read_data(dlt645_t *ctx, uint32_t code, uint8_t *read_data);
+//基于 DLT645 2007 协议校验数据
+int dlt645_1997_recv_check(uint8_t *msg, int len, uint8_t *addr, uint32_t code);
+
+#endif /* __DLT645_1997_H */

+ 53 - 0
app/dlt/inc/dlt645_1997_private.h

@@ -0,0 +1,53 @@
+#ifndef __DLT645_1997_PRIVATE_H
+#define __DLT645_1997_PRIVATE_H
+
+#define DL645_1997_RD_CMD_LEN 14 //读取数据命令的长度
+
+//功能码
+#define C_1997_CODE_BRC 0x08    //广播校时
+#define C_1997_CODE_RD 0x01     //读数据
+#define C_1997_CODE_RDM 0x02    //读后续数据
+#define C_1997_CODE_WR 0x04     //写数据
+#define C_1997_CODE_WRA 0x0A    //写设备地址
+#define C_1997_CODE_BR 0x0C     //更改通信速率
+#define C_1997_CODE_PD 0x0F     //修改密码
+#define C_1997_CODE_XL 0x10     //最大需量清零
+#define C_1997_CEODE_RR 0x03    //重读数据
+
+
+#define ERR_1997_RATE 0x40  //费率数超
+#define ERR_1997_DAY 0x20   //日时段数超
+#define ERR_1997_YEAR 0x10  //年时区数超
+#define ERR_1997_BR 0x08    //通信速率不能更改
+#define ERR_1997_PD 0x04    //密码错误/未授权
+#define ERR_1997_DATA 0x02  //无请求数据
+#define ERR_1997_OTHER 0x01 //其他错误
+
+// DLT645 1997 数据标识
+#define DIC_B611 0xB611 //A相电压
+#define DIC_B612 0xB612 //B相电压
+#define DIC_B613 0xB613 //C相电压
+#define DIC_B691 0xB691 //AB线电压
+#define DIC_B692 0xB692 //BC线电压
+#define DIC_B693 0xB693 //CA线电压
+
+#define DIC_B621 0xB621 //A相电流
+#define DIC_B622 0xB622 //B相电流
+#define DIC_B623 0xB623 //C相电流
+
+#define DIC_B630 0xB630 //总有功功率
+#define DIC_B631 0xB631 //A相有功功率
+#define DIC_B632 0xB632 //B相有功功率
+#define DIC_B633 0xB633 //C相有功功率
+
+#define DIC_B640 0xB640 //总无功功率
+#define DIC_B641 0xB641 //A相无功功率
+#define DIC_B642 0xB642 //B相无功功率
+#define DIC_B643 0xB643 //C相无功功率
+
+#define DIC_B660 0xB660 //总视在功率
+#define DIC_B661 0xB661 //A相视在功率
+#define DIC_B662 0xB662 //B相视在功率
+#define DIC_B663 0xB663 //C相视在功率
+
+#endif /* __DLT645_1997_PRIVATE_H */

+ 11 - 0
app/dlt/inc/dlt645_2007.h

@@ -0,0 +1,11 @@
+#ifndef __DLT645_2007_H
+#define __DLT645_2007_H
+
+#include "dlt645.h"
+
+//基于 DLT645 2007 协议读取数据
+int dlt645_2007_read_data(dlt645_t *ctx, uint32_t code, uint8_t *read_data);
+//基于 DLT645 2007 协议校验数据
+int dlt645_2007_recv_check(uint8_t *msg, int len, uint8_t *addr, uint32_t code);
+
+#endif /* __DLT645_2007_H */

+ 128 - 0
app/dlt/inc/dlt645_2007_private.h

@@ -0,0 +1,128 @@
+#ifndef __DLT645_2007_PRIVATE_H
+#define __DLT645_2007_PRIVATE_H
+
+
+#define DL645_2007_RD_CMD_LEN 16 //读取数据命令的长度
+
+//功能码
+#define C_2007_CODE_BRC 0x08    //广播校时
+#define C_2007_CODE_RD 0X11     //读数据
+#define C_2007_CODE_RDM 0x12    //读后续数据
+#define C_2007_CODE_RDA 0x13    //读通信地址
+#define C_2007_CODE_WR 0x14     //写数据
+#define C_2007_CODE_WRA 0x15    //写通信地址
+#define C_2007_CODE_DJ 0x16     //冻结
+#define C_2007_CODE_BR 0x17     //更改通信速率
+#define C_2007_CODE_PD 0x18     //修改密码
+#define C_2007_CODE_XL 0x19     //最大需量清零
+#define C_2007_CODE_DB 0x1a     //电表清零
+#define C_2007_CODE_MSG 0x1b    //事件清零
+
+
+#define ERR_2007_RATE 0x40  //费率数超
+#define ERR_2007_DAY 0x20   //日时段数超
+#define ERR_2007_YEAR 0x10  //年时区数超
+#define ERR_2007_BR 0x08    //通信速率不能更改
+#define ERR_2007_PD 0x04    //密码错误/未授权
+#define ERR_2007_DATA 0x02  //无请求数据
+#define ERR_2007_OTHER 0x01 //其他错误
+
+
+
+
+#define DIC_0 0x0         //组合有功总电能
+#define DIC_100 0x100     //组合有功费率1电能
+#define DIC_200 0x200     //组合有功费率2电能
+#define DIC_300 0x300     //组合有功费率3电能
+#define DIC_400 0x400     //组合有功费率4电能
+#define DIC_10000 0x10000 //正向有功总电能
+#define DIC_10001 0x10001 //(上1结算日 即上月)正向有功总电能
+#define DIC_10100 0x10100 //正向有功费率1电能
+#define DIC_10002 0x10002 //(上2结算日 即上月)正向有功总电能
+
+#define DIC_10200 0x10200 //正向有功费率2电能
+#define DIC_10300 0x10300 //正向有功费率3电能
+#define DIC_10400 0x10400 //正向有功费率4电能
+#define DIC_20000 0x20000 //反向有功总电能
+#define DIC_20100 0x20100 //反向有功费率1电能
+#define DIC_20200 0x20200 //反向有功费率2电能
+#define DIC_20300 0x20300 //反向有功费率3电能
+#define DIC_20400 0x20400 //反向有功费率4电能
+#define DIC_30000 0x30000 //组合无功1总电能
+#define DIC_40000 0x40000 //组合无功2总电能
+#define DIC_50000 0x50000 //第一象限无功电能
+#define DIC_60000 0x60000 //第二象限无功电能
+#define DIC_70000 0x70000 //第三象限无功电能
+#define DIC_80000 0x80000 //第四象限无功电能
+#define DIC_90000 0x90000 //正向视在总电能
+
+#define DIC_1010000 0X01010000//正向正向有功总最大需量及发生时间
+#define DIC_1010100 0x01010100//正向有功费率 1 最大需量及发生时间
+
+
+#define DIC_1020000 0x01020000//反向有功总最大需量及发生时间
+#define DIC_1010001 0x01010001//正向有功总最大需量及发生时间
+#define DIC_1020001 0X01020001//反向有功总最大需量及发生时间
+
+#define DIC_201FF00 0x201FF00	//电压数据块
+#define DIC_2010100 0x2010100 //A相电压
+#define DIC_2010200 0x2010200 //B相电压
+#define DIC_2010300 0x2010300 //C相电压
+#define DIC_2020100 0x2020100 //A相电流
+#define DIC_2020200 0x2020200 //B相电流
+#define DIC_2020300 0x2020300 //C相电流
+#define DIC_2030000 0x2030000 //总有功功率
+#define DIC_2030100 0x2030100 //A相有功功率
+#define DIC_2030200 0x2030200 //B相有功功率
+#define DIC_2030300 0x2030300 //C相有功功率
+
+#define DIC_2040000 0x2040000 //总无功功率
+#define DIC_2040100 0x2040100 //A相无功功率
+#define DIC_2040200 0x2040200 //B相无功功率
+#define DIC_2040300 0x2040300 //C相无功功率
+#define DIC_2050000 0x2050000 //总视在功率
+#define DIC_2050100 0x2050100 //A相视在功率
+#define DIC_2050200 0x2050200 //B相视在功率
+#define DIC_2050300 0x2050300 //C相视在功率
+#define DIC_2060000 0x2060000 //总功率因素
+#define DIC_2060100 0x2060100 //A相功率因素
+#define DIC_2060200 0x2060200 //B相功率因素
+#define DIC_2060300 0x2060300 //C相功率因素
+#define DIC_20C0100 0x20C0100 //AB线电压
+#define DIC_20C0200 0x20C0200 //BC线电压
+#define DIC_20C0300 0x20C0300 //CA线电压
+#define DIC_2800002 0x2800002 //频率
+#define DIC_2800007 0x2800007//表内温度
+#define DIC_4000101 0x4000101 //年月日星期
+#define DIC_4000102 0x4000102 //时分秒
+#define DIC_5060001 0x5060001 //上一次日冻结时间
+#define DIC_5060101 0x5060101 //上一次日冻结正向有功电能
+
+
+
+#define DIC_30C0000 0x30C0000 //过流总次数,总时间
+#define DIC_30C0101 0x30C0101 //上一次A相过流记录
+
+#define DIC_3300100 0x3300100 //电表清零总次数
+#define DIC_3300101 0x3300101 //电表清零记录
+
+#define DIC_4000501 0x4000501
+#define DIC_4000502 0x4000502
+#define DIC_4000503 0x4000503
+#define DIC_4000504 0x4000504
+#define DIC_4000505 0x4000505
+#define DIC_4000506 0x4000506
+#define DIC_4000507 0x4000507
+
+#define DIC_4000403 0x4000403 //资产管理编码
+
+#define DIC_4000701 0x4000701 //信号强度
+
+#define DIC_4000702 0x4000702 //版本号
+
+
+
+#define DIC_7000001 0x7000001 //master_api_key
+#define DIC_7000002 0x7000002 //device_id
+
+#endif /* __DLT645_2007_PRIVATE_H */

+ 56 - 0
app/dlt/inc/dlt645_private.h

@@ -0,0 +1,56 @@
+#ifndef _DLT645_PRIVATE_H
+#define _DLT645_PRIVATE_H
+
+#include "dlt645.h"
+
+#ifdef DLT645_DEBUG
+#define DLT645_LOG kprintf
+#else
+#define DLT645_LOG(...)
+#endif
+
+#define DL645_START_CODE 0x68
+#define DL645_STOP_CODE 0x16
+
+#define DL645_PREMBLE_ENABLE 0 //前导码使能标记
+#define DL645_PREMBLE 0xFE     //前导码
+
+#define DL645_ADDR_LEN 6    //设备地址长度
+#define DL645_CONTROL_POS 8 //控制码位置
+#define DL645_LEN_POS 9     //长度位置
+#define DL645_DATA_POS 10   //数据位置
+#define DL645_WR_LEN 50     //写入数据命令的长度
+#define DL645_RESP_LEN 60   //读取数据命令的长度
+
+#define C_TD_MASK 0x80      //主从标志位
+#define C_TD_POS 7          //主从标志位比特位
+#define C_TD_MASTER 0       //主站发出的命令帧
+#define C_TD_SLAVE 1        //从站发出的应答帧
+
+#define C_ACK_MASK 0x40     //从站是否正确应答标志位
+#define C_ACK_POS 6         //从站应答标志位比特位
+#define C_ACK_OK 0          //从站应答正确
+#define C_ACK_ERR 1         //从站应答错误
+
+#define C_FU_MASK 0x20      //是否有后续帧标志位
+#define C_FU_POS 5          //后续帧标志位比特位
+#define C_FU_NONE 0         //无后续帧
+#define C_FU_EXT 1          //有后续帧
+
+#define C_CODE_MASK 0x1F    //功能码标志位
+
+
+
+//645 公共校验
+extern int dlt645_common_check(uint8_t *msg, int len, uint8_t *addr);
+//645 和校验
+extern int _crc(uint8_t *msg, int len);
+//645 调用底层接口接收数据
+extern int dlt645_receive_msg(dlt645_t *ctx, uint8_t *msg, uint16_t len, uint32_t code, dlt645_protocal protocal);
+//645 调用底层接口发送
+extern int dlt645_send_msg(dlt645_t *ctx, uint8_t *msg, int len);
+//将接收到的dlt645数据包中的数据转化为整数
+extern int data_package_translate_to_int(uint8_t *read_data, uint16_t len);
+//根据数据格式将645协议读取的数据转换为真实数据并存储
+extern int dlt645_data_parse_by_format_to_float(uint8_t *read_data, uint16_t read_len, const char *data_format, uint8_t *store_address);
+#endif

+ 138 - 0
app/dlt/port/dlt645_port.c

@@ -0,0 +1,138 @@
+/*************************************************
+ Copyright (c) 2019
+ All rights reserved.
+ File name:     dlt645_port.c
+ Description:   DLT645 移植&使用例程文件
+ History:
+ 1. Version:
+	Date:       2019-09-19
+	Author:     wangjunjie
+	Modify:
+*************************************************/
+#include "dlt645.h"
+#include "stm32f2xx.h"
+#include "delay.h"
+#include "usart.h"
+#include "delay.h"
+#include "string.h"
+
+#define DLT_RXSIZE 200
+
+// DLT645采集使用的串口名
+#define DLT645_USART USART_485
+#define DLT645_CTRL_GPIO USART_485_DE_GPIO_PORT
+#define DLT645_CTRL_PIN USART_485_DE_PIN
+
+// DL/T 645硬件拓展结构体
+typedef struct
+{
+	uint8_t dlt645_Tx; // 用于串口接收的状态
+	uint32_t timeout;  //
+	uint8_t rxBuf[DLT_RXSIZE];
+	uint8_t done;
+	uint8_t index;
+} dlt645_port_t;
+
+static dlt645_port_t dlt645_port;
+
+// dlt645 环境结构体
+dlt645_t dlt645;
+
+void dlt_callback()
+{
+	OSIntEnter();
+	if(RESET!=USART_GetFlagStatus(DLT645_USART,USART_FLAG_RXNE))
+	{
+		if (dlt645_port.index < DLT_RXSIZE - 1)
+		{
+				dlt645_port.rxBuf[dlt645_port.index] = USART_ReceiveData(DLT645_USART);
+				dlt645_port.index++;
+			}
+		else
+		{
+			USART_ReceiveData(DLT645_USART);
+		}
+	}
+	if((dlt645_port.index > 0) && RESET != USART_GetFlagStatus(DLT645_USART, USART_FLAG_IDLE))
+	{
+		uint8_t temp;                            
+		temp=DLT645_USART->SR;             //先读sr再读DR才能清除idle中断
+		temp=DLT645_USART->DR;
+		dlt645_port.done = 1;
+	}
+	OSIntExit();
+}
+/**
+ * Name:    dlt645_hw_read
+ * Brief:   dlt645 硬件层接收数据
+ * Input:
+ *  @ctx:   645运行环境
+ *  @msg:   接收数据存放地址
+ *  @len:   数据最大接收长度
+ * Output:  读取数据的长度
+ */
+static int dlt645_hw_read(dlt645_t *ctx, uint8_t *msg, uint16_t len)
+{
+	int dataLength = 0;
+	int startTime = gettick();
+	while (1)
+	{
+		if (gettick() - startTime > dlt645_port.timeout * 1000)
+			return 0;
+		if (dlt645_port.done == 1)
+		{
+			dataLength = dlt645_port.index;
+			memcpy(msg, &(dlt645_port.rxBuf[4]), len-4);
+			dataLength = dlt645_port.index-4;
+			return dataLength;
+		}
+	}
+}
+
+/**
+ * Name:    dlt645_hw_write
+ * Brief:   dlt645 硬件层发送数据
+ * Input:
+ *  @ctx:   645运行环境
+ *  @buf:   待发送数据
+ *  @len:   发送长度
+ * Output:  实际发送的字节数,错误返回-1
+ */
+static int dlt645_hw_write(dlt645_t *ctx, uint8_t *buf, uint16_t len)
+{
+	memset(dlt645_port.rxBuf, 0, DLT_RXSIZE);
+	delay_ms(10);
+	OSIntEnter();
+	GPIO_WriteBit(DLT645_CTRL_GPIO,DLT645_CTRL_PIN,1);
+	for (uint16_t i = 0; i < len; i++)
+	{
+		USART_SendData(USART3,buf[i]);
+		while (USART_GetFlagStatus(DLT645_USART, USART_FLAG_TXE) == RESET);	
+	}
+	OSIntExit();
+	GPIO_WriteBit(DLT645_CTRL_GPIO,DLT645_CTRL_PIN,0);
+	dlt645_port.index = 0;
+	dlt645_port.done = 0;
+	return len;
+}
+
+
+
+
+
+
+void dlt645_init(uint32_t timeout)
+{
+	GPIO_WriteBit(DLT645_CTRL_GPIO,DLT645_CTRL_PIN,1);
+	dlt645_port.timeout = timeout;
+	dlt645_port.dlt645_Tx = 0;
+	dlt645_port.index = 0;
+}
+
+// 645结构体注册
+static dlt645_t dlt645 = {
+	{0},
+	0,
+	dlt645_hw_write,
+	dlt645_hw_read,
+	(void *)&dlt645_port};

+ 10 - 0
app/dlt/port/dlt645_port.h

@@ -0,0 +1,10 @@
+#ifndef __DLT645_PORT_H
+#define __DLT645_PORT_H
+#include "dlt645.h"
+
+//对外提供环境声明
+extern dlt645_t dlt645;
+//645采集硬件层初始化
+int dlt645_port_init(void);
+
+#endif

+ 131 - 0
app/dlt/src/dlt645.c

@@ -0,0 +1,131 @@
+/*************************************************
+ Copyright (c) 2019
+ All rights reserved.
+ File name:     dlt645.c
+ Description:   
+ History:
+ 1. Version:    
+    Date:       2019-09-20
+    Author:     wangjunjie
+    Modify:     
+*************************************************/
+#include "dlt645_private.h"
+#include "dlt645_1997.h"
+#include "dlt645_2007.h"
+#include "string.h"
+
+/**
+ * Name:    dlt645_receive_msg
+ * Brief:   645协议调用底层接收数据
+ * Input:
+ *  @ctx:       645环境句柄
+ *  @msg:       数据包存储地址
+ *  @len:       最大接收长度
+ *  @addr:      从站地址
+ *  @code:      数据标识   
+ *  @protocal:  645协议类型  
+ * Output:  接收成功:0,接收失败:-1
+ */
+int dlt645_receive_msg(dlt645_t *ctx, uint8_t *msg, uint16_t len, uint32_t code, dlt645_protocal protocal)
+{
+    int msg_len = ctx->read(ctx, msg, len);
+
+    if (protocal == DLT645_1997)
+    {
+        return dlt645_1997_recv_check(msg, msg_len, ctx->addr, code);
+    }
+    else if (protocal == DLT645_2007)
+    {
+        return dlt645_2007_recv_check(msg, msg_len, ctx->addr, code);
+    }
+    else
+    {
+        return -1;
+    }
+}
+
+/**
+ * Name:    dlt645_send_msg
+ * Brief:   645协议调用底层发送数据
+ * Input:
+ *  @ctx:       645环境句柄
+ *  @msg:       发送的数据首地址
+ *  @len:       发送长度 
+ * Output:  实际发送的字节数,错误返回-1
+ */
+int dlt645_send_msg(dlt645_t *ctx, uint8_t *msg, int len)
+{
+    msg[0] = DL645_START_CODE;
+    msg[DL645_ADDR_LEN + 1] = DL645_START_CODE;
+    msg[len - 1] = DL645_STOP_CODE;
+    msg[len - 2] = _crc(msg, len - 2);
+
+    return ctx->write(ctx, msg, len);
+}
+
+/**
+ * Name:    dlt645_set_addr
+ * Brief:   设置从站地址
+ * Input:
+ *  @ctx:       645环境句柄
+ *  @addr:      从站地址
+ * Output:  None
+ */
+void dlt645_set_addr(dlt645_t *ctx, uint8_t *addr)
+{
+    uint8_t addr_temp[6];
+    memset(addr_temp, 0, 6);
+
+    //转换字节序
+    for (int i = 0; i < 6; i++)
+    {
+        addr_temp[5 - i] = addr[i];
+    }
+    memcpy(ctx->addr, addr_temp, DL645_ADDR_LEN);
+}
+
+/**
+ * Name:    dlt645_set_debug
+ * Brief:   设置调试模式
+ * Input:
+ *  @ctx:       645环境句柄
+ *  @flag:      调试标志
+ * Output:  None
+ */
+int dlt645_set_debug(dlt645_t *ctx, int flag)
+{
+    ctx->debug = flag;
+    return 0;
+}
+
+/**
+ * Name:    dlt645_read_data(用户调用)
+ * Brief:   根据645协议类型读取数据
+ * Input:
+ *  @ctx:           645环境句柄
+ *  @addr:          从站地址
+ *  @code:          标识符
+ *  @read_data:     读取数据存储地址
+ *  @protocal:      协议类型
+ * Output:  成功返回数据长度,失败返回-1
+ */
+int dlt645_read_data(dlt645_t *ctx,
+                     uint32_t code,
+                     uint8_t *read_data,
+                     dlt645_protocal protocal)
+{
+    int rs = -1;
+    switch (protocal)
+    {
+    case DLT645_1997:
+        rs = dlt645_1997_read_data(ctx, code, read_data);
+        break;
+    case DLT645_2007:
+        rs = dlt645_2007_read_data(ctx, code, read_data);
+        break;
+    default:
+        DLT645_LOG("unrecognized protocal!\r\n");
+        break;
+    }
+    return rs;
+}

+ 141 - 0
app/dlt/src/dlt645_1997.c

@@ -0,0 +1,141 @@
+/*************************************************
+ Copyright (c) 2019
+ All rights reserved.
+ File name:     dlt645_1997.c
+ Description:   DLT645 1997版本
+ History:
+ 1. Version:    
+    Date:       2019-09-19
+    Author:     wangjunjie
+    Modify:     
+*************************************************/
+#include "dlt645_private.h"
+#include "dlt645_1997_private.h"
+#include "string.h"
+
+/**
+ * Name:    dlt645_1997_recv_check
+ * Brief:   DLT645-1997 数据校验
+ * Input:
+ *  @msg:   校验数据包
+ *  @len:   数据包长度
+ *  @addr:  从站地址
+ *  @code:  操作码
+ * Output:  校验成功:0 ,失败 -1
+ */
+int dlt645_1997_recv_check(uint8_t *msg, int len, uint8_t* addr, uint32_t code)
+{
+    if (dlt645_common_check(msg, len, addr) < 0)
+    {
+        return -1;
+    }
+    if (msg[DL645_CONTROL_POS] == 0x84)
+        return 0;
+
+    uint8_t *code_buf = (uint8_t *)&code;
+
+    for (uint8_t i = 0; i < 2; i++)
+    {
+        code_buf[i] += 0x33;
+    }
+
+    if (*((uint16_t *)(msg + DL645_DATA_POS)) != code)
+        return -1;
+
+    return 0;
+}
+
+/**
+ * Name:    dlt645_1997_parsing_data
+ * Brief:   DLT645-1997 数据包解析
+ * Input:
+ *  @code:          标识符
+ *  @read_data:     数据包指针
+ *  @len:           数据包长度
+ *  @real_val:      数据存储地址
+ * Output:  数据包长度
+ */
+static int dlt645_1997_parsing_data(uint32_t code, uint8_t *read_data, uint16_t len, uint8_t *real_val)
+{
+    switch (code)
+    {
+    case DIC_B611:
+    case DIC_B612:
+    case DIC_B613:
+    case DIC_B691:
+    case DIC_B692:
+    case DIC_B693:
+    {
+        dlt645_data_parse_by_format_to_float(read_data, 2, "XXX", real_val);
+        break;
+    }
+    case DIC_B621:
+    case DIC_B622:
+    case DIC_B623:
+    {
+        dlt645_data_parse_by_format_to_float(read_data, 2, "XX.XX", real_val);
+        break;
+    }
+    case DIC_B630:
+    case DIC_B631:
+    case DIC_B632:
+    case DIC_B633:
+    {
+        dlt645_data_parse_by_format_to_float(read_data, 3, "XX.XXXX", real_val);
+        break;
+    }
+    default:
+    {
+        for (uint16_t i = 0; i < len; i++)
+        {
+            real_val[i] = ((read_data[i] - 0x33) & 0x0f) + ((read_data[i] - 0x33) >> 4) * 10;
+        }
+        break;
+    }
+    }
+    return len;
+}
+
+/**
+ * Name:    dlt645_1997_read_data
+ * Brief:   DLT645-1997 数据读取
+ * Input:
+ *  @ctx:           645句柄
+ *  @addr:          从站地址
+ *  @code:          数据标识
+ *  @read_data:     数据存储地址
+ * Output:  成功返回数据长度,失败返回-1
+ */
+int dlt645_1997_read_data(dlt645_t *ctx,
+                          uint32_t code,
+                          uint8_t *read_data)
+{
+    uint8_t send_buf[DL645_1997_RD_CMD_LEN];
+    uint8_t read_buf[DL645_RESP_LEN];
+
+    memset(read_buf, 0, sizeof(read_buf));
+    memset(send_buf, 0, sizeof(send_buf));
+
+    memcpy(send_buf + 1, ctx->addr, DL645_ADDR_LEN);
+    send_buf[DL645_CONTROL_POS] = C_1997_CODE_RD;
+    send_buf[DL645_LEN_POS] = 2;
+
+    uint8_t send_code[2] = {0};
+    send_code[0] = (code & 0xff) + 0x33;
+    send_code[1] = ((code >> 8) & 0xff) + 0x33;
+    memcpy(send_buf + DL645_DATA_POS, send_code, 2);
+
+    if (dlt645_send_msg(ctx, send_buf, DL645_1997_RD_CMD_LEN) < 0)
+    {
+        DLT645_LOG("send data error!\n");
+        return -1;
+    }
+
+    if (dlt645_receive_msg(ctx, read_buf, DL645_RESP_LEN, code, DLT645_1997) < 0)
+    {
+        DLT645_LOG("receive msg error!\n");
+        return -1;
+    }
+
+    return dlt645_1997_parsing_data(code, read_buf + DL645_DATA_POS + 2, read_buf[DL645_LEN_POS] - 2, read_data);
+}

+ 279 - 0
app/dlt/src/dlt645_2007.c

@@ -0,0 +1,279 @@
+/*************************************************
+ Copyright (c) 2019
+ All rights reserved.
+ File name:     dlt645_2007.c
+ Description:   DLT645 2007版本
+ History:
+ 1. Version:
+    Date:       2019-09-19
+    Author:     wangjunjie
+    Modify:
+*************************************************/
+#include "dlt645_private.h"
+#include "dlt645_2007_private.h"
+#include "string.h"
+
+/**
+ * Name:    dlt645_2007_recv_check
+ * Brief:   DLT645-2007 数据校验
+ * Input:
+ *  @msg:   校验数据包
+ *  @len:   数据包长度
+ *  @addr:  从站地址
+ *  @code:  操作码
+ * Output:  None
+ */
+int dlt645_2007_recv_check(uint8_t *msg, int len, uint8_t *addr, uint32_t code)
+{
+    if (dlt645_common_check(msg, len, addr) < 0)
+    {
+        return -1;
+    }
+    if (msg[DL645_CONTROL_POS] == 0x94)
+        return 0;
+
+    uint8_t *code_buf = (uint8_t *)&code;
+
+    for (uint8_t i = 0; i < 4; i++)
+    {
+        code_buf[i] += 0x33;
+    }
+
+    if (*((uint32_t *)(msg + DL645_DATA_POS)) != code)
+        return -1;
+
+    return 0;
+}
+
+/**
+ * Name:    dlt645_2007_parsing_data
+ * Brief:   DLT645-2007 数据包解析
+ * Input:
+ *  @code:          标识符
+ *  @read_data:     数据包指针
+ *  @len:           数据包长度
+ *  @real_val:      数据存储地址
+ * Output:  数据包长度
+ */
+int dlt645_2007_parsing_data(uint32_t code, uint8_t *read_data, uint16_t len, uint8_t *real_val)
+{
+    switch (code)
+    {
+    case DIC_0:
+    case DIC_100:
+    case DIC_200: 
+    case DIC_300:
+    case DIC_400:
+    case DIC_10000:
+    case DIC_10100:
+		case DIC_10001:
+		case DIC_10002:
+    case DIC_10200:
+    case DIC_10300:
+    case DIC_10400:
+    case DIC_20000:
+    case DIC_20100:
+    case DIC_20200:
+    case DIC_20300:
+    case DIC_20400:
+    case DIC_30000:
+    case DIC_40000:
+    case DIC_50000:
+    case DIC_60000:
+    case DIC_70000:
+    case DIC_80000:
+    case DIC_90000:
+    {
+        dlt645_data_parse_by_format_to_float(read_data, 4, "XXXXXX.XX", real_val);
+        break;
+    }
+    // 包含日期信息其原长度为8但其包含五个字节的日期时间长度所以read_data前三个字节为为数据信息,后五个字节为日期时间
+    case DIC_1010000:
+    case DIC_1020000:
+    case DIC_1010001:
+    case DIC_1020001:
+    {
+        dlt645_data_parse_by_format_to_float(read_data, 3, "XX.XXXX", real_val);
+        // 将剩余的 5 个字节拼接到 real_val 后面
+        for (int i = 0; i < 5; i++)
+        {
+            real_val[4 + i] = read_data[3 + i]-0x33;
+        }
+        break;
+    }
+		case DIC_201FF00:
+    case DIC_2010100:
+    case DIC_2010200:
+    case DIC_2010300:
+    case DIC_20C0100:
+    case DIC_20C0200:
+    case DIC_20C0300:
+    {
+        dlt645_data_parse_by_format_to_float(read_data, 2, "XXX.X", real_val);
+        break;
+    }
+    case DIC_2020100:
+    case DIC_2020200:
+    case DIC_2020300:
+    {
+        dlt645_data_parse_by_format_to_float(read_data, 3, "XXX.XXX", real_val);
+        break;
+    }
+    case DIC_2030000:
+    case DIC_2030100:
+    case DIC_2030200:
+    case DIC_2030300:
+    case DIC_2040000:
+    case DIC_2040100:
+    case DIC_2040200:
+    case DIC_2040300:
+    case DIC_2050000:
+    case DIC_2050100:
+    case DIC_2050200:
+    case DIC_2050300:
+    {
+        dlt645_data_parse_by_format_to_float(read_data, 3, "XX.XXXX", real_val);
+        break;
+    }
+    case DIC_2060000:
+    case DIC_2060100:
+    case DIC_2060200:
+    case DIC_2060300:
+    {
+        dlt645_data_parse_by_format_to_float(read_data, 2, "X.XXX", real_val);
+        break;
+    }
+    case DIC_2800002:
+    {
+        dlt645_data_parse_by_format_to_float(read_data, 2, "XX.XX", real_val);
+        break;
+    }
+		case DIC_5060101:
+		//case DIC_5040001:
+		{
+			for (uint16_t i = 0; i < len; i++)
+        {
+            real_val[i] = ((read_data[i] - 0x33) & 0x0f) + ((read_data[i] - 0x33) >> 4) * 10;
+        }
+			break;
+		}
+    case DIC_4000403:
+    case DIC_7000001:
+    case DIC_7000002:
+        for (uint16_t i = 0; i < len; i++)
+        {
+            real_val[i] = read_data[i] - 0x33;
+        }
+        break;
+    default:
+        for (uint16_t i = 0; i < len; i++)
+        {
+            real_val[i] = ((read_data[i] - 0x33) & 0x0f) + ((read_data[i] - 0x33) >> 4) * 10;
+        }
+        break;
+    }
+    return len;
+}
+
+/**
+ * Name:    dlt645_2007_read_data
+ * Brief:   DLT645-2007 数据读取
+ * Input:
+ *  @ctx:           645句柄
+ *  @addr:          从站地址
+ *  @code:          数据标识
+ *  @read_data:     数据存储地址
+ * Output:  None
+ */
+int dlt645_2007_read_data(dlt645_t *ctx,
+                          uint32_t code,
+                          uint8_t *read_data)
+{
+    uint8_t send_buf[DL645_2007_RD_CMD_LEN];
+    uint8_t read_buf[DL645_RESP_LEN];
+
+    memset(read_buf, 0, sizeof(read_buf));
+    memset(send_buf, 0, sizeof(send_buf));
+
+    memcpy(send_buf + 1, ctx->addr, DL645_ADDR_LEN);
+
+    send_buf[DL645_CONTROL_POS] = C_2007_CODE_RD;
+    send_buf[DL645_LEN_POS] = 4;
+
+    uint8_t send_code[4] = {0};
+    send_code[0] = (code & 0xff) + 0x33;
+    send_code[1] = ((code >> 8) & 0xff) + 0x33;
+    send_code[2] = ((code >> 16) & 0xff) + 0x33;
+    send_code[3] = ((code >> 24) & 0xff) + 0x33;
+
+    memcpy(send_buf + DL645_DATA_POS, send_code, 4);
+    if (dlt645_send_msg(ctx, send_buf, DL645_2007_RD_CMD_LEN) < 0)
+    {
+        DLT645_LOG("send data error!\n");
+        return -1;
+    }
+
+    if (dlt645_receive_msg(ctx, read_buf, DL645_RESP_LEN, code, DLT645_2007) < 0)
+    {
+        DLT645_LOG("receive msg error!\n");
+        return -1;
+    }
+
+    return dlt645_2007_parsing_data(code, read_buf + DL645_DATA_POS + 4, read_buf[DL645_LEN_POS] - 4, read_data);
+    // #define DL645_DATA_POS 10   //数据位置
+}
+
+/**
+ * Name:    dlt645_write_data
+ * Brief:   DLT645-2007 数据写入
+ * Input:
+ *  @ctx:           645句柄
+ *  @addr:          从站地址
+ *  @code:          数据标识
+ *  @write_data:    写入数据的指针
+ *  @write_len:     写入长度
+ * Output:  None
+ */
+int dlt645_write_data(dlt645_t *ctx,
+                      uint32_t addr,
+                      uint32_t code,
+                      uint8_t *write_data,
+                      uint8_t write_len)
+{
+    uint8_t send_buf[DL645_WR_LEN];
+    uint8_t read_buf[DL645_RESP_LEN];
+
+    memset(read_buf, 0, sizeof(read_buf));
+    memset(send_buf, 0, sizeof(send_buf));
+
+    memcpy(send_buf + 1, ctx->addr, DL645_ADDR_LEN);
+
+    send_buf[DL645_CONTROL_POS] = C_2007_CODE_WR;
+    send_buf[DL645_LEN_POS] = 12 + write_len;
+
+    uint8_t send_code[4] = {0};
+    send_code[0] = (code & 0xff) + 0x33;
+    send_code[1] = ((code >> 8) & 0xff) + 0x33;
+    send_code[2] = ((code >> 16) & 0xff) + 0x33;
+    send_code[3] = ((code >> 24) & 0xff) + 0x33;
+
+    for (uint8_t i = 0; i < write_len; i++)
+    {
+        write_data[i] += 0x33;
+    }
+
+    memcpy(send_buf + DL645_DATA_POS, send_code, 4);
+    memcpy(send_buf + DL645_DATA_POS + 12, write_data, write_len);
+    if (dlt645_send_msg(ctx, send_buf, 24 + write_len) < 0)
+    {
+        DLT645_LOG("send data error!\n");
+        return -1;
+    }
+
+    if (dlt645_receive_msg(ctx, read_buf, DL645_RESP_LEN, code, DLT645_2007) < 0)
+    {
+        DLT645_LOG("receive msg error!\n");
+        return -1;
+    }
+    return 0;
+}

+ 289 - 0
app/dlt/src/dlt645_data.c

@@ -0,0 +1,289 @@
+/*************************************************
+ Copyright (c) 2019
+ All rights reserved.
+ File name:     dlt645_data.c
+ Description:   DLT645 数据处理源文件
+ History:
+ 1. Version:    
+    Date:       2019-09-20
+    Author:     wangjunjie
+    Modify:     
+*************************************************/
+#include "dlt645_private.h"
+#include <string.h>
+#include <math.h>
+
+//字节位置枚举类型
+typedef enum
+{
+    BYTE_RESET = 0,   //重置
+    BYTE_LOW_ADDRESS, //低位
+    BYTE_HIGH_ADDRESS //高位
+} byte_part;
+
+/**
+ * Name:    _crc
+ * Brief:   crc和校验
+ * Input:
+ *  @msg:   校验数据包
+ *  @len:   数据包长度
+ * Output:  校验值
+ */
+int _crc(uint8_t *msg, int len)
+{
+    uint8_t crc = 0;
+    while (len--)
+    {
+        crc += *msg++;
+    }
+    return crc;
+}
+
+/**
+ * Name:    dlt645_common_check
+ * Brief:   645协议接收数据公共部分校验
+ * Input:
+ *  @msg:   校验数据包
+ *  @len:   数据包长度
+ *  @addr:  从站地址
+ * Output:  校验成功:0,校验失败:-1
+ */
+int dlt645_common_check(uint8_t *msg, int len, uint8_t *addr)
+{
+    //数据包长度校验
+    if (len < 7)
+    {
+        return -1;
+    }
+    //数据帧标志校验
+    if (msg[0] != DL645_START_CODE ||
+        msg[DL645_ADDR_LEN + 1] != DL645_START_CODE ||
+        msg[len - 1] != DL645_STOP_CODE)
+    {
+        DLT645_LOG("check code error!\n");
+        return -1;
+    }
+    //CRC校验
+    uint8_t crc = _crc(msg, len - 2);
+    if (crc != msg[len - 2])
+    {
+        DLT645_LOG("check crc error!\n");
+        return -1;
+    }
+    //控制码主从校验
+    if ((msg[DL645_CONTROL_POS] & C_TD_MASK) == (C_TD_MASTER << C_TD_POS))
+    {
+        DLT645_LOG("check control direction error!\n");
+        return -1;
+    }
+    //控制码应答校验
+    if ((msg[DL645_CONTROL_POS] & C_ACK_MASK) == (C_ACK_ERR << C_ACK_POS))
+    {
+        DLT645_LOG("check ACK error!\n");
+        return msg[len - 3];
+    }
+    //从站地址校验
+    if (memcmp(msg + 1, addr, 6) != 0)
+    {
+        return -1;
+    }
+
+    return 0;
+}
+
+/**
+ * Name:    dec2bcd
+* Brief:   十进制转BCD码(目前支持32位数字大小)
+ * Input:
+ *  @val:   十进制值
+ * Output:  BCD码值
+ */
+uint32_t dec_to_bcd(uint32_t val)
+{
+    uint32_t data = 0;
+
+    if (val < 100)
+    {
+        uint8_t byte0 = val % 10;
+        uint8_t byte1 = val / 10;
+        data = (byte1 << 4) + byte0;
+    }
+    else if (val < 10000)
+    {
+        uint8_t byte0 = val % 10;
+        uint8_t byte1 = (val / 10) % 10;
+        uint8_t byte2 = (val / 100) % 10;
+        uint8_t byte3 = (val / 1000) % 10;
+        data = (byte3 << 12) +
+               (byte2 << 8) +
+               (byte1 << 4) + byte0;
+    }
+    else if (val < 1000000)
+    {
+        uint8_t byte0 = val % 10;
+        uint8_t byte1 = (val / 10) % 10;
+        uint8_t byte2 = (val / 100) % 10;
+        uint8_t byte3 = (val / 1000) % 10;
+        uint8_t byte4 = (val / 10000) % 10;
+        uint8_t byte5 = (val / 100000) % 10;
+        data = (byte5 << 20) +
+               (byte4 << 16) +
+               (byte3 << 12) +
+               (byte2 << 8) +
+               (byte1 << 4) + byte0;
+    }
+    else if (val < 100000000)
+    {
+        uint8_t byte0 = val % 10;
+        uint8_t byte1 = (val / 10) % 10;
+        uint8_t byte2 = (val / 100) % 10;
+        uint8_t byte3 = (val / 1000) % 10;
+        uint8_t byte4 = (val / 10000) % 10;
+        uint8_t byte5 = (val / 100000) % 10;
+        uint8_t byte6 = (val / 1000000) % 10;
+        uint8_t byte7 = (val / 10000000) % 10;
+        data = (byte7 << 28) +
+               (byte6 << 24) +
+               (byte5 << 20) +
+               (byte4 << 16) +
+               (byte3 << 12) +
+               (byte2 << 8) +
+               (byte1 << 4) + byte0;
+    }
+    return data;
+}
+
+/**
+ * Name:    str_to_bcd
+ * Brief:   字符串转BCD形式
+ * Input:
+ *  @str:               要转换的字符串
+ *  @bcd_store_address: 转换后的存储地址
+ *  @bcd_len:           BCD码总长度
+ * Output:  成功0,失败-1
+ */
+int str_to_bcd(char *str, uint8_t *bcd_store_address, uint16_t bcd_len)
+{
+    //字符串偏移
+    int str_pos = bcd_len * 2 - strlen(str);
+    //字符串比BCD码长度长
+    if (str_pos < 0)
+    {
+        return -1;
+    }
+    memset(bcd_store_address, 0, bcd_len);
+
+    for (int i = 0; i < strlen(str); i++)
+    {
+        if (str[i] >= '0' && str[i] <= '9')
+        {
+            bcd_store_address[(i + str_pos) / 2] |= (str[i] - '0') << (4 * ((i + 1 + (strlen(str) % 2)) % 2));
+        }
+        else
+        {
+            //当前字符不为数字,返回错误
+            return -1;
+        }
+    }
+    return 0;
+}
+
+/**
+ * Name:    data_package_translate_to_int
+ * Brief:   将接收到的dlt645数据包中的数据转化为整数
+ * Input:
+ *  @read_data: 数据首地址
+ *  @len:       数据长度
+ * Output:  转化后的整数
+ */
+int data_package_translate_to_int(uint8_t *read_data, uint16_t len)
+{
+    //权值
+    uint8_t number_weight = 0;
+    //当前数组下标索引
+    uint8_t current_index = 0;
+    //当前解析字节位
+    uint8_t current_byte_part = BYTE_RESET;
+    //当前整数值
+    int i_value = 0;
+
+    while (len--)
+    {
+        current_byte_part = BYTE_LOW_ADDRESS;
+        do
+        {
+            switch (current_byte_part)
+            {
+            //当前处理字节低位
+            case BYTE_LOW_ADDRESS:
+                i_value += ((read_data[current_index] - 0x33) & 0x0f) * pow(10, number_weight);
+                number_weight++;
+                current_byte_part = BYTE_HIGH_ADDRESS;
+                break;
+            //当前处理字节高位
+            case BYTE_HIGH_ADDRESS:
+                i_value += ((read_data[current_index] - 0x33) >> 4) * pow(10, number_weight);
+                number_weight++;
+                current_byte_part = BYTE_RESET;
+                break;
+            }
+        } while (current_byte_part != BYTE_RESET);
+        current_index++;
+    }
+    return i_value;
+}
+
+/**
+ * Name:    dlt645_data_parse_by_format_to_float
+ * Brief:   根据数据格式将645协议读取的数据转换为真实数据并存储
+ *          !真实数据为浮点数据,需要注意的是无论读取数据长度是多少,存储数据长度都应是4字节
+ * Input:
+ *  @read_data:     645协议读取的数据
+ *  @read_len:      读取数据的长度
+ *  @data_format:   转换的数据格式,如 XX.XX,XX.XXX
+ * Output:  转换成功返回0,失败返回-1
+ */
+int dlt645_data_parse_by_format_to_float(uint8_t *read_data, uint16_t read_len, const char *data_format, uint8_t *store_address)
+{
+    //权值
+    int num_weight = 0;
+    int ival = data_package_translate_to_int(read_data, read_len);
+
+    for (int i = 0; i < strlen(data_format); i++)
+    {
+        if (*(data_format + i) == '.')
+        {
+            num_weight = strlen(data_format) - i - 1;
+            if (num_weight < 0)
+            {
+                return -1;
+            }
+            break;
+        }
+    }
+    float fval = ival / pow(10, num_weight);
+    memcpy(store_address, &fval, 4);
+    return 0;
+}
+
+int dlt645_data_parse_by_format_to_float_and_DATE(uint8_t *read_data, uint16_t read_len, const char *data_format, uint8_t *store_address)
+{
+    int num_weight = 0;
+    int ival = data_package_translate_to_int(read_data, read_len);
+
+    for (int i = 0; i < strlen(data_format); i++)
+    {
+        if (*(data_format + i) == '.')
+        {
+            num_weight = strlen(data_format) - i - 1;
+            if (num_weight < 0)
+            {
+                return -1;
+            }
+            break;
+        }
+    }
+    float fval = ival / pow(10, num_weight);
+    memcpy(store_address, &fval, 4);
+    return 0;
+}

+ 613 - 0
app/modbus/mmodbus.c

@@ -0,0 +1,613 @@
+
+
+#include "mmodbus.h"
+#include "usart.h"
+#include "delay.h"
+MModBus_t mmodbus;
+
+// #####################################################################################################
+#if (_MMODBUS_RTU == 1)
+static const uint16_t wCRCTable[] =
+    {
+        0X0000, 0XC0C1, 0XC181, 0X0140, 0XC301, 0X03C0, 0X0280, 0XC241,
+        0XC601, 0X06C0, 0X0780, 0XC741, 0X0500, 0XC5C1, 0XC481, 0X0440,
+        0XCC01, 0X0CC0, 0X0D80, 0XCD41, 0X0F00, 0XCFC1, 0XCE81, 0X0E40,
+        0X0A00, 0XCAC1, 0XCB81, 0X0B40, 0XC901, 0X09C0, 0X0880, 0XC841,
+        0XD801, 0X18C0, 0X1980, 0XD941, 0X1B00, 0XDBC1, 0XDA81, 0X1A40,
+        0X1E00, 0XDEC1, 0XDF81, 0X1F40, 0XDD01, 0X1DC0, 0X1C80, 0XDC41,
+        0X1400, 0XD4C1, 0XD581, 0X1540, 0XD701, 0X17C0, 0X1680, 0XD641,
+        0XD201, 0X12C0, 0X1380, 0XD341, 0X1100, 0XD1C1, 0XD081, 0X1040,
+        0XF001, 0X30C0, 0X3180, 0XF141, 0X3300, 0XF3C1, 0XF281, 0X3240,
+        0X3600, 0XF6C1, 0XF781, 0X3740, 0XF501, 0X35C0, 0X3480, 0XF441,
+        0X3C00, 0XFCC1, 0XFD81, 0X3D40, 0XFF01, 0X3FC0, 0X3E80, 0XFE41,
+        0XFA01, 0X3AC0, 0X3B80, 0XFB41, 0X3900, 0XF9C1, 0XF881, 0X3840,
+        0X2800, 0XE8C1, 0XE981, 0X2940, 0XEB01, 0X2BC0, 0X2A80, 0XEA41,
+        0XEE01, 0X2EC0, 0X2F80, 0XEF41, 0X2D00, 0XEDC1, 0XEC81, 0X2C40,
+        0XE401, 0X24C0, 0X2580, 0XE541, 0X2700, 0XE7C1, 0XE681, 0X2640,
+        0X2200, 0XE2C1, 0XE381, 0X2340, 0XE101, 0X21C0, 0X2080, 0XE041,
+        0XA001, 0X60C0, 0X6180, 0XA141, 0X6300, 0XA3C1, 0XA281, 0X6240,
+        0X6600, 0XA6C1, 0XA781, 0X6740, 0XA501, 0X65C0, 0X6480, 0XA441,
+        0X6C00, 0XACC1, 0XAD81, 0X6D40, 0XAF01, 0X6FC0, 0X6E80, 0XAE41,
+        0XAA01, 0X6AC0, 0X6B80, 0XAB41, 0X6900, 0XA9C1, 0XA881, 0X6840,
+        0X7800, 0XB8C1, 0XB981, 0X7940, 0XBB01, 0X7BC0, 0X7A80, 0XBA41,
+        0XBE01, 0X7EC0, 0X7F80, 0XBF41, 0X7D00, 0XBDC1, 0XBC81, 0X7C40,
+        0XB401, 0X74C0, 0X7580, 0XB541, 0X7700, 0XB7C1, 0XB681, 0X7640,
+        0X7200, 0XB2C1, 0XB381, 0X7340, 0XB101, 0X71C0, 0X7080, 0XB041,
+        0X5000, 0X90C1, 0X9181, 0X5140, 0X9301, 0X53C0, 0X5280, 0X9241,
+        0X9601, 0X56C0, 0X5780, 0X9741, 0X5500, 0X95C1, 0X9481, 0X5440,
+        0X9C01, 0X5CC0, 0X5D80, 0X9D41, 0X5F00, 0X9FC1, 0X9E81, 0X5E40,
+        0X5A00, 0X9AC1, 0X9B81, 0X5B40, 0X9901, 0X59C0, 0X5880, 0X9841,
+        0X8801, 0X48C0, 0X4980, 0X8941, 0X4B00, 0X8BC1, 0X8A81, 0X4A40,
+        0X4E00, 0X8EC1, 0X8F81, 0X4F40, 0X8D01, 0X4DC0, 0X4C80, 0X8C41,
+        0X4400, 0X84C1, 0X8581, 0X4540, 0X8701, 0X47C0, 0X4680, 0X8641,
+        0X8201, 0X42C0, 0X4380, 0X8341, 0X4100, 0X81C1, 0X8081, 0X4040};
+// crc校验
+uint16_t mmodbus_crc16(const uint8_t *nData, uint16_t wLength)
+{
+  uint8_t nTemp;
+  uint16_t wCRCWord = 0xFFFF;
+  while (wLength--)
+  {
+    nTemp = *nData++ ^ wCRCWord;
+    wCRCWord >>= 8;
+    wCRCWord ^= wCRCTable[nTemp];
+  }
+  return wCRCWord;
+}
+
+
+
+#endif
+// #####################################################################################################
+void mmodbus_callback(void)
+{
+	OSIntEnter();
+  if (RESET != USART_GetFlagStatus(_MMODBUS_USART,USART_FLAG_RXNE))
+  {
+    if (mmodbus.rxIndex < _MMODBUS_RXSIZE - 1)
+    {
+      mmodbus.rxBuf[mmodbus.rxIndex] = USART_ReceiveData(_MMODBUS_USART);
+      mmodbus.rxIndex++;
+    }
+    else
+      USART_ReceiveData(_MMODBUS_USART);
+  }
+
+  if ((mmodbus.rxIndex > 0) && RESET != USART_GetFlagStatus(_MMODBUS_USART, USART_FLAG_IDLE))
+  {
+    USART_ReceiveData(_MMODBUS_USART);
+    mmodbus.done = 1;
+		
+    return;
+  }
+  else
+  {
+    USART_GetITStatus(_MMODBUS_USART, USART_FLAG_RXNE);
+  }
+  mmodbus.rxTime = gettick();
+	OSIntExit();
+}
+
+// ##################################################################################################
+uint16_t mmodbus_receiveRaw(uint32_t timeout)
+{
+  uint32_t startTime = gettick();
+  while (1)
+  {
+    if (gettick() - startTime> timeout * 1000)
+      return 0;
+    if ((mmodbus.rxIndex > 0) && (RESET != USART_GetFlagStatus(_MMODBUS_USART, USART_FLAG_IDLE)))
+    {
+      USART_ReceiveData(_MMODBUS_USART);
+      return mmodbus.rxIndex;
+    }
+    if (mmodbus.done == 1)
+    {
+      return mmodbus.rxIndex;
+    }
+
+    mmodbus_delay(1);
+  }
+}
+// ##################################################################################################
+bool mmodbus_sendRaw(uint8_t *data, uint16_t size, uint32_t timeout)
+	{
+	while(mmodbus.txBusy == 1)
+	mmodbus_delay(1);
+	mmodbus.txBusy = 1;
+	memset(mmodbus.rxBuf, 0, _MMODBUS_RXSIZE);
+	mmodbus.rxIndex = 0;
+	uint32_t startTime = gettick();
+	GPIO_WriteBit(_MMODBUS_CTRL_GPIO, _MMODBUS_CTRL_PIN,1);
+	mmodbus_delay(1);
+	for (uint16_t i = 0; i < size; i++)
+	{
+		USART_SendData(_MMODBUS_USART,data[i]);
+		
+	} 
+	while (RESET == USART_GetFlagStatus(_MMODBUS_USART, USART_FLAG_TC));
+	
+	GPIO_WriteBit(_MMODBUS_CTRL_GPIO, _MMODBUS_CTRL_PIN,0);
+	mmodbus.done=0;
+	mmodbus.txBusy = 0;
+	return true;
+}
+
+
+// ##################################################################################################
+bool mmodbus_init(uint32_t timeout)
+{
+  // HAL_GPIO_WritePin(_MMODBUS_CTRL_GPIO, _MMODBUS_CTRL_PIN, GPIO_PIN_RESET); 此处初始化在485 init过
+	GPIO_WriteBit(_MMODBUS_CTRL_GPIO, _MMODBUS_CTRL_PIN,0);
+  memset(&mmodbus, 0, sizeof(mmodbus));
+  mmodbus.timeout = timeout;
+  return true;
+}
+// ##################################################################################################
+void mmodbus_set16bitOrder(MModBus_16bitOrder_t MModBus_16bitOrder_)
+{
+  mmodbus.byteOrder16 = MModBus_16bitOrder_;
+}
+// ##################################################################################################
+void mmodbus_set32bitOrder(MModBus_32bitOrder_t MModBus_32bitOrder_)
+{
+  mmodbus.byteOrder32 = MModBus_32bitOrder_;
+}
+// ##################################################################################################
+bool mmodbus_readCoil(uint8_t slaveAddress, uint16_t number, uint8_t *data)
+{
+  return mmodbus_readCoils(slaveAddress, number, 1, data);
+}
+// ##################################################################################################
+// 读线圈
+bool mmodbus_readCoils(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, uint8_t *data)
+{
+#if (_MMODBUS_RTU == 1)
+  uint8_t txData[8];
+  txData[0] = slaveAddress;
+  txData[1] = MModbusCMD_ReadCoilStatus;
+  txData[2] = (startnumber & 0xFF00) >> 8;
+  txData[3] = (startnumber & 0x00FF);
+  txData[4] = (length & 0xFF00) >> 8;
+  txData[5] = (length & 0x00FF);
+  static uint16_t crc;
+  crc = mmodbus_crc16(txData, 6);
+  txData[6] = (crc & 0x00FF);
+  txData[7] = (crc & 0xFF00) >> 8;
+  mmodbus_sendRaw(txData, 8, 100);
+  uint16_t recLen = mmodbus_receiveRaw(mmodbus.timeout);
+  if (recLen == 0)
+    return false;
+  if (mmodbus.rxBuf[0] != slaveAddress)
+    return false;
+  if (mmodbus.rxBuf[1] != MModbusCMD_ReadCoilStatus)
+    return false;
+  crc = mmodbus_crc16(mmodbus.rxBuf, mmodbus.rxBuf[2] + 3);
+  if (((crc & 0x00FF) != mmodbus.rxBuf[mmodbus.rxBuf[2] + 3]) || (((crc & 0xFF00) >> 8) != mmodbus.rxBuf[mmodbus.rxBuf[2] + 4]))
+    return false;
+  if (data != NULL)
+    memcpy(data, &mmodbus.rxBuf[3], mmodbus.rxBuf[2]);
+  return true;
+#endif
+#if (_MMODBUS_ASCII == 1)
+
+#endif
+}
+// ##################################################################################################
+bool mmodbus_readDiscreteInput(uint8_t slaveAddress, uint16_t number, uint8_t *data)
+{
+  return mmodbus_readDiscreteInputs(slaveAddress, number, 1, data);
+}
+// ##################################################################################################
+// 读取线圈功能码处理
+bool mmodbus_readDiscreteInputs(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, uint8_t *data)
+{
+#if (_MMODBUS_RTU == 1)
+  uint8_t txData[8];
+  txData[0] = slaveAddress;
+  txData[1] = MModbusCMD_ReadDiscreteInputs;
+  txData[2] = (startnumber & 0xFF00) >> 8;
+  txData[3] = (startnumber & 0x00FF);
+  txData[4] = (length & 0xFF00) >> 8;
+  txData[5] = (length & 0x00FF);
+  static uint16_t crc;
+  crc = mmodbus_crc16(txData, 6);
+  txData[6] = (crc & 0x00FF);
+  txData[7] = (crc & 0xFF00) >> 8;
+  mmodbus_sendRaw(txData, 8, 100);
+  uint16_t recLen = mmodbus_receiveRaw(mmodbus.timeout);
+  if (recLen == 0)
+    return false;
+  if (mmodbus.rxBuf[0] != slaveAddress)
+    return false;
+  if (mmodbus.rxBuf[1] != MModbusCMD_ReadDiscreteInputs)
+    return false;
+  crc = mmodbus_crc16(mmodbus.rxBuf, mmodbus.rxBuf[2] + 3);
+  if (((crc & 0x00FF) != mmodbus.rxBuf[mmodbus.rxBuf[2] + 3]) || (((crc & 0xFF00) >> 8) != mmodbus.rxBuf[mmodbus.rxBuf[2] + 4]))
+    return false;
+  if (data != NULL)
+    memcpy(data, &mmodbus.rxBuf[3], mmodbus.rxBuf[2]);
+  return true;
+#endif
+}
+// ##################################################################################################
+
+bool mmodbus_readInputRegisters8i(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, uint8_t *data)
+{
+#if (_MMODBUS_RTU == 1)
+  uint8_t txData[8];
+  txData[0] = slaveAddress;
+  txData[1] = MModbusCMD_ReadInputRegisters;
+  txData[2] = (startnumber & 0xFF00) >> 8;
+  txData[3] = (startnumber & 0x00FF);
+  txData[4] = (length & 0xFF00) >> 8;
+  txData[5] = (length & 0x00FF);
+  static uint16_t crc;
+  crc = mmodbus_crc16(txData, 6);
+  txData[6] = (crc & 0x00FF);
+  txData[7] = (crc & 0xFF00) >> 8;
+  mmodbus_sendRaw(txData, 8, 100);
+  uint16_t recLen = mmodbus_receiveRaw(mmodbus.timeout);
+  if (recLen == 0)
+    return false;
+  if (mmodbus.rxBuf[0] != slaveAddress)
+    return false;
+  if (mmodbus.rxBuf[1] != MModbusCMD_ReadInputRegisters)
+    return false;
+  crc = mmodbus_crc16(mmodbus.rxBuf, mmodbus.rxBuf[2] + 3);
+  if (((crc & 0x00FF) != mmodbus.rxBuf[mmodbus.rxBuf[2] + 3]) || (((crc & 0xFF00) >> 8) != mmodbus.rxBuf[mmodbus.rxBuf[2] + 4]))
+    return false;
+  if (data != NULL)
+    memcpy(data, &mmodbus.rxBuf[3], mmodbus.rxBuf[2]);
+  return true;
+#endif
+}
+// ##################################################################################################
+bool mmodbus_readInputRegister32f(uint8_t slaveAddress, uint16_t number, float *data)
+{
+  return mmodbus_readInputRegisters32f(slaveAddress, number, 1, data);
+}
+// ##################################################################################################
+bool mmodbus_readInputRegisters32f(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, float *data)
+{
+  bool ret = mmodbus_readInputRegisters8i(slaveAddress, startnumber, length * 2, (uint8_t *)data);
+  if (ret == true)
+  {
+    for (uint16_t i = 0; i < length; i++)
+    {
+      uint8_t tmp1[4], tmp2[4];
+      switch (mmodbus.byteOrder32)
+      {
+      case MModBus_32bitOrder_DCBA:
+        memcpy(tmp1, &data[i], 4);
+        tmp2[0] = tmp1[3];
+        tmp2[1] = tmp1[2];
+        tmp2[2] = tmp1[1];
+        tmp2[3] = tmp1[0];
+        memcpy(&data[i], tmp2, 4);
+        break;
+      case MModBus_32bitOrder_BADC:
+        memcpy(tmp1, &data[i], 4);
+        tmp2[0] = tmp1[1];
+        tmp2[1] = tmp1[0];
+        tmp2[2] = tmp1[3];
+        tmp2[3] = tmp1[2];
+        memcpy(&data[i], tmp2, 4);
+        break;
+      case MModBus_32bitOrder_CDAB:
+        memcpy(tmp1, &data[i], 4);
+        tmp2[0] = tmp1[2];
+        tmp2[1] = tmp1[3];
+        tmp2[2] = tmp1[0];
+        tmp2[3] = tmp1[1];
+        memcpy(&data[i], tmp2, 4);
+        break;
+      default:
+
+        break;
+      }
+    }
+    return true;
+  }
+  else
+    return false;
+}
+// ##################################################################################################
+bool mmodbus_readInputRegister32i(uint8_t slaveAddress, uint16_t number, uint32_t *data)
+{
+  return mmodbus_readInputRegisters32i(slaveAddress, number, 1, data);
+}
+// ##################################################################################################
+bool mmodbus_readInputRegisters32i(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, uint32_t *data)
+{
+  return mmodbus_readInputRegisters32f(slaveAddress, startnumber, length, (float *)data);
+}
+// ##################################################################################################
+bool mmodbus_readInputRegister16i(uint8_t slaveAddress, uint16_t number, uint16_t *data)
+{
+  return mmodbus_readInputRegisters16i(slaveAddress, number, 1, data);
+}
+// ##################################################################################################
+bool mmodbus_readInputRegisters16i(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, uint16_t *data)
+{
+  bool ret = mmodbus_readInputRegisters8i(slaveAddress, startnumber, length * 1, (uint8_t *)data);
+  if (ret == true)
+  {
+    uint8_t tmp1[2], tmp2[2];
+    for (uint16_t i = 0; i < length; i++)
+    {
+      switch (mmodbus.byteOrder16)
+      {
+      case MModBus_16bitOrder_AB:
+        memcpy(tmp1, &data[i], 2);
+        tmp2[0] = tmp1[0];
+        tmp2[1] = tmp1[1];
+        memcpy(&data[i], tmp2, 2);
+        break;
+      default:
+        memcpy(tmp1, &data[i], 2);
+        tmp2[0] = tmp1[1];
+        tmp2[1] = tmp1[0];
+        memcpy(&data[i], tmp2, 2);
+        break;
+      }
+    }
+    return true;
+  }
+  else
+    return false;
+}
+// ##################################################################################################
+bool mmodbus_readHoldingRegisters8i(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, uint8_t *data)
+{
+#if (_MMODBUS_RTU == 1)
+  uint8_t txData[8];
+  txData[0] = slaveAddress;
+  txData[1] = MModbusCMD_ReadHoldingRegisters;
+  txData[2] = (startnumber & 0xFF00) >> 8;
+  txData[3] = (startnumber & 0x00FF);
+  txData[4] = (length & 0xFF00) >> 8;
+  txData[5] = (length & 0x00FF);
+  static uint16_t crc;
+  crc = mmodbus_crc16(txData, 6);
+  txData[6] = (crc & 0x00FF);
+  txData[7] = (crc & 0xFF00) >> 8;
+  mmodbus_sendRaw(txData, 8, 100);
+  uint16_t recLen = mmodbus_receiveRaw(mmodbus.timeout);
+  if (recLen == 0)
+    return false;
+  if (mmodbus.rxBuf[0] != slaveAddress)
+    return false;
+  if (mmodbus.rxBuf[1] != MModbusCMD_ReadHoldingRegisters)
+    return false;
+  crc = mmodbus_crc16(mmodbus.rxBuf, mmodbus.rxBuf[2] + 3);
+  if (((crc & 0x00FF) != mmodbus.rxBuf[mmodbus.rxBuf[2] + 3]) || (((crc & 0xFF00) >> 8) != mmodbus.rxBuf[mmodbus.rxBuf[2] + 4]))
+    return false;
+  if (data != NULL)
+  {
+    for (uint8_t i = 0; i < mmodbus.rxBuf[2]; i += 2)
+    {
+      uint8_t H = mmodbus.rxBuf[i + 3];
+      mmodbus.rxBuf[i + 3] = mmodbus.rxBuf[i + 3 + 1];
+      mmodbus.rxBuf[i + 3 + 1] = H;
+    }
+    memcpy(data, &mmodbus.rxBuf[3], mmodbus.rxBuf[2]);
+  }
+  return true;
+#endif
+}
+// ##################################################################################################
+bool mmodbus_readHoldingRegister32f(uint8_t slaveAddress, uint16_t number, float *data)
+{
+  return mmodbus_readHoldingRegisters32f(slaveAddress, number, 1, data);
+}
+// ##################################################################################################
+bool mmodbus_readHoldingRegisters32f(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, float *data)
+{
+  bool ret = mmodbus_readHoldingRegisters8i(slaveAddress, startnumber, length * 2, (uint8_t *)data);
+  if (ret == true)
+  {
+    for (uint16_t i = 0; i < length; i++)
+    {
+      uint8_t tmp1[4], tmp2[4];
+      switch (mmodbus.byteOrder32)
+      {
+      case MModBus_32bitOrder_DCBA:
+        memcpy(tmp1, &data[i], 4);
+        tmp2[0] = tmp1[3];
+        tmp2[1] = tmp1[2];
+        tmp2[2] = tmp1[1];
+        tmp2[3] = tmp1[0];
+        memcpy(&data[i], tmp2, 4);
+        break;
+      case MModBus_32bitOrder_BADC:
+        memcpy(tmp1, &data[i], 4);
+        tmp2[0] = tmp1[1];
+        tmp2[1] = tmp1[0];
+        tmp2[2] = tmp1[3];
+        tmp2[3] = tmp1[2];
+        memcpy(&data[i], tmp2, 4);
+        break;
+      case MModBus_32bitOrder_CDAB:
+        memcpy(tmp1, &data[i], 4);
+        tmp2[0] = tmp1[2];
+        tmp2[1] = tmp1[3];
+        tmp2[2] = tmp1[0];
+        tmp2[3] = tmp1[1];
+        memcpy(&data[i], tmp2, 4);
+        break;
+      default:
+
+        break;
+      }
+    }
+    return true;
+  }
+  else
+    return false;
+}
+// ##################################################################################################
+bool mmodbus_readHoldingRegister32i(uint8_t slaveAddress, uint16_t number, uint32_t *data)
+{
+  return mmodbus_readHoldingRegisters32i(slaveAddress, number, 1, data);
+}
+// ##################################################################################################
+bool mmodbus_readHoldingRegisters32i(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, uint32_t *data)
+{
+  return mmodbus_readHoldingRegisters32f(slaveAddress, startnumber, length, (float *)data);
+}
+// ##################################################################################################
+bool mmodbus_readHoldingRegister16i(uint8_t slaveAddress, uint16_t number, uint16_t *data)
+{
+  return mmodbus_readHoldingRegisters16i(slaveAddress, number, 1, data);
+}
+// ##################################################################################################
+bool mmodbus_readHoldingRegisters16i(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, uint16_t *data)
+{
+  bool ret = mmodbus_readHoldingRegisters8i(slaveAddress, startnumber, length * 1, (uint8_t *)data);
+  if (ret == true)
+  {
+    uint8_t tmp1[2], tmp2[2];
+    for (uint16_t i = 0; i < length; i++)
+    {
+      switch (mmodbus.byteOrder16)
+      {
+      case MModBus_16bitOrder_AB:
+        memcpy(tmp1, &data[i], 2);
+        tmp2[0] = tmp1[0];
+        tmp2[1] = tmp1[1];
+        memcpy(&data[i], tmp2, 2);
+        break;
+      default:
+        memcpy(tmp1, &data[i], 2);
+        tmp2[0] = tmp1[1];
+        tmp2[1] = tmp1[0];
+        memcpy(&data[i], tmp2, 2);
+        break;
+      }
+    }
+    return true;
+  }
+  else
+    return false;
+}
+// ##################################################################################################
+bool mmodbus_writeCoil(uint8_t slaveAddress, uint16_t number, uint8_t data)
+{
+#if (_MMODBUS_RTU == 1)
+  uint8_t txData[8];
+  txData[0] = slaveAddress;
+  txData[1] = MModbusCMD_WriteSingleCoil;
+  txData[2] = (number & 0xFF00) >> 8;
+  txData[3] = (number & 0x00FF);
+  if (data == 0)
+    txData[4] = 0;
+  else
+    txData[4] = 0xFF;
+  txData[5] = 0;
+  static uint16_t crc;
+  crc = mmodbus_crc16(txData, 6);
+  txData[6] = (crc & 0x00FF);
+  txData[7] = (crc & 0xFF00) >> 8;
+  mmodbus_sendRaw(txData, 8, 100);
+  uint16_t recLen = mmodbus_receiveRaw(mmodbus.timeout);
+  if (recLen == 0)
+    return false;
+  if (memcmp(txData, mmodbus.rxBuf, 8) == 0)
+    return true;
+  else
+    return false;
+#endif
+#if (_MMODBUS_ASCII == 1)
+
+#endif
+}
+
+// ##################################################################################################
+bool mmodbus_writeHoldingRegister16i(uint8_t slaveAddress, uint16_t number, uint16_t data)
+{
+#if (_MMODBUS_RTU == 1)
+  uint8_t txData[8];
+  txData[0] = slaveAddress;
+  txData[1] = MModbusCMD_WriteSingleRegister;
+  txData[2] = (number & 0xFF00) >> 8;
+  txData[3] = (number & 0x00FF);
+  txData[4] = (data & 0xFF00) >> 8;
+  txData[5] = data & 0x00FF;
+  static uint16_t crc;
+  crc = mmodbus_crc16(txData, 6);
+  txData[6] = (crc & 0x00FF);
+  txData[7] = (crc & 0xFF00) >> 8;
+  mmodbus_sendRaw(txData, 8, 100);
+  uint16_t recLen = mmodbus_receiveRaw(mmodbus.timeout);
+  if (recLen == 0)
+    return false;
+  if (memcmp(txData, mmodbus.rxBuf, 8) == 0)
+    return true;
+  else
+    return false;
+#endif
+#if (_MMODBUS_ASCII == 1)
+
+#endif
+}
+// ##################################################################################################
+bool mmodbus_writeHoldingRegisters16i(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, uint16_t *data)
+{
+#if (_MMODBUS_RTU == 1)
+  if (length == 1)
+  {
+    return mmodbus_writeHoldingRegister16i(slaveAddress, startnumber, data[0]);
+  }
+  else
+  {
+    uint8_t txData[7 + length * 2 + 2];
+    txData[0] = slaveAddress;
+    txData[1] = MModbusCMD_WriteMultipleRegisters;
+    txData[2] = (startnumber & 0xFF00) >> 8;
+    txData[3] = (startnumber & 0x00FF);
+    txData[4] = (length & 0xFF00) >> 8;
+    txData[5] = (length & 0x00FF);
+    txData[6] = (length * 2);
+    uint8_t tmp1[2], tmp2[2];
+    for (uint16_t i = 0; i < length; i++)
+    {
+      switch (mmodbus.byteOrder16)
+      {
+      case MModBus_16bitOrder_AB:
+        memcpy(tmp1, &data[i], 2);
+        tmp2[0] = tmp1[1];
+        tmp2[1] = tmp1[0];
+        memcpy(&txData[7 + i * 2], tmp2, 2);
+        break;
+      default:
+        memcpy(tmp1, &data[i], 2);
+        tmp2[0] = tmp1[0];
+        tmp2[1] = tmp1[1];
+        memcpy(&txData[7 + i * 2], tmp2, 2);
+        break;
+      }
+    }
+    static uint16_t crc;
+    crc = mmodbus_crc16(txData, 7 + length * 2);
+    txData[7 + length * 2 + 0] = (crc & 0x00FF);
+    txData[7 + length * 2 + 1] = (crc & 0xFF00) >> 8;
+    mmodbus_sendRaw(txData, 7 + length * 2 + 2, 100);
+    uint16_t recLen = mmodbus_receiveRaw(mmodbus.timeout);
+    if (recLen == 0)
+      return false;
+    crc = mmodbus_crc16(txData, 6);
+    txData[6] = (crc & 0x00FF);
+    txData[7] = (crc & 0xFF00) >> 8;
+    if (memcmp(txData, mmodbus.rxBuf, 8) == 0)
+      return true;
+    else
+      return false;
+  }
+#endif
+#if (_MMODBUS_ASCII == 1)
+
+#endif
+}
+// ##################################################################################################
+

+ 166 - 0
app/modbus/mmodbus.h

@@ -0,0 +1,166 @@
+#ifndef _M_MODBUS_H_
+#define _M_MODBUS_H_
+
+
+/*
+  Author:     Nima Askari
+  WebSite:    http://www.github.com/NimaLTD
+  Instagram:  http://instagram.com/github.NimaLTD
+  Youtube:    https://www.youtube.com/channel/UCUhY7qY1klJm1d2kulr9ckw
+  
+  Version:    1.3.2
+  
+  Reversion History:
+  
+  (1.3.2)
+  Speedup receiver, add write multiple holding
+    
+  (1.3.1)
+  Remove delay in sending function when DMA is disabled
+  
+  (1.3.0)
+  Add 16 bit order
+  
+  (1.2.1)
+  bug fixed.
+  
+  (1.2.0)
+  add read 32bit register order.
+  
+  (1.1.2)
+  fix read holding register.
+  
+  (1.1.1)
+  fix functions name.
+  
+  (1.1.0)
+  add 16bit,32bit,float read.
+  
+  (1.0.1)
+  add delay in receive routin.
+  
+  (1.0.0)
+  First release.
+*/ 
+
+#include "stm32f2xx.h"
+#include  "mmodbusConfig.h"
+//#include  "usart.h"
+#include  <stdbool.h>
+#include  <string.h>
+#include  <stdio.h>
+#include  <stdint.h>
+#include "ucos_ii.h"
+#if _MMODBUS_FREERTOS == 1
+#include  "cmsis_os.h"
+#define   mmodbus_delay(x)  osDelay(x)
+#else
+#define   mmodbus_delay(x)  delay_ms(x)
+#endif
+
+/*
+功能码
+MModbusCMD_ReadCoilStatus(读线圈状态):用于读取一个或多个逻辑线圈的状态。
+MModbusCMD_ReadDiscreteInputs(读离散输入状态):用于读取一个或多个数字输入信号的状态。
+MModbusCMD_ReadHoldingRegisters(读保持寄存器):用于读取一个或多个保持寄存器的值。
+MModbusCMD_ReadInputRegisters(读输入寄存器):用于读取一个或多个输入寄存器的值。
+MModbusCMD_WriteSingleCoil(写单个线圈):用于控制单个逻辑线圈的状态。
+MModbusCMD_WriteSingleRegister(写单个保持寄存器):用于写入单个保持寄存器的值。
+MModbusCMD_WriteMultipleCoils(写多个线圈):用于控制多个逻辑线圈的状态。
+MModbusCMD_WriteMultipleRegisters(写多个保持寄存器):用于写入多个保持寄存器的值。
+*/
+typedef enum
+{
+  MModbusCMD_ReadCoilStatus = 1,
+  MModbusCMD_ReadDiscreteInputs = 2,
+  MModbusCMD_ReadHoldingRegisters = 3,
+  MModbusCMD_ReadInputRegisters = 4,
+  MModbusCMD_WriteSingleCoil = 5,
+  MModbusCMD_WriteSingleRegister = 6,
+  MModbusCMD_WriteMultipleCoils = 15,
+  MModbusCMD_WriteMultipleRegisters = 16
+  
+}MModbusCMD_t;
+
+//大小端
+typedef enum
+{
+  MModBus_16bitOrder_AB=1,
+  MModBus_16bitOrder_BA=2,
+  
+}MModBus_16bitOrder_t;
+
+typedef enum
+{
+  MModBus_32bitOrder_ABCD = 0,
+  MModBus_32bitOrder_DCBA,
+  MModBus_32bitOrder_BADC,
+  MModBus_32bitOrder_CDAB,  
+  
+}MModBus_32bitOrder_t;
+
+/*
+	rxIndex:接收缓冲区的当前接收位置。
+	rxBuf:接收缓冲区。
+	rxTime:最近一次接收数据的时间戳。
+	txBusy:发送是否忙碌的标志位。
+	timeout:超时时间。
+	byteOrder16:16 位数据的字节序(即高位字节在前还是低位字节在前)。
+	byteOrder32:32 位数据的字节序。
+	done:数据是否接收完成的标志位。
+	txDmaDone:DMA 发送是否完成的标志位(该成员只在使用 DMA 发送时有效)。
+*/
+typedef struct
+{
+  uint16_t              rxIndex;  
+  uint8_t               rxBuf[_MMODBUS_RXSIZE];
+  uint32_t              rxTime;
+  uint8_t               txBusy;
+  uint32_t              timeout; 
+  MModBus_16bitOrder_t  byteOrder16;
+  MModBus_32bitOrder_t  byteOrder32;
+	uint8_t								done;
+  #if (_MMODBUS_TXDMA == 1)
+  uint8_t             txDmaDone;
+  #endif  
+  
+}MModBus_t;
+
+//##################################################################################################
+
+void    mmodbus_callback(void);
+
+void    mmodbus_callback_txDMA(void);
+
+bool    mmodbus_init(uint32_t setTimeout);
+void    mmodbus_set16bitOrder(MModBus_16bitOrder_t MModBus_16bitOrder_);
+void    mmodbus_set32bitOrder(MModBus_32bitOrder_t MModBus_32bitOrder_);
+//  coils numbers 00001 to 09999
+bool    mmodbus_readCoil(uint8_t slaveAddress, uint16_t number, uint8_t *data);
+bool    mmodbus_readCoils(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, uint8_t *data);
+//  discrete input 10001 to 19999
+bool    mmodbus_readDiscreteInput(uint8_t slaveAddress, uint16_t number, uint8_t *data);
+bool    mmodbus_readDiscreteInputs(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, uint8_t *data);
+//  input register 30001 to 39999
+bool    mmodbus_readInputRegister32f(uint8_t slaveAddress, uint16_t number, float *data);
+bool    mmodbus_readInputRegisters32f(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, float *data);
+bool    mmodbus_readInputRegister32i(uint8_t slaveAddress, uint16_t number, uint32_t *data);
+bool    mmodbus_readInputRegisters32i(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, uint32_t *data);
+bool    mmodbus_readInputRegister16i(uint8_t slaveAddress, uint16_t number, uint16_t *data);
+bool    mmodbus_readInputRegisters16i(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, uint16_t *data);
+//  holding register 40001 to 49999
+bool    mmodbus_readHoldingRegister32f(uint8_t slaveAddress, uint16_t number, float *data);
+bool    mmodbus_readHoldingRegisters32f(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, float *data);
+bool    mmodbus_readHoldingRegister32i(uint8_t slaveAddress, uint16_t number, uint32_t *data);
+bool    mmodbus_readHoldingRegisters32i(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, uint32_t *data);
+bool    mmodbus_readHoldingRegister16i(uint8_t slaveAddress, uint16_t number, uint16_t *data);
+bool    mmodbus_readHoldingRegisters16i(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, uint16_t *data);
+// coils numbers 00001 to 09999
+bool    mmodbus_writeCoil(uint8_t slaveAddress, uint16_t number, uint8_t data);
+//  holding register 40001 to 49999
+bool    mmodbus_writeHoldingRegister16i(uint8_t slaveAddress, uint16_t number, uint16_t data);
+bool    mmodbus_writeHoldingRegisters16i(uint8_t slaveAddress, uint16_t startnumber, uint16_t length, uint16_t *data);
+uint16_t mmodbus_crc16(const uint8_t *nData, uint16_t wLength);
+
+//##################################################################################################
+#endif

+ 18 - 0
app/modbus/mmodbusConfig.h

@@ -0,0 +1,18 @@
+#ifndef _MMODBUS_CONFIG_H_
+#define _MMODBUS_CONFIG_H_
+
+#define _MMODBUS_FREERTOS         0
+#define _MMODBUS_RTU              1
+#define _MMODBUS_ASCII            0 //  not implemented yet
+#define _MMODBUS_USART            USART1             
+#define _MMODBUS_RXSIZE           64  
+#define _MMODBUS_TXDMA            0   
+
+#define _MMODBUS_CTRL_GPIO        USART_485_DE_GPIO_PORT
+#define _MMODBUS_CTRL_PIN         USART_485_DE_PIN
+#define gettick( )                           ( OSTimeGet() )
+
+#if (_MMODBUS_RTU == 1) && (_MMODBUS_ASCII == 1)
+#error please select _MMODBUS_RTU or _MMODBUS_ASCII
+#endif
+#endif