HART下位机透传至上位机有数据但不对

This commit is contained in:
qiuxin 2025-05-23 19:00:07 +08:00
parent faa836cb94
commit 4de02310aa
5 changed files with 108 additions and 42 deletions

View File

@ -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

View File

@ -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); // 给其他任务执行的机会

View File

@ -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;

View File

@ -235,6 +235,36 @@
<WinNumber>1</WinNumber>
<ItemText>rst_pin_state</ItemText>
</Ww>
<Ww>
<count>17</count>
<WinNumber>1</WinNumber>
<ItemText>uart6_raw_data,0x10</ItemText>
</Ww>
<Ww>
<count>18</count>
<WinNumber>1</WinNumber>
<ItemText>uart6_full_data</ItemText>
</Ww>
<Ww>
<count>19</count>
<WinNumber>1</WinNumber>
<ItemText>uart6_dr_raw</ItemText>
</Ww>
<Ww>
<count>20</count>
<WinNumber>1</WinNumber>
<ItemText>uart6_data_bits</ItemText>
</Ww>
<Ww>
<count>21</count>
<WinNumber>1</WinNumber>
<ItemText>uart6_parity_bit</ItemText>
</Ww>
<Ww>
<count>22</count>
<WinNumber>1</WinNumber>
<ItemText>uart6_stop_bits</ItemText>
</Ww>
</WatchWindow1>
<Tracepoint>
<THDelay>0</THDelay>

BIN
Public/HT1200.pdf Normal file

Binary file not shown.