【设计模式项目实战】串口协议总线管理模型实现

本文提出了一种串口协议管理的设计方案,通过模糊对象的方法统一管理多种协议的数据方法,实现高内聚低耦合的模块设计。介绍了数据类型定义、串口总线对象及接口设计,并提供了接口方法实现及调用示例。

功能模型的需求

设计一款支持多个串口协议模型管理,方便业务的扩展,尽可能的使得模块可以“高内聚低耦合”。

设计思路-UML模型关系图

将每一个协议的数据方法统一管理起来,采用“模糊对象”判断,即不对具体的协议判断进行判断,将协议对象抽象出来进行管理。
在这里插入图片描述

判断方法-是否触发,是否执行

第一步:检查是哪种协议触发,满足业务需求
第二部:执行对应的协议命令动作

功能实现-模块介绍

数据类型

/*support data type*/
typedef enum rz_usart_data_type_def{
	RZ_USART_DATA_TYPE_NONE = 0x00,
    RZ_USART_DATA_TYPE_MCU_SENSOR_RS140,
    RZ_USART_DATA_TYPE_MODBUS_RTU,
    RZ_USART_DATA_TYPE_DEBUG_TOOL,
    RZ_USART_DATA_TYPE_MAX,
}rz_usart_data_type_t;

这里支持3种数据协议的解析判断,调试仪读取协议、传感器数据读取协议、MODBUS-RTU数据读取。

串口总线对象和接口模块设计

typedef struct rz_usart_data_manager_t rz_usart_data_manager_t;

typedef struct usart_data_interface_def{
    rt_list_t method_list;   	/* reload interface list */
    uint32_t data_type;         /* rz_usart_bus_data_type_def */

    /* reload interface */
    rz_usart_data_type_t (*usart_data_triger)(const uint8_t *buf, uint32_t buf_size);
    bool (*usart_data_process)(uint8_t *buf, uint32_t buf_size,rz_usart_data_type_t triger_type);

}usart_data_interface_t;

CLASS(rz_usart_data_manager_t)
{
    rt_list_t bus_list;  	/* usart bus list */

    /* method  */
    rz_usart_data_type_t (*usart_data_triger)(rz_usart_data_manager_t *t, const uint8_t *buf, uint32_t buf_size);
    bool (*usart_data_process)(rz_usart_data_manager_t *t, uint8_t *buf, uint32_t buf_size,rz_usart_data_type_t triger_type);
    bool (*method_register)(rz_usart_data_manager_t *t, usart_data_interface_t *pif);
    void (*init)(rz_usart_data_manager_t *t);
};

串口协议对象和接口设计

typedef struct usart_data_proto_interface_def{
	uint8_t data_type;

	rz_usart_data_type_t (*usart_data_triger)(const uint8_t *buf, uint32_t buf_size);
    bool (*usart_data_process)(uint8_t *buf, uint32_t buf_size,rz_usart_data_type_t triger_type);

}usart_data_proto_interface_t, *poffline_data_split_interface_t;



typedef struct rz_usart_data_proto_t rz_usart_data_proto_t;
CLASS(rz_usart_data_proto_t)
{
    usart_data_interface_t usart_proto_method;
    rz_usart_data_manager_t *usart_data_manager;

    bool (*init)(rz_usart_data_proto_t *t, rz_usart_data_type_t data_type);
};

接口方法添加-数据驱动编程

const rz_usart_data_type_t support_usart_data_proto[] = {
	RZ_USART_DATA_TYPE_MCU_SENSOR_RS140,
	RZ_USART_DATA_TYPE_MODBUS_RTU,
	RZ_USART_DATA_TYPE_DEBUG_TOOL,
};

static usart_data_proto_interface_t usart_data_proto_interface[] = {
	{RZ_USART_DATA_TYPE_MCU_SENSOR_RS140,  usart_mcu_sensor_triger_check, usart_mcu_sensor_procrss},
	{RZ_USART_DATA_TYPE_MODBUS_RTU,  usart_modbus_rtu_triger_check, usart_modbus_rtu_procrss},
	{RZ_USART_DATA_TYPE_DEBUG_TOOL,   usart_debug_tool_triger_check, usart_debug_tool_procrss},
};

对外提供输出接口

bool rz_usart_data_triger_check_process(uint8_t *buf, uint32_t buf_size)
{
	rz_usart_data_manager_t *t = rz_usart_data_manager_obj_get();
	rz_usart_data_type_t type = RZ_USART_DATA_TYPE_NONE;
	bool iret = false;

	if (NULL != t) {
		type = t->usart_data_triger(t, buf, buf_size);
	}
	if ((RZ_USART_DATA_TYPE_NONE != type) && (NULL != t)) {
		iret = t->usart_data_process(t, buf, buf_size, type);
	}
	return iret;
}

总结

按照这样的设计思想,最终用户只需要考虑关系协议的判断条件和协议的执行即可。
满足模块设计“开闭原则”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值