From 8a63ec1d44ca70468b87c1110362ff8342edfa56 Mon Sep 17 00:00:00 2001 From: "haifeng.wang" Date: Wed, 7 May 2025 10:50:40 +0800 Subject: [PATCH] www --- Anjiehui7_DTU/Src/main.c | 18 +++++- Anjiehui7_DTU/User/dwin_form.c | 4 +- Anjiehui7_DTU/User/modbus_slave.c | 100 +++++++++--------------------- Anjiehui7_DTU/User/modbus_slave.h | 2 +- 4 files changed, 49 insertions(+), 75 deletions(-) diff --git a/Anjiehui7_DTU/Src/main.c b/Anjiehui7_DTU/Src/main.c index 3f3b345..f589aa7 100644 --- a/Anjiehui7_DTU/Src/main.c +++ b/Anjiehui7_DTU/Src/main.c @@ -564,11 +564,11 @@ static void MX_UART4_Init(void) LL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* UART4 interrupt Init */ -// NVIC_SetPriority(UART4_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0)); -// NVIC_EnableIRQ(UART4_IRQn); + NVIC_SetPriority(UART4_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0)); + NVIC_EnableIRQ(UART4_IRQn); /* USER CODE BEGIN UART4_Init 1 */ - +huart4.RxISR = Slave_IRQHandler; /* USER CODE END UART4_Init 1 */ USART_InitStruct.BaudRate = 9600; USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; @@ -579,9 +579,21 @@ static void MX_UART4_Init(void) USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16; LL_USART_Init(UART4, &USART_InitStruct); LL_USART_ConfigAsyncMode(UART4); + + // LL_USART_EnableDEMode(USART3); +// LL_USART_SetDESignalPolarity(USART3, LL_USART_DE_POLARITY_HIGH); +// LL_USART_SetDEAssertionTime(USART3, 0); +// LL_USART_SetDEDeassertionTime(USART3, 0); +// LL_USART_ConfigAsyncMode(USART3); + SET_BIT(UART4->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE); + LL_USART_Enable(UART4); /* USER CODE BEGIN UART4_Init 2 */ +// LL_USART_Init(USART3, &USART_InitStruct); + + +// LL_USART_Enable(USART3); /* USER CODE END UART4_Init 2 */ } diff --git a/Anjiehui7_DTU/User/dwin_form.c b/Anjiehui7_DTU/User/dwin_form.c index 8323c17..6dba7e9 100644 --- a/Anjiehui7_DTU/User/dwin_form.c +++ b/Anjiehui7_DTU/User/dwin_form.c @@ -671,8 +671,8 @@ void Form_Task(void *p_arg) data.oper = DWIN_OPER_WRITE; data.Addr = gridBox.hdrAddr; - sprintf(data.str, " %11s %13s %11s %13s %11s %13s ", - " BOX ", " PSN "," BOX ", " PSN "," BOX ", " PSN "); + sprintf(data.str, " %11s %13s %11s %13s %11s %13s ", + "BOX ", "PSN "," BOX ", "PSN "," BOX ", "PSN "); data.count = strlen(data.str); DWIN_Refresh(&data); diff --git a/Anjiehui7_DTU/User/modbus_slave.c b/Anjiehui7_DTU/User/modbus_slave.c index 8979b4c..3b0095b 100644 --- a/Anjiehui7_DTU/User/modbus_slave.c +++ b/Anjiehui7_DTU/User/modbus_slave.c @@ -153,24 +153,24 @@ void Modbus_Task(void *p_arg) // 处理modbus rtu命令(已经验证过长度和CRC的包) void MODBUS_RTU_CMD(modbus_request_t *req) { -// static uint8_t BUFF[(MODBUS_LAST_REG - MODBUS_1ST_REG + 1) * 2 + 6]; // 响应包 -// uint8_t err = 0; // 错误代码 -// uint8_t len = 0; // 发送数据长度 + static uint8_t BUFF[100]; // 响应包 + uint8_t err = 0; // 错误代码 + uint8_t len = 0; // 发送数据长度 -// uint16_t id; // 通信地址 -// uint16_t reg; // 数据地址 -// uint16_t cnt; // 数据个数 -// uint16_t crc; + uint16_t id; // 通信地址 + uint16_t reg; // 数据地址 + uint16_t cnt; // 数据个数 + uint16_t crc; -// // 检查通信地址 -// if(req->id != dcBuff.configBottle.addr && req->id != 0) -// return; -// -// // 清空发送帧 -// memset(BUFF, 0, sizeof(BUFF)); + // 检查通信地址 + if(req->id != dcBuff.configBottle.addr && req->id != 0) + return; + + // 清空发送帧 + memset(BUFF, 0, sizeof(BUFF)); -// BUFF[len++] = dcBuff.configBottle.addr; // 从机地址 -// BUFF[len++] = req->cmd; // 命令代码 + BUFF[len++] = dcBuff.configBottle.addr; // 从机地址 + BUFF[len++] = req->cmd; // 命令代码 // reg = ntohs(req->reg); // 数据寄存器 // if(req->cmd == 0x03 || req->cmd == 0x06) @@ -180,10 +180,10 @@ void MODBUS_RTU_CMD(modbus_request_t *req) // else // err = MODBUS_ERR_ILF; // 无效功能码 // -// if(err == 0) -// { -// if(req->cmd == 0x03) // 读保持数据 -// { + if(err == 0) + { + if(req->cmd == 0x03) // 读保持数据 + { // cnt = ntohs(req->cnt); // 参数个数 // if(reg != MODBUS_ADR_REG || cnt != 1) // err = MODBUS_ERR_NAK; // 命令无法执行 @@ -195,46 +195,8 @@ void MODBUS_RTU_CMD(modbus_request_t *req) // memmove(BUFF + len, (uint8_t *) &id, 2); // len += 2; // } -// } -// else if(req->cmd == 0x06) // 设置数据 -// { -// if(reg != MODBUS_ADR_REG) -// err = MODBUS_ERR_NAK; // 命令无法执行 -// else -// { -// id = ntohs(req->data); - -// if(id < 1 || id > 247) -// err = MODBUS_ERR_ILD; // 无效数据值 -// else -// { -// // 设置地址并保存 -// dcBuff.configBottle.addr = id; -// Config_SaveConfig(); -// -// BUFF[0] = id; // 新地址 -// memmove(BUFF + len, &req->reg, 4); // 数据地址和通讯地址 -// len += 4; -// } -// } -// } -// else if(req->cmd == 0x04) // 读输入数据 -// { -// cnt = ntohs(req->cnt); // 参数个数 -// if(reg < MODBUS_1ST_REG || reg > MODBUS_LAST_REG || cnt < 1 || reg + (cnt - 1) > MODBUS_LAST_REG) -// err = MODBUS_ERR_NAK; // 命令无法执行 -// else -// { -// // 用最新的采集数据刷新缓冲 -// if(!Fill_MODBUS_RTU_Buf()) -// return; -// -// BUFF[len++] = cnt * 2; // 数据长度 -// memmove(BUFF + len, MODBUS_RTU_Buf + (reg - MODBUS_1ST_REG) * 2, cnt * 2); -// len += cnt * 2; -// } -// } -// } + } + } // // if(err != 0) // { @@ -242,18 +204,18 @@ void MODBUS_RTU_CMD(modbus_request_t *req) // BUFF[len++] = err; // 错误代码 // } -// // 计算CRC -// crc = MODBUS_RTU_CRC16(BUFF, len); -// crc = htons(crc); + // 计算CRC + crc = MODBUS_RTU_CRC16(BUFF, len); + crc = htons(crc); -// memmove(BUFF + len, &crc, 2); -// len += 2; + memmove(BUFF + len, &crc, 2); + len += 2; -// if(req->id != 0) -// { -// // 发送应答 -// RS485_SendDataByte(BUFF, len); -// } + if(req->id != 0) + { + // 发送应答 + RS485_SendDataByte(BUFF, len); + } } // 任务主体 diff --git a/Anjiehui7_DTU/User/modbus_slave.h b/Anjiehui7_DTU/User/modbus_slave.h index 7e904d8..b818c2e 100644 --- a/Anjiehui7_DTU/User/modbus_slave.h +++ b/Anjiehui7_DTU/User/modbus_slave.h @@ -10,7 +10,7 @@ void Modbus_Open(); void Modbus_Task(void *p_arg); // Modbus(RS485接口)工作模式:单向发送,向上位机发送数据, 每30秒向上位机发送一个心跳。 - +void Slave_IRQHandler(USART_Handle *huart); // RF串口发送帧的循环缓冲 extern loopbuff_t Modbus_SendM; // RF串口接收的消息通知