设计模式的C语言实现--命令模式

命令模式。在命令模式里面,我们只需要维护一个命令列表就行了,而不需要关注解析函数本身。 先来看一个通讯协议相关的例子,数据帧定义如下:

帧长度传感器类型数据
1字节1字节n字节

传感器数据格式定义如下

传感器类型号数据格式
温度传感器整型数据(4字节)
湿度传感器整型数据(4字节)

// 当心字节对齐的问题
typedef struct {
    uint8_t head;
    uint8_t cmd;
    uint16_t length;
    uint8_t data[1];
} package_t;
 
static void parse_temperature( uint8_t *buffer )
{
    int value = *buffer;
    printf( "temperature = %d\n", value );
}
static void parse_humidity( uint8_t *buffer )
{
    int value = *buffer;
    printf( "humidity = %d\n", value );
}
static void parse_illumination( uint8_t *buffer )
{
    int value = *buffer;
    printf( "illumination = %d\n", value );
}
 
typedef struct {
    uint8_t cmd;
    void ( * handle )( uint8_t *buffer );
} parse_handler;
 
static const parse_handler  handlers[] = {
    {0x01, parse_temperature},
    {0x02, parse_humidity},
    {0x03, parse_illumination},
    {0xFF, NULL},
};
 
static uint8_t parse( uint8_t *buffer, uint16_t length )
{
    package_t *frame = ( package_t * )buffer;
    uint8_t tail = buffer[length - 1];
    const parse_handler *entry;
 
    if ( frame->head != 0xFF ) {
        return 0;
    }
 
    for ( entry =  handlers; entry->handle != NULL; ++entry ) {
        if ( frame->cmd == entry->cmd ) {
            entry->handle( frame->data );
            break;
        }
    }
 
    return 1;
}
 
int main( void )
{
    uint8_t buffer[] = {0xFF, 0x01, 0x00, 0x05, 0x02};
    parse( buffer, 5 );
    uint8_t buffer_2[] = {0xFF, 0x02, 0x00, 0x05, 0x02};
    parse( buffer_2, 5 );
    uint8_t buffer_3[] = {0xFF, 0x03, 0x00, 0x05, 0x02};
    parse( buffer_3, 5 );
}

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值