文章目录
功能模型的需求
设计一款支持多个串口协议模型管理,方便业务的扩展,尽可能的使得模块可以“高内聚低耦合”。
设计思路-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;
}
总结
按照这样的设计思想,最终用户只需要考虑关系协议的判断条件和协议的执行即可。
满足模块设计“开闭原则”
本文提出了一种串口协议管理的设计方案,通过模糊对象的方法统一管理多种协议的数据方法,实现高内聚低耦合的模块设计。介绍了数据类型定义、串口总线对象及接口设计,并提供了接口方法实现及调用示例。
352

被折叠的 条评论
为什么被折叠?



