HART下位机透传至上位机有数据但不对
This commit is contained in:
parent
faa836cb94
commit
4de02310aa
|
@ -101,10 +101,9 @@ extern "C"
|
||||||
/* USER CODE END EFP */
|
/* USER CODE END EFP */
|
||||||
|
|
||||||
/* Private defines -----------------------------------------------------------*/
|
/* Private defines -----------------------------------------------------------*/
|
||||||
#define DI_CH5_Pin GPIO_PIN_2
|
#define TCA6416_IIC3_SCL GPIO_PIN_2
|
||||||
#define DI_CH5_GPIO_Port GPIOE
|
#define TCA6416_IIC3_SDA GPIO_PIN_3
|
||||||
#define DI_CH6_Pin GPIO_PIN_3
|
#define TCA6416_IIC3_GPIO_Port GPIOE
|
||||||
#define DI_CH6_GPIO_Port GPIOE
|
|
||||||
#define ETH_RESET_Pin GPIO_PIN_0
|
#define ETH_RESET_Pin GPIO_PIN_0
|
||||||
#define ETH_RESET_GPIO_Port GPIOC
|
#define ETH_RESET_GPIO_Port GPIOC
|
||||||
#define T3_CH3_BUZZER_Pin GPIO_PIN_0
|
#define T3_CH3_BUZZER_Pin GPIO_PIN_0
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include "gpio.h"
|
#include "gpio.h"
|
||||||
#include "tcpserverc.h"
|
#include "tcpserverc.h"
|
||||||
#include "lwip.h"
|
#include "lwip.h"
|
||||||
|
#include "lwip/tcp.h" // 添加TCP相关定义
|
||||||
#include "uart_lcd.h"
|
#include "uart_lcd.h"
|
||||||
#include "user_gpio.h"
|
#include "user_gpio.h"
|
||||||
#include "linear_encoder.h"
|
#include "linear_encoder.h"
|
||||||
|
@ -71,6 +72,13 @@ osThreadId ec11_taskHandle;
|
||||||
osThreadId ad7124_test_taskHandle;
|
osThreadId ad7124_test_taskHandle;
|
||||||
osThreadId usart6_test_taskHandle; // 添加USART6测试任务句柄
|
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引脚监控变量
|
// 添加RTS引脚监控变量
|
||||||
volatile GPIO_PinState rts_pin_state = GPIO_PIN_RESET; // RTS引脚当前状态
|
volatile GPIO_PinState rts_pin_state = GPIO_PIN_RESET; // RTS引脚当前状态
|
||||||
volatile GPIO_PinState rst_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);
|
// ad7124_test_taskHandle = osThreadCreate(osThread(ad7124_test_task), NULL);
|
||||||
|
|
||||||
/* HART测试任务 */
|
/* HART测试任务 */
|
||||||
// osThreadDef(usart6_test_task, start_usart6_test_task, osPriorityNormal, 0, 128);
|
osThreadDef(usart6_test_task, start_usart6_test_task, osPriorityNormal, 0, 128);
|
||||||
// usart6_test_taskHandle = osThreadCreate(osThread(usart6_test_task), NULL);
|
usart6_test_taskHandle = osThreadCreate(osThread(usart6_test_task), NULL);
|
||||||
|
|
||||||
/* USER CODE BEGIN RTOS_THREADS */
|
/* USER CODE BEGIN RTOS_THREADS */
|
||||||
/* add threads, ... */
|
/* add threads, ... */
|
||||||
|
@ -437,8 +445,7 @@ void start_usart6_test_task(void const *argument)
|
||||||
{
|
{
|
||||||
/* USER CODE BEGIN start_usart6_test_task */
|
/* USER CODE BEGIN start_usart6_test_task */
|
||||||
uint8_t rx_buffer[1]; // 接收缓冲区
|
uint8_t rx_buffer[1]; // 接收缓冲区
|
||||||
uint8_t tcp_tx_data[300] = {0}; // TCP发送缓冲区
|
err_t err;
|
||||||
uint16_t tx_data_len = 0;
|
|
||||||
|
|
||||||
// 确保UART6已正确初始化
|
// 确保UART6已正确初始化
|
||||||
if (huart6.Instance == NULL) {
|
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.Mode = UART_MODE_TX_RX;
|
||||||
huart6.Init.HwFlowCtl = UART_HWCONTROL_NONE;
|
huart6.Init.HwFlowCtl = UART_HWCONTROL_NONE;
|
||||||
huart6.Init.OverSampling = UART_OVERSAMPLING_16;
|
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) {
|
if (HAL_UART_Init(&huart6) != HAL_OK) {
|
||||||
Error_Handler();
|
Error_Handler();
|
||||||
}
|
}
|
||||||
|
@ -461,43 +475,66 @@ void start_usart6_test_task(void const *argument)
|
||||||
/* Infinite loop */
|
/* Infinite loop */
|
||||||
for(;;)
|
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连接状态
|
// 检查TCP连接状态
|
||||||
if (server_pcb_control != NULL && tcp_echo_flags_control == 1)
|
if (server_pcb_control != NULL && tcp_echo_flags_control == 1)
|
||||||
{
|
{
|
||||||
// 构造帧头等
|
// 尝试发送数据
|
||||||
tcp_tx_data[0] = 0xD5; // 帧头1
|
err = tcp_write(server_pcb_control, rx_buffer, 1, 1);
|
||||||
tcp_tx_data[1] = 0xC8; // 帧头2
|
if (err == ERR_OK)
|
||||||
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++)
|
|
||||||
{
|
{
|
||||||
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); // 给其他任务执行的机会
|
vTaskDelay(1); // 给其他任务执行的机会
|
||||||
|
|
|
@ -73,10 +73,10 @@ void MX_GPIO_Init(void)
|
||||||
//HAL_GPIO_WritePin(HART1_RST_GPIO_Port, HART1_RST_Pin, GPIO_PIN_SET);
|
//HAL_GPIO_WritePin(HART1_RST_GPIO_Port, HART1_RST_Pin, GPIO_PIN_SET);
|
||||||
|
|
||||||
/*Configure GPIO pins : PEPin PEPin */
|
/*Configure GPIO pins : PEPin PEPin */
|
||||||
GPIO_InitStruct.Pin = DI_CH5_Pin|DI_CH6_Pin;
|
// GPIO_InitStruct.Pin = DI_CH5_Pin|DI_CH6_Pin;
|
||||||
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
// GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
// GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||||
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
|
// HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
|
||||||
|
|
||||||
/*Configure GPIO pin : PtPin */
|
/*Configure GPIO pin : PtPin */
|
||||||
GPIO_InitStruct.Pin = ETH_RESET_Pin;
|
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);
|
state = HAL_GPIO_ReadPin(DI_CH4_GPIO_Port, DI_CH4_Pin);
|
||||||
break;
|
break;
|
||||||
case DI_5:
|
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;
|
break;
|
||||||
case DI_6:
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
state = GPIO_PIN_RESET;
|
state = GPIO_PIN_RESET;
|
||||||
|
|
|
@ -235,6 +235,36 @@
|
||||||
<WinNumber>1</WinNumber>
|
<WinNumber>1</WinNumber>
|
||||||
<ItemText>rst_pin_state</ItemText>
|
<ItemText>rst_pin_state</ItemText>
|
||||||
</Ww>
|
</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>
|
</WatchWindow1>
|
||||||
<Tracepoint>
|
<Tracepoint>
|
||||||
<THDelay>0</THDelay>
|
<THDelay>0</THDelay>
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue