DI状态发生改变时,下位机主动上发DI状态,重复三次,直到上位机回复
This commit is contained in:
parent
22436f3bc0
commit
3dbaf6dc60
|
@ -23,7 +23,8 @@
|
|||
#define __MAIN_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
|
@ -40,6 +41,7 @@ extern "C" {
|
|||
/* USER CODE BEGIN ET */
|
||||
|
||||
extern uint8_t tcp_echo_flags_control;
|
||||
extern uint8_t send_data_flag_cmd;
|
||||
#define ARRAY_LEN(arr) (sizeof(arr)) / (sizeof(arr[0]))
|
||||
typedef struct
|
||||
{
|
||||
|
@ -49,7 +51,6 @@ typedef struct
|
|||
uint8_t tx_data[512];
|
||||
} uart_t;
|
||||
|
||||
|
||||
#define DEST_IP_ADDR0 192
|
||||
#define DEST_IP_ADDR1 168
|
||||
#define DEST_IP_ADDR2 1
|
||||
|
|
|
@ -27,6 +27,9 @@
|
|||
/* USER CODE BEGIN Includes */
|
||||
|
||||
#include "communication_protocol.h"
|
||||
#include "tim.h"
|
||||
#include "gpio.h"
|
||||
#include "tcpserverc.h"
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
|
@ -54,7 +57,10 @@ osThreadId leds_taskHandle;
|
|||
|
||||
/* Private function prototypes -----------------------------------------------*/
|
||||
/* USER CODE BEGIN FunctionPrototypes */
|
||||
|
||||
uint8_t di_state_last[DI_MAX] = {0};
|
||||
uint8_t di_state_now[DI_MAX] = {0};
|
||||
extern uint8_t tcp_echo_flags_control;
|
||||
extern uint8_t send_data_flag_cmd;
|
||||
/* USER CODE END FunctionPrototypes */
|
||||
|
||||
void start_tcp_task(void const *argument);
|
||||
|
@ -85,7 +91,8 @@ void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, StackTyp
|
|||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
void MX_FREERTOS_Init(void) {
|
||||
void MX_FREERTOS_Init(void)
|
||||
{
|
||||
/* USER CODE BEGIN Init */
|
||||
|
||||
/* USER CODE END Init */
|
||||
|
@ -122,7 +129,6 @@ void MX_FREERTOS_Init(void) {
|
|||
/* USER CODE BEGIN RTOS_THREADS */
|
||||
/* add threads, ... */
|
||||
/* USER CODE END RTOS_THREADS */
|
||||
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN Header_start_tcp_task */
|
||||
|
@ -161,7 +167,36 @@ void start_gpio_di_do_task(void const * argument)
|
|||
/* Infinite loop */
|
||||
for (;;)
|
||||
{
|
||||
osDelay(1);
|
||||
uint8_t di_ch = 0;
|
||||
uint8_t tx_data_len = 7 + DI_MAX;
|
||||
uint8_t tx_data[32] = {0};
|
||||
tx_data[0] = FRAME_HEAD; // 帧头
|
||||
tx_data[1] = COM_OK; // 状态
|
||||
tx_data[2] = DEVICE_NUM; // 设备号
|
||||
tx_data[3] = SEND_STATE_CMD; // 命令号
|
||||
tx_data[4] = DI_MAX; // 数据长度
|
||||
for (di_ch = 0; di_ch < DI_MAX; di_ch++)
|
||||
{
|
||||
di_state_now[di_ch] = gpio_di_test(di_ch);
|
||||
if (di_state_last[di_ch] != di_state_now[di_ch])
|
||||
{
|
||||
di_state_last[di_ch] = di_state_now[di_ch];
|
||||
send_data_flag_cmd = 1;
|
||||
}
|
||||
tx_data[5 + di_ch] = di_state_now[di_ch];
|
||||
}
|
||||
if ((send_data_flag_cmd != 0) && (1 == tcp_echo_flags_control))
|
||||
{
|
||||
tx_data[5 + DI_MAX] = xor_compute(tx_data + 1, tx_data_len - 3); // 异或校验
|
||||
tx_data[6 + DI_MAX] = FRAME_TAIL; // 帧尾
|
||||
user_send_data_control(tx_data, tx_data_len);
|
||||
send_data_flag_cmd++;
|
||||
if (send_data_flag_cmd > 3) // 连续三次上位机没有回应,则停止发送数据包
|
||||
{
|
||||
send_data_flag_cmd = 0;
|
||||
}
|
||||
}
|
||||
vTaskDelay(200);
|
||||
}
|
||||
/* USER CODE END start_gpio_di_do_task */
|
||||
}
|
||||
|
|
|
@ -63,6 +63,7 @@ void MX_FREERTOS_Init(void);
|
|||
/* USER CODE BEGIN 0 */
|
||||
|
||||
uint8_t tcp_echo_flags_control = 0;
|
||||
uint8_t send_data_flag_cmd = 0;
|
||||
/* USER CODE END 0 */
|
||||
|
||||
/**
|
||||
|
@ -149,8 +150,7 @@ void SystemClock_Config(void)
|
|||
|
||||
/** Initializes the CPU, AHB and APB buses clocks
|
||||
*/
|
||||
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|
||||
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
|
||||
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
|
||||
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
|
||||
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
|
||||
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
|
||||
|
@ -179,7 +179,8 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
|||
/* USER CODE BEGIN Callback 0 */
|
||||
|
||||
/* USER CODE END Callback 0 */
|
||||
if (htim->Instance == TIM1) {
|
||||
if (htim->Instance == TIM1)
|
||||
{
|
||||
HAL_IncTick();
|
||||
}
|
||||
/* USER CODE BEGIN Callback 1 */
|
||||
|
|
|
@ -7,7 +7,12 @@
|
|||
#define COM_AI_DATA_SIZE 11 // 模拟量数据返回帧长度
|
||||
#define FRAME_HEAD 0xAA // 帧头
|
||||
#define FRAME_TAIL 0x3C // 帧尾
|
||||
|
||||
#define DEVICE_NUM 0x00 // 设备号
|
||||
#define READ_ANALOG_CMD 0x00 // 读模拟量命令
|
||||
#define WRITE_ANALOG_CMD 0x01 // 写模拟量命令
|
||||
#define READ_DIGITAL_CMD 0x02 // 读数字量命令
|
||||
#define WRITE_DIGITAL_CMD 0x03 // 写数字量命令
|
||||
#define SEND_STATE_CMD 0x04 // 主动上发状态命令
|
||||
typedef enum
|
||||
{
|
||||
COM_OK = 0,
|
||||
|
|
|
@ -10,8 +10,5 @@
|
|||
#define TCP_PORT_CONTROL 5003
|
||||
|
||||
extern void tcp_echo_init(void);
|
||||
extern void user_send_data_hart1(uint8_t *data, uint16_t len);
|
||||
extern void user_send_data_hart2(uint8_t *data, uint16_t len);
|
||||
extern void user_send_data_ble1(uint8_t *data, uint16_t len);
|
||||
extern void user_send_data_ble2(uint8_t *data, uint16_t len);
|
||||
extern void user_send_data_control(uint8_t *data, uint16_t len);
|
||||
#endif
|
||||
|
|
|
@ -15,18 +15,15 @@
|
|||
#include "communication_protocol.h"
|
||||
#include "user_gpio.h"
|
||||
|
||||
|
||||
struct tcp_pcb *server_pcb_control = NULL;
|
||||
|
||||
communication_di_t *user_communication_di = NULL;
|
||||
communication_do_t *user_communication_do = NULL;
|
||||
|
||||
|
||||
extern uint8_t tcp_echo_flags_control;
|
||||
|
||||
/*接收回调函数*/
|
||||
|
||||
|
||||
static err_t tcpecho_recv_control(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
|
||||
{
|
||||
uint8_t tcp_rx_data[128] = {0}; // 接受数据缓存区
|
||||
|
@ -37,7 +34,7 @@ static err_t tcpecho_recv_control(void *arg, struct tcp_pcb *tpcb, struct pbuf *
|
|||
if (p != NULL)
|
||||
{
|
||||
/* 更新窗口*/
|
||||
|
||||
tcp_echo_flags_control = 1;
|
||||
tcp_recved(tpcb, p->tot_len); // 读取数据的控制块 得到所有数据的长度
|
||||
server_pcb_control = tpcb; // 直接赋值
|
||||
memcpy(tcp_rx_data, (int *)p->payload, p->tot_len);
|
||||
|
@ -76,6 +73,10 @@ static err_t tcpecho_recv_control(void *arg, struct tcp_pcb *tpcb, struct pbuf *
|
|||
user_write_gpio(user_communication_do);
|
||||
tcp_write(tpcb, tcp_rx_data, rx_data_len, 1);
|
||||
}
|
||||
else if (tcp_rx_data[3] == SEND_STATE_CMD)
|
||||
{
|
||||
send_data_flag_cmd = 0; // 上位机返回数据,发送状态标志位清零
|
||||
}
|
||||
else
|
||||
{
|
||||
// 返回命令号错误
|
||||
|
@ -108,7 +109,6 @@ void tcp_echo_init(void)
|
|||
{
|
||||
struct tcp_pcb *server_control = NULL;
|
||||
|
||||
|
||||
/* 创建控制块 */
|
||||
server_control = tcp_new();
|
||||
|
||||
|
@ -122,4 +122,8 @@ void tcp_echo_init(void)
|
|||
tcp_accept(server_control, tcpecho_accept_control); // 侦听到连接后,回调用户编写的tcpecho_accept
|
||||
}
|
||||
|
||||
void user_send_data_control(uint8_t *data, uint16_t len)
|
||||
{
|
||||
|
||||
tcp_write(server_pcb_control, data, len, 1);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue