FluxDC/components/FluxUart/FluxUart.h

256 lines
5.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file FluxUart.h
* @brief 串口通讯头文件
*
* 用于数据收发及解析工作(重要!)
*
* @author wang xiang en
* @date 2025-04-19
* @version 版本号
* @copyright 版权声明((C)2025, YUWELL MEDTECH Co.ltd
*/
#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*/
#if 1
#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)
#else
#define ECHO_TEST_TXD2 GPIO_NUM_1
#define ECHO_TEST_RXD2 GPIO_NUM_2
#define ECHO_UART_PORT_NUM2 (UART_NUM_2)
#define ECHO_TEST_TXD1 GPIO_NUM_45
#define ECHO_TEST_RXD1 GPIO_NUM_46
#define ECHO_UART_PORT_NUM1 (UART_NUM_1)
#endif
/*不使用RTS CTS*/
#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 (8*1024)
/* 选择使用大端/小端模式 */
#define BIG_ENDIAN_USED 0
#define LITTLE_ENDIAN_USED !BIG_ENDIAN_USED
/* 流量计通讯参数设定 地址、功能码 */
#define FLUX_ADDR 0x01
#define FLUX_FUNC_READ 0x03
#define FLUX_FUNC_SET 0x10
#define FLUX_FUNC_SET_SINGLE 0x06
/* 启动指令下发事件组标志位 */
#define START_TEST_EVENT_BIT BIT0
/* 定义缓冲大小 */
#define BUF_SIZE (1024)
/*定义工作模式*/
enum FluxMachineWorkMode{
FLUX_MODE_NORMAL,
FLUX_MODE_TIMER,
FLUX_MODE_VOLUME,
FLUX_MODE_REV,
};
/**
* @brief RTU通讯帧
*
*/
struct ModbusRTU_Frame
{
unsigned char ADDR;
unsigned char FUNC;
unsigned char DATA[4];
unsigned char CRC[2];
};
/**
* @brief 32位RTU通讯帧
*
*/
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];
};
/**
* @brief 当前机器状态
*
*/
struct FluxMachineData
{
enum FluxMachineWorkMode workMode;
float time;
float volume;
float rev;
float breathTimes;
int32_t breathRate;
unsigned short finishFlag;
float liquidTemperature;
float cumulativeVolume;
};
/* 记录当前呼吸频率、累计流量、累计体积、累计时间等数据 */
extern struct FluxMachineData FluxMachineData;
/* 通讯帧结构体 */
extern struct ModbusRTU_Frame2Reg flux_frame2Reg;
/* 通讯帧结构体 */
extern struct ModbusRTU_Frame flux_frame;
extern struct ModbusRTU_Frame breath_frame;
/* 定义用于下发启动指令的帧 */
extern struct ModbusRTU_Frame flux_frame_start;
/* 启动指令下发事件组 */
extern EventGroupHandle_t start_state_event_group;
/* 导出当前工作模式的变量 */
extern bool is_test_mode_nom;
/**
* @brief 启动指令下发宏函数
*
*/
#define FLUX_TEST_START flux_frame_start.ADDR = FLUX_ADDR;\
flux_frame_start.FUNC = FLUX_FUNC_SET_SINGLE;\
\
flux_frame_start.DATA[0] = 0x00;\
flux_frame_start.DATA[1] = 0x01;\
flux_frame_start.DATA[2] = 0x00;\
flux_frame_start.DATA[3] = 0x01;\
ESP_ERROR_CHECK(ModbusRTU_Send_0306(ECHO_UART_PORT_NUM1,&flux_frame_start));\
ESP_LOGI("FLUX_TEST_START","send start");
/**
* @brief 测试正确显示
*
*/
#define RESULT_RIGHT lv_obj_set_style_bg_color(ui_pageHome_panelTestResult,lv_color_hex(0x00FF00),LV_PART_MAIN);\
lv_label_set_text(ui_pageHome_labelTestResult,"V");
/**
* @brief 测试错误显示
*
*/
#define RESULT_FAULT lv_obj_set_style_bg_color(ui_pageHome_panelTestResult,lv_color_hex(0xFF0000),LV_PART_MAIN);\
lv_label_set_text(ui_pageHome_labelTestResult,"X");
/* 定义主界面进度条显示控制函数 */
#define FLUX_PROGRESS_BAR_CONTROL(x) lv_bar_set_value(ui_pageHome_BarTestProgBS, x, LV_ANIM_ON);
/**
* @brief 串口1收发任务 (流量计)
*
* @param[in] arg not used
*
*/
void uart1_echoTask(void* arg);
/**
* @brief 串口2收发任务 (呼吸模拟器)
*
* @param[in] arg not used
*
*/
void uart2_echoTask(void* arg);
/**
* @brief 测试任务
*
* @param[in] arg not used
*
*/
void test_task(void *arg);
/**
* @brief CRC16 校验函数
*
* @param[in] pchMsg 输入的数据
* @param[in] wDataLen 数据长度
*
*/
unsigned short CRC16(unsigned char* pchMsg, unsigned short wDataLen);
/**
* @brief 封装03 06指令函数 单寄存器写、多寄存器读
*
* @param[in] uart_num 串口号
* @param[in] frame 需要发送的数据帧
*
*/
esp_err_t ModbusRTU_Send_0306(uart_port_t uart_num, struct ModbusRTU_Frame *frame);
#if USART_USE_10_COMMAND
/**
* @brief 封装多寄存器写函数 0x10指令
*
* @param[in] uart_num 串口号
* @param[in] frame 需要发送的数据帧
*
*/
esp_err_t ModbusRTU_Send_0x10(uart_port_t uart_num, struct ModbusRTU_Frame2Reg *frame);
#endif
/**
* @brief 封装05指令修改单个寄存器开关量
*
* @param[in] uart_num 串口号
* @param[in] frame 需要发送的数据帧
*
*/
esp_err_t ModbusRTU_Send_0x05(uint32_t ADDR);
/**
* @brief 根据主界面内容刷新测试结果
*
*/
esp_err_t RefreshResult(void);
#ifdef __cplusplus
} /*extern "C"*/
#endif
#endif