FluxDC/components/FluxUart/FluxUart.h
2025-03-25 10:22:43 +08:00

129 lines
2.8 KiB
C

#ifndef _FLUX_UART_H
#define _FLUX_UART_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/uart.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
#include "esp_log.h"
/* UART */
/* UART1 RT-2 TX-1*/
/* UART2 RT-46 TX-45*/
#define ECHO_TEST_TXD2 GPIO_NUM_45
#define ECHO_TEST_RXD2 GPIO_NUM_46
#define ECHO_UART_PORT_NUM2 (UART_NUM_2)
#define ECHO_TEST_TXD1 GPIO_NUM_1
#define ECHO_TEST_RXD1 GPIO_NUM_2
#define ECHO_UART_PORT_NUM1 (UART_NUM_1)
#define ECHO_TEST_RTS (UART_PIN_NO_CHANGE)
#define ECHO_TEST_CTS (UART_PIN_NO_CHANGE)
#define ECHO_UART_BAUD_RATE (9600)
#define ECHO_TASK_STACK_SIZE (16*1024)
/* Choose whether to use big-endian or little-endian. Modbus-RTU communication uses little-endian. */
#define BIG_ENDIAN_USED 0
#define LITTLE_ENDIAN_USED !BIG_ENDIAN_USED
/* Digital flow meter address */
#define FLUX_ADDR 0x01
#define FLUX_FUNC_READ 0x03
#define FLUX_FUNC_SET 0x10
#define FLUX_FUNC_SET_SINGLE 0x06
#define FLUX_TEST_START ESP_ERROR_CHECK(ModbusRTU_Send_0306(ECHO_UART_PORT_NUM1,&flux_frame_start));
/* Modbus-RTU frame format */
/* All data from the wet flow meter are two bytes long */
/*
ADDR : 1byte
FUNC : 1byte
DATA : 2byte
CRC : 2byte
*/
struct ModbusRTU_Frame
{
unsigned char ADDR;
unsigned char FUNC;
unsigned char DATA[4];
unsigned char CRC[2];
};
extern struct ModbusRTU_Frame flux_frame;
extern struct ModbusRTU_Frame breath_frame;
extern struct ModbusRTU_Frame flux_frame_start;
/*定义32位寄存器写结构体*/
struct ModbusRTU_Frame2Reg
{
unsigned char ADDR;
unsigned char FUNC;
unsigned short regAddr;
unsigned short regNum;
uint8_t ByteNum;
uint8_t DATA[4];
unsigned char CRC[2];
};
extern struct ModbusRTU_Frame2Reg flux_frame2Reg;
/*定义工作模式*/
typedef enum FluxMachineWorkMode{
FLUX_MODE_NORMAL,
FLUX_MODE_TIMER,
FLUX_MODE_VOLUME,
FLUX_MODE_REV,
};
struct FluxMachineData
{
enum FluxMachineWorkMode workMode;
float time;
float volume;
float rev;
float breathTimes;
unsigned short finishFlag;
float liquidTemperature;
float cumulativeVolume;
};
extern struct FluxMachineData FluxMachineData;
/* UART1 response task */
void uart1_echoTask(void* arg);
/* UART2 response task */
void uart2_echoTask(void* arg);
/* CRC16 checksum */
unsigned short CRC16(unsigned char* pchMsg, unsigned short wDataLen);
/*封装03 06指令函数 单寄存器写、多寄存器读*/
esp_err_t ModbusRTU_Send_0306(uart_port_t uart_num, struct ModbusRTU_Frame *frame);
/*封装多寄存器写函数 0x10指令*/
esp_err_t ModbusRTU_Send_0x10(uart_port_t uart_num, struct ModbusRTU_Frame2Reg *frame);
/*根据主界面内容刷新测试结果*/
esp_err_t RefreshResult(void);
#ifdef __cplusplus
} /*extern "C"*/
#endif
#endif