#ifndef _FLUX_UART_H #define _FLUX_UART_H #ifdef __cplusplus extern "C" { #endif #include #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)); /* 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