HART下位机透传至上位机有数据但不对
This commit is contained in:
parent
faa836cb94
commit
4de02310aa
|
@ -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
|
||||
|
|
|
@ -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); // 给其他任务执行的机会
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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>
|
||||
|
|
Binary file not shown.
Loading…
Reference in New Issue