diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 56f090b..d02e0b8 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -101,10 +101,9 @@ extern "C" /* USER CODE END EFP */ /* Private defines -----------------------------------------------------------*/ -#define DI_CH5_Pin GPIO_PIN_2 -#define DI_CH5_GPIO_Port GPIOE -#define DI_CH6_Pin GPIO_PIN_3 -#define DI_CH6_GPIO_Port GPIOE +#define TCA6416_IIC3_SCL GPIO_PIN_2 +#define TCA6416_IIC3_SDA GPIO_PIN_3 +#define TCA6416_IIC3_GPIO_Port GPIOE #define ETH_RESET_Pin GPIO_PIN_0 #define ETH_RESET_GPIO_Port GPIOC #define T3_CH3_BUZZER_Pin GPIO_PIN_0 diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index 4a4763c..b4c75f9 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -33,6 +33,7 @@ #include "gpio.h" #include "tcpserverc.h" #include "lwip.h" +#include "lwip/tcp.h" // 添加TCP相关定义 #include "uart_lcd.h" #include "user_gpio.h" #include "linear_encoder.h" @@ -71,6 +72,13 @@ osThreadId ec11_taskHandle; osThreadId ad7124_test_taskHandle; osThreadId usart6_test_taskHandle; // 添加USART6测试任务句柄 +// 添加调试变量 +static volatile uint32_t uart6_dr_raw = 0; // UART数据寄存器的原始值 +static volatile uint8_t uart6_data_bits = 0; // 数据位(8位) +static volatile uint8_t uart6_parity_bit = 0; // 校验位 +static volatile uint8_t uart6_stop_bits = 0; // 停止位 +static volatile uint8_t uart6_error_flags = 0; // 错误标志 + // 添加RTS引脚监控变量 volatile GPIO_PinState rts_pin_state = GPIO_PIN_RESET; // RTS引脚当前状态 volatile GPIO_PinState rst_pin_state = GPIO_PIN_RESET; // RTS引脚当前状态 @@ -186,8 +194,8 @@ void MX_FREERTOS_Init(void) // ad7124_test_taskHandle = osThreadCreate(osThread(ad7124_test_task), NULL); /* HART测试任务 */ - // osThreadDef(usart6_test_task, start_usart6_test_task, osPriorityNormal, 0, 128); - // usart6_test_taskHandle = osThreadCreate(osThread(usart6_test_task), NULL); + osThreadDef(usart6_test_task, start_usart6_test_task, osPriorityNormal, 0, 128); + usart6_test_taskHandle = osThreadCreate(osThread(usart6_test_task), NULL); /* USER CODE BEGIN RTOS_THREADS */ /* add threads, ... */ @@ -437,8 +445,7 @@ void start_usart6_test_task(void const *argument) { /* USER CODE BEGIN start_usart6_test_task */ uint8_t rx_buffer[1]; // 接收缓冲区 - uint8_t tcp_tx_data[300] = {0}; // TCP发送缓冲区 - uint16_t tx_data_len = 0; + err_t err; // 确保UART6已正确初始化 if (huart6.Instance == NULL) { @@ -454,6 +461,13 @@ void start_usart6_test_task(void const *argument) huart6.Init.Mode = UART_MODE_TX_RX; huart6.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart6.Init.OverSampling = UART_OVERSAMPLING_16; + + // 清除所有标志位 + __HAL_UART_CLEAR_FLAG(&huart6, UART_FLAG_RXNE); + __HAL_UART_CLEAR_FLAG(&huart6, UART_FLAG_PE); + __HAL_UART_CLEAR_FLAG(&huart6, UART_FLAG_FE); + __HAL_UART_CLEAR_FLAG(&huart6, UART_FLAG_ORE); + if (HAL_UART_Init(&huart6) != HAL_OK) { Error_Handler(); } @@ -461,43 +475,66 @@ void start_usart6_test_task(void const *argument) /* Infinite loop */ for(;;) { - // 使用HAL库函数检查接收状态 - if (HAL_UART_GetState(&huart6) == HAL_UART_STATE_READY) + // 直接检查接收标志 + if (__HAL_UART_GET_FLAG(&huart6, UART_FLAG_RXNE)) { - // 尝试接收一个字节,超时时间设为0 - if (HAL_UART_Receive(&huart6, rx_buffer, 1, 0) == HAL_OK) + // 读取数据寄存器的原始值 + uart6_dr_raw = huart6.Instance->DR; + + // 解析数据寄存器的各个位 + uart6_data_bits = (uint8_t)(uart6_dr_raw & 0xFF); // 低8位是数据位 + uart6_parity_bit = (uint8_t)((uart6_dr_raw >> 8) & 0x1); // 第9位是校验位 + uart6_stop_bits = (uint8_t)((uart6_dr_raw >> 9) & 0x3); // 第10-11位是停止位 + + // 存储错误标志 + uart6_error_flags = 0; + if (__HAL_UART_GET_FLAG(&huart6, UART_FLAG_PE)) uart6_error_flags |= 0x01; + if (__HAL_UART_GET_FLAG(&huart6, UART_FLAG_FE)) uart6_error_flags |= 0x02; + if (__HAL_UART_GET_FLAG(&huart6, UART_FLAG_ORE)) uart6_error_flags |= 0x04; + + // 使用数据位作为接收数据 + rx_buffer[0] = uart6_data_bits; + + // 检查是否有接收错误 + if (uart6_error_flags == 0) { // 检查TCP连接状态 if (server_pcb_control != NULL && tcp_echo_flags_control == 1) { - // 构造帧头等 - tcp_tx_data[0] = 0xD5; // 帧头1 - tcp_tx_data[1] = 0xC8; // 帧头2 - tcp_tx_data[2] = 0x00; // 帧长度高字节 (1 + 11 = 12) - tcp_tx_data[3] = 0x0C; // 帧长度低字节 - tcp_tx_data[4] = 0x01; // 源地址高 - tcp_tx_data[5] = 0x02; // 源地址低 - tcp_tx_data[6] = 0x0A; // 目标地址高 - tcp_tx_data[7] = 0x0B; // 目标地址低 - tcp_tx_data[8] = 0x88; // 报文类型(透传) - - // 复制接收到的数据 - tcp_tx_data[9] = rx_buffer[0]; - - // 计算校验和 - uint16_t checksum = 0; - for (int i = 4; i < 10; i++) + // 尝试发送数据 + err = tcp_write(server_pcb_control, rx_buffer, 1, 1); + if (err == ERR_OK) { - checksum += tcp_tx_data[i]; + err = tcp_output(server_pcb_control); + if (err != ERR_OK) + { + // TCP输出失败,可能需要重新建立连接 + tcp_abort(server_pcb_control); + server_pcb_control = NULL; + tcp_echo_flags_control = 0; + } + } + else if (err == ERR_MEM) + { + // 内存不足,等待一段时间后重试 + vTaskDelay(10); + } + else + { + // 其他错误,关闭连接 + tcp_abort(server_pcb_control); + server_pcb_control = NULL; + tcp_echo_flags_control = 0; } - tcp_tx_data[10] = 0x00; // 校验和高字节 - tcp_tx_data[11] = checksum & 0xFF; // 校验和低字节 - - // 发送数据 - tx_data_len = 12; // 总长度 = 数据长度(1) + 帧头(2) + 帧长(2) + 源地址(2) + 目标地址(2) + 类型(1) + 校验(2) - user_send_data_control(tcp_tx_data, tx_data_len); } } + else + { + // 清除错误标志 + __HAL_UART_CLEAR_FLAG(&huart6, UART_FLAG_PE); + __HAL_UART_CLEAR_FLAG(&huart6, UART_FLAG_FE); + __HAL_UART_CLEAR_FLAG(&huart6, UART_FLAG_ORE); + } } vTaskDelay(1); // 给其他任务执行的机会 diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c index 569d26e..0ff8448 100644 --- a/Core/Src/gpio.c +++ b/Core/Src/gpio.c @@ -73,10 +73,10 @@ void MX_GPIO_Init(void) //HAL_GPIO_WritePin(HART1_RST_GPIO_Port, HART1_RST_Pin, GPIO_PIN_SET); /*Configure GPIO pins : PEPin PEPin */ - GPIO_InitStruct.Pin = DI_CH5_Pin|DI_CH6_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_PULLUP; - HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); +// GPIO_InitStruct.Pin = DI_CH5_Pin|DI_CH6_Pin; +// GPIO_InitStruct.Mode = GPIO_MODE_INPUT; +// GPIO_InitStruct.Pull = GPIO_PULLUP; +// HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /*Configure GPIO pin : PtPin */ GPIO_InitStruct.Pin = ETH_RESET_Pin; @@ -260,10 +260,10 @@ GPIO_PinState gpio_di_test(uint8_t gpio_num) state = HAL_GPIO_ReadPin(DI_CH4_GPIO_Port, DI_CH4_Pin); break; case DI_5: - state = HAL_GPIO_ReadPin(DI_CH5_GPIO_Port, DI_CH5_Pin); + //state = HAL_GPIO_ReadPin(DI_CH5_GPIO_Port, DI_CH5_Pin); break; case DI_6: - state = HAL_GPIO_ReadPin(DI_CH6_GPIO_Port, DI_CH6_Pin); + //state = HAL_GPIO_ReadPin(DI_CH6_GPIO_Port, DI_CH6_Pin); break; default: state = GPIO_PIN_RESET; diff --git a/MDK-ARM/controller_pcba.uvoptx b/MDK-ARM/controller_pcba.uvoptx index 54e41ff..0061ec1 100644 --- a/MDK-ARM/controller_pcba.uvoptx +++ b/MDK-ARM/controller_pcba.uvoptx @@ -235,6 +235,36 @@ 1 rst_pin_state + + 17 + 1 + uart6_raw_data,0x10 + + + 18 + 1 + uart6_full_data + + + 19 + 1 + uart6_dr_raw + + + 20 + 1 + uart6_data_bits + + + 21 + 1 + uart6_parity_bit + + + 22 + 1 + uart6_stop_bits + 0 diff --git a/Public/HT1200.pdf b/Public/HT1200.pdf new file mode 100644 index 0000000..c2bcb66 Binary files /dev/null and b/Public/HT1200.pdf differ