256 lines
5.6 KiB
C
256 lines
5.6 KiB
C
/**
|
||
* @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 |