Compare commits

...

1 Commits

Author SHA1 Message Date
wangxujie d343ec514c 备份,通讯卡死问题 2025-04-18 13:52:07 +08:00
12 changed files with 5561 additions and 5350 deletions

View File

@ -46,6 +46,11 @@ extern "C" {
extern uint8_t tcp_echo_flags_ble2; extern uint8_t tcp_echo_flags_ble2;
extern uint8_t tcp_echo_flags_control; extern uint8_t tcp_echo_flags_control;
extern uint8_t send_data_flag_cmd; extern uint8_t send_data_flag_cmd;
extern uint8_t uart_forwarding_flags_hart1;
extern uint8_t uart_forwarding_flags_hart2;
extern uint8_t uart_forwarding_flags_ble1;
extern uint8_t uart_forwarding_flags_ble2;
#define ARRAY_LEN(arr) (sizeof(arr)) / (sizeof(arr[0])) #define ARRAY_LEN(arr) (sizeof(arr)) / (sizeof(arr[0]))
typedef struct typedef struct
{ {

View File

@ -64,6 +64,7 @@ osThreadId dac_taskHandle;
osThreadId adc_taskHandle; osThreadId adc_taskHandle;
osThreadId gpio_di_do_taskHandle; osThreadId gpio_di_do_taskHandle;
osThreadId ec11_taskHandle; osThreadId ec11_taskHandle;
osThreadId uart_forwardingHandle;
/* Private function prototypes -----------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */ /* USER CODE BEGIN FunctionPrototypes */
@ -86,6 +87,7 @@ void start_dac_task(void const * argument);
void start_adc_task(void const *argument); void start_adc_task(void const *argument);
void start_gpio_di_do_task(void const *argument); void start_gpio_di_do_task(void const *argument);
void start_ec11_task(void const *argument); void start_ec11_task(void const *argument);
void start_uart_forwarding(void const *argument);
extern void MX_LWIP_Init(void); extern void MX_LWIP_Init(void);
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
@ -111,7 +113,8 @@ void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, StackTyp
* @param None * @param None
* @retval None * @retval None
*/ */
void MX_FREERTOS_Init(void) { void MX_FREERTOS_Init(void)
{
/* USER CODE BEGIN Init */ /* USER CODE BEGIN Init */
/* USER CODE END Init */ /* USER CODE END Init */
@ -157,10 +160,13 @@ void MX_FREERTOS_Init(void) {
osThreadDef(ec11_task, start_ec11_task, osPriorityNormal, 0, 512); osThreadDef(ec11_task, start_ec11_task, osPriorityNormal, 0, 512);
ec11_taskHandle = osThreadCreate(osThread(ec11_task), NULL); ec11_taskHandle = osThreadCreate(osThread(ec11_task), NULL);
/* definition and creation of uart_forwarding */
osThreadDef(uart_forwarding, start_uart_forwarding, osPriorityRealtime, 0, 512);
uart_forwardingHandle = osThreadCreate(osThread(uart_forwarding), NULL);
/* USER CODE BEGIN RTOS_THREADS */ /* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */ /* add threads, ... */
/* USER CODE END RTOS_THREADS */ /* USER CODE END RTOS_THREADS */
} }
/* USER CODE BEGIN Header_start_tcp_task */ /* USER CODE BEGIN Header_start_tcp_task */
@ -272,7 +278,7 @@ void start_dac_task(void const * argument)
/* Infinite loop */ /* Infinite loop */
for (;;) for (;;)
{ {
osThreadSuspend(adc_taskHandle); // 暂停ADC任务防止DAC采集时产生干<E7949F><EFBFBD>????????,因为ADC和DAC采用的是同一路SPI但是时序不<EFBFBD><EFBFBD>???????? osThreadSuspend(adc_taskHandle); // 暂停ADC任务防止DAC采集时产生干<E7949F>????????,因为ADC和DAC采用的是同一路SPI但是时序不<E5BA8F>????????
dac161s997_output(DAC161S997_1, current_buff[0]); dac161s997_output(DAC161S997_1, current_buff[0]);
dac161s997_output(DAC161S997_2, current_buff[1]); dac161s997_output(DAC161S997_2, current_buff[1]);
osThreadResume(adc_taskHandle); osThreadResume(adc_taskHandle);
@ -295,7 +301,7 @@ void start_adc_task(void const * argument)
/* Infinite loop */ /* Infinite loop */
for (;;) for (;;)
{ {
osThreadSuspend(dac_taskHandle); // 暂停DAC任务防止ADC采集时产生干<E7949F><EFBFBD>????????,因为ADC和DAC采用的是同一路SPI但是时序不<EFBFBD><EFBFBD>???????? osThreadSuspend(dac_taskHandle); // 暂停DAC任务防止ADC采集时产生干<E7949F>????????,因为ADC和DAC采用的是同一路SPI但是时序不<E5BA8F>????????
uint8_t ch = 0; uint8_t ch = 0;
for (ch = STOP_NC_ADC; ch < AD7124_CHANNEL_EN_MAX; ch++) for (ch = STOP_NC_ADC; ch < AD7124_CHANNEL_EN_MAX; ch++)
{ {
@ -347,6 +353,25 @@ void start_ec11_task(void const * argument)
/* USER CODE END start_ec11_task */ /* USER CODE END start_ec11_task */
} }
/* USER CODE BEGIN Header_start_uart_forwarding */
/**
* @brief Function implementing the uart_forwarding thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_start_uart_forwarding */
void start_uart_forwarding(void const *argument)
{
/* USER CODE BEGIN start_uart_forwarding */
/* Infinite loop */
for (;;)
{
uart_forwarding_tcp();
vTaskDelay(10);
}
/* USER CODE END start_uart_forwarding */
}
/* Private application code --------------------------------------------------*/ /* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */ /* USER CODE BEGIN Application */

View File

@ -82,11 +82,10 @@ uint8_t tcp_echo_flags_ble2 = 0;
uint8_t tcp_echo_flags_control = 0; uint8_t tcp_echo_flags_control = 0;
uint8_t send_data_flag_cmd = 0; uint8_t send_data_flag_cmd = 0;
// TEST uint8_t uart_forwarding_flags_hart1 = 0;
// uint8_t data_flag = 0; uint8_t uart_forwarding_flags_hart2 = 0;
// uint32_t receive_times1 = 0; uint8_t uart_forwarding_flags_ble1 = 0;
// uint32_t receive_times2 = 0; uint8_t uart_forwarding_flags_ble2 = 0;
// ENDTEST
extern struct netif gnetif; extern struct netif gnetif;
extern ip4_addr_t ipaddr; extern ip4_addr_t ipaddr;
@ -202,8 +201,7 @@ void SystemClock_Config(void)
/** Initializes the CPU, AHB and APB buses clocks /** Initializes the CPU, AHB and APB buses clocks
*/ */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
@ -272,7 +270,8 @@ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
memcpy(ble1_uart6.rx_data, ble1_uart6.rx_data_temp, Size); memcpy(ble1_uart6.rx_data, ble1_uart6.rx_data_temp, Size);
if (tcp_echo_flags_ble1 == 1) if (tcp_echo_flags_ble1 == 1)
{ {
user_send_data_ble1(ble1_uart6.rx_data, Size); uart_forwarding_flags_ble1 = 1;
// user_send_data_ble1(ble1_uart6.rx_data, Size);
} }
HAL_UARTEx_ReceiveToIdle_DMA(&huart6, ble1_uart6.rx_data_temp, ARRAY_LEN(ble1_uart6.rx_data_temp)); HAL_UARTEx_ReceiveToIdle_DMA(&huart6, ble1_uart6.rx_data_temp, ARRAY_LEN(ble1_uart6.rx_data_temp));
} }
@ -285,7 +284,8 @@ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
memcpy(ble2_uart3.rx_data, ble2_uart3.rx_data_temp, Size); memcpy(ble2_uart3.rx_data, ble2_uart3.rx_data_temp, Size);
if (tcp_echo_flags_ble2 == 1) if (tcp_echo_flags_ble2 == 1)
{ {
user_send_data_ble2(ble2_uart3.rx_data, Size); uart_forwarding_flags_ble2 = 1;
// user_send_data_ble2(ble2_uart3.rx_data, Size);
} }
HAL_UARTEx_ReceiveToIdle_DMA(&huart3, ble2_uart3.rx_data_temp, ARRAY_LEN(ble2_uart3.rx_data_temp)); HAL_UARTEx_ReceiveToIdle_DMA(&huart3, ble2_uart3.rx_data_temp, ARRAY_LEN(ble2_uart3.rx_data_temp));
} }
@ -297,7 +297,8 @@ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
memcpy(hart1_uart5.rx_data, hart1_uart5.rx_data_temp, Size); memcpy(hart1_uart5.rx_data, hart1_uart5.rx_data_temp, Size);
if (tcp_echo_flags_hart1 == 1) if (tcp_echo_flags_hart1 == 1)
{ {
user_send_data_hart1(hart1_uart5.rx_data, Size); uart_forwarding_flags_hart1 = 1;
// user_send_data_hart1(hart1_uart5.rx_data, Size);
} }
HAL_UARTEx_ReceiveToIdle_DMA(&huart5, hart1_uart5.rx_data_temp, ARRAY_LEN(hart1_uart5.rx_data_temp)); HAL_UARTEx_ReceiveToIdle_DMA(&huart5, hart1_uart5.rx_data_temp, ARRAY_LEN(hart1_uart5.rx_data_temp));
memset(hart1_uart5.rx_data_temp, 0, ARRAY_LEN(hart1_uart5.rx_data_temp)); memset(hart1_uart5.rx_data_temp, 0, ARRAY_LEN(hart1_uart5.rx_data_temp));
@ -310,7 +311,8 @@ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
memcpy(hart2_uart2.rx_data, hart2_uart2.rx_data_temp, Size); memcpy(hart2_uart2.rx_data, hart2_uart2.rx_data_temp, Size);
if (tcp_echo_flags_hart2 == 1) if (tcp_echo_flags_hart2 == 1)
{ {
user_send_data_hart2(hart2_uart2.rx_data, Size); uart_forwarding_flags_hart2 = 1;
// user_send_data_hart2(hart2_uart2.rx_data, Size);
} }
HAL_UARTEx_ReceiveToIdle_DMA(&huart2, hart2_uart2.rx_data_temp, ARRAY_LEN(hart2_uart2.rx_data_temp)); HAL_UARTEx_ReceiveToIdle_DMA(&huart2, hart2_uart2.rx_data_temp, ARRAY_LEN(hart2_uart2.rx_data_temp));
} }
@ -368,7 +370,8 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
/* USER CODE BEGIN Callback 0 */ /* USER CODE BEGIN Callback 0 */
/* USER CODE END Callback 0 */ /* USER CODE END Callback 0 */
if (htim->Instance == TIM4) { if (htim->Instance == TIM4)
{
HAL_IncTick(); HAL_IncTick();
} }
/* USER CODE BEGIN Callback 1 */ /* USER CODE BEGIN Callback 1 */

View File

@ -220,3 +220,4 @@ u32_t sio_tryread(sio_fd_t fd, u8_t *data, u32_t len)
return recved_bytes; return recved_bytes;
} }
#endif /* MDK ARM Compiler */ #endif /* MDK ARM Compiler */

View File

@ -315,6 +315,7 @@ static void low_level_init(struct netif *netif)
/* USER CODE END PHY_POST_CONFIG */ /* USER CODE END PHY_POST_CONFIG */
} }
} }
else else
{ {
@ -460,6 +461,7 @@ static err_t low_level_output_arp_off(struct netif *netif, struct pbuf *q, const
/* USER CODE END 5 */ /* USER CODE END 5 */
return errval; return errval;
} }
#endif /* LWIP_ARP */ #endif /* LWIP_ARP */
@ -872,3 +874,4 @@ void HAL_ETH_TxFreeCallback(uint32_t *buff)
/* USER CODE BEGIN 8 */ /* USER CODE BEGIN 8 */
/* USER CODE END 8 */ /* USER CODE END 8 */

View File

@ -16,8 +16,8 @@
<TargetCommonOption> <TargetCommonOption>
<Device>STM32F407VGTx</Device> <Device>STM32F407VGTx</Device>
<Vendor>STMicroelectronics</Vendor> <Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32F4xx_DFP.2.16.0</PackID> <PackID>Keil.STM32F4xx_DFP.2.12.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL> <PackURL>http://www.keil.com/pack</PackURL>
<Cpu>IRAM(0x20000000-0x2001BFFF) IRAM2(0x2001C000-0x2001FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) FPU2 CPUTYPE("Cortex-M4") TZ</Cpu> <Cpu>IRAM(0x20000000-0x2001BFFF) IRAM2(0x2001C000-0x2001FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) FPU2 CPUTYPE("Cortex-M4") TZ</Cpu>
<FlashUtilSpec></FlashUtilSpec> <FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile> <StartupFile></StartupFile>
@ -186,7 +186,6 @@
<RvdsVP>2</RvdsVP> <RvdsVP>2</RvdsVP>
<RvdsMve>0</RvdsMve> <RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp> <RvdsCdeCp>0</RvdsCdeCp>
<nBranchProt>0</nBranchProt>
<hadIRAM2>1</hadIRAM2> <hadIRAM2>1</hadIRAM2>
<hadIROM2>0</hadIROM2> <hadIROM2>0</hadIROM2>
<StupSel>8</StupSel> <StupSel>8</StupSel>

View File

@ -1,3 +1,11 @@
/*
* @Author: wangxujie 390834610@qq.com
* @Date: 2025-02-19 08:33:14
* @LastEditors: wangxujie 390834610@qq.com
* @LastEditTime: 2025-04-18 13:36:18
* @FilePath: \Semi-finished product testing\User\application\inc\tcpserverc.h
* @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
#ifndef _TCPECHO_H_ #ifndef _TCPECHO_H_
#define _TCPECHO_H_ #define _TCPECHO_H_
@ -15,4 +23,5 @@ extern void user_send_data_hart2(uint8_t *data, uint16_t len);
extern void user_send_data_ble1(uint8_t *data, uint16_t len); extern void user_send_data_ble1(uint8_t *data, uint16_t len);
extern void user_send_data_ble2(uint8_t *data, uint16_t len); extern void user_send_data_ble2(uint8_t *data, uint16_t len);
extern void user_send_data_control(uint8_t *data, uint16_t len); extern void user_send_data_control(uint8_t *data, uint16_t len);
extern void uart_forwarding_tcp(void);
#endif #endif

View File

@ -34,6 +34,10 @@ extern uint8_t tcp_echo_flags_ble2;
extern uint8_t tcp_echo_flags_control; extern uint8_t tcp_echo_flags_control;
extern uint8_t send_data_flag_cmd; extern uint8_t send_data_flag_cmd;
extern uint8_t uart_forwarding_flags_hart1;
extern uint8_t uart_forwarding_flags_hart2;
extern uint8_t uart_forwarding_flags_ble1;
extern uint8_t uart_forwarding_flags_ble2;
/*接收回调函数*/ /*接收回调函数*/
static err_t tcpecho_recv_hart1(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) static err_t tcpecho_recv_hart1(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{ // 对应接收数据连接的控制块 接收到的数据 { // 对应接收数据连接的控制块 接收到的数据
@ -365,6 +369,32 @@ void user_send_data_ble2(uint8_t *data, uint16_t len)
void user_send_data_control(uint8_t *data, uint16_t len) void user_send_data_control(uint8_t *data, uint16_t len)
{ {
tcp_write(server_pcb_control, data, len, 1); tcp_write(server_pcb_control, data, len, 1);
} }
void uart_forwarding_tcp(void)
{
if (uart_forwarding_flags_hart1 == 1)
{
user_send_data_hart1(hart1_uart5.rx_data, hart1_uart5.rx_num);
uart_forwarding_flags_hart1 = 0;
}
if (uart_forwarding_flags_hart2 == 1)
{
user_send_data_hart2(hart2_uart2.rx_data, hart2_uart2.rx_num);
uart_forwarding_flags_hart2 = 0;
}
#if (BLE2_USART6 == 1)
if (uart_forwarding_flags_ble1 == 1)
{
user_send_data_ble1(ble1_uart6.rx_data, ble1_uart6.rx_num);
uart_forwarding_flags_ble1 = 0;
}
#endif
if (uart_forwarding_flags_ble2 == 1)
{
user_send_data_ble2(ble2_uart3.rx_data, ble2_uart3.rx_num);
uart_forwarding_flags_ble2 = 0;
}
}

View File

@ -0,0 +1,70 @@
# 开发环境说明
## 1. 硬件平台
- 主控芯片STM32F407xx系列ARM Cortex-M4F内核
- 外设芯片:
- ADCAD7124-8高精度模拟量输入
- DACDAC161S997高精度模拟量输出
- 以太网LAN8742网络通信
- LCD串口显示屏
- 编码器接口
## 2. 开发工具
### 主要IDE
- Keil MDK-ARM (MDK-ARM目录存在)
- 项目文件semi-finished_product_testing.uvprojx
- 编译配置semi-finished_product_testing.uvoptx
- Visual Studio Code (存在.vscode配置目录)
- 用于代码编辑和查看
### 编译工具
- ARMCC编译器 (ARM编译工具链)
- 启动文件startup_stm32f407xx.s
## 3. 软件框架
### 操作系统
- FreeRTOS实时操作系统
- 版本位于Middlewares/Third_Party/FreeRTOS/Source/
- 配置文件FreeRTOSConfig.h
### 驱动库
- STM32 HAL库 (Hardware Abstraction Layer)
- 位置Drivers/STM32F4xx_HAL_Driver/
- 包含各种外设驱动
### 网络协议栈
- LwIP (Lightweight IP)
- 位置Middlewares/Third_Party/LwIP/
- 支持TCP/IP协议
- MQTT支持
### BSP支持
- LAN8742网络驱动
- 位置Drivers/BSP/Components/lan8742/
## 4. 项目结构
```
项目主要目录:
├── Core/ # 核心应用代码
├── Drivers/ # 驱动程序
├── LWIP/ # 网络协议栈
├── MDK-ARM/ # Keil工程文件
└── Middlewares/ # 中间件(FreeRTOS/LwIP)
```
## 5. 开发规范
- 基于HAL库的驱动开发
- FreeRTOS多任务架构
- 模块化的设计结构
- 标准C语言开发规范
## 6. 调试方式
- ST-Link/J-Link调试器支持
- 串口调试
- 以太网远程调试
## 7. 项目文档
位于Documents/目录:
- 数据手册 (datasheet/)
- 项目文档 (project documents/)
- 原理图 (schematic diagram/)

View File

@ -117,7 +117,7 @@ ETH.IPParameters=MediaInterface
ETH.MediaInterface=HAL_ETH_RMII_MODE ETH.MediaInterface=HAL_ETH_RMII_MODE
FREERTOS.FootprintOK=true FREERTOS.FootprintOK=true
FREERTOS.IPParameters=Tasks01,configMAX_TASK_NAME_LEN,configENABLE_FPU,configMAX_PRIORITIES,FootprintOK FREERTOS.IPParameters=Tasks01,configMAX_TASK_NAME_LEN,configENABLE_FPU,configMAX_PRIORITIES,FootprintOK
FREERTOS.Tasks01=lwip_task,2,512,start_tcp_task,Default,NULL,Dynamic,NULL,NULL;led_task,-2,128,start_led_toggle_task,Default,NULL,Dynamic,NULL,NULL;dac_task,0,512,start_dac_task,Default,NULL,Dynamic,NULL,NULL;adc_task,-1,128,start_adc_task,Default,NULL,Dynamic,NULL,NULL;gpio_di_do_task,0,128,start_gpio_di_do_task,Default,NULL,Dynamic,NULL,NULL;ec11_task,0,512,start_ec11_task,Default,NULL,Dynamic,NULL,NULL FREERTOS.Tasks01=lwip_task,2,512,start_tcp_task,Default,NULL,Dynamic,NULL,NULL;led_task,-2,128,start_led_toggle_task,Default,NULL,Dynamic,NULL,NULL;dac_task,0,512,start_dac_task,Default,NULL,Dynamic,NULL,NULL;adc_task,-1,128,start_adc_task,Default,NULL,Dynamic,NULL,NULL;gpio_di_do_task,0,128,start_gpio_di_do_task,Default,NULL,Dynamic,NULL,NULL;ec11_task,0,512,start_ec11_task,Default,NULL,Dynamic,NULL,NULL;uart_forwarding,3,512,start_uart_forwarding,Default,NULL,Dynamic,NULL,NULL
FREERTOS.configENABLE_FPU=1 FREERTOS.configENABLE_FPU=1
FREERTOS.configMAX_PRIORITIES=32 FREERTOS.configMAX_PRIORITIES=32
FREERTOS.configMAX_TASK_NAME_LEN=24 FREERTOS.configMAX_TASK_NAME_LEN=24

55
simple_flow_chart.md Normal file
View File

@ -0,0 +1,55 @@
```mermaid
graph TB
%% 主要流程
Start[系统启动] --> Init[系统初始化]
Init --> Tasks[任务创建]
%% 主要任务分支
Tasks --> Network[网络通信]
Tasks --> DataAcq[数据采集]
Tasks --> DataOut[数据输出]
Tasks --> UserInterface[人机交互]
%% 网络通信详细
Network --> |TCP/IP|RemoteControl[远程控制]
RemoteControl --> |命令|CommandProcess[命令处理]
RemoteControl --> |数据|DataUpload[数据上传]
%% 数据采集详细
DataAcq --> |ADC|AnalogIn[模拟量输入]
DataAcq --> |GPIO|DigitalIn[数字量输入]
AnalogIn --> DataProcess[数据处理]
DigitalIn --> DataProcess
%% 数据输出详细
DataOut --> |DAC|AnalogOut[模拟量输出]
DataOut --> |GPIO|DigitalOut[数字量输出]
CommandProcess --> DataOut
%% 人机交互详细
UserInterface --> |LCD|Display[状态显示]
UserInterface --> |编码器|LocalControl[本地控制]
LocalControl --> DataOut
DataProcess --> Display
%% 通信协议
subgraph 通信协议
HART[HART协议]
BLE[蓝牙通信]
TCP[TCP/IP]
end
%% 硬件接口
subgraph 硬件接口
ADC[AD7124]
DAC[DAC161S997]
DIO[数字IO]
LCD[串口LCD]
ETH[以太网]
Encoder[编码器]
end
%% 数据流向
DataProcess --> |测量数据|DataUpload
CommandProcess --> |控制命令|DataOut
```