嵌入式C语言之不定长长度的参数和位操作检验标志位

目录

一、函数接收不定长长度的参数

二、位操作检验标志位

一、函数接收不定长长度的参数

#include <stdarg.h>
#include <stdio.h>
uint8_t Send_argument(uint8_t cmd, uint8_t num, ...)
{
    uint16_t crc;
    va_list args;
    uint8_t cnt = 12;
    uint8_t Send_Buf[30] = { 0X01,0X02,0X03,0X04,0X02,0XFF,0,0,0,0 };
    Send_Buf[10] = cmd;
    Send_Buf[11] = num;
    va_start(args, num);
    for (uint8_t i = 0; i < num; i++)
    {
        Send_Buf[cnt++] = va_arg(args, uint8_t);
    }
    va_end(args);
    crc = CRC16(Send_Buf, cnt);
    Send_Buf[cnt++] = crc >> 8;
    Send_Buf[cnt++] = crc;
    Send_Buf[cnt++] = 0xf8;
    Send_Buf[cnt++] = 0xc6;
    Send_Buf[cnt++] = 0xf8;
    Send_Buf[cnt++] = 0xc6;
    for (uint8_t i = 0; i < cnt; i++)
    {
        printf("%.2lx ", Send_Buf[i]);
    }
    return 1;
}

1、uint8_t num:输入参数num代表输入参数的个数

2、uint8_t Send_Buf[30]:缓冲数组长度只要大于需要发送的数组即可。

3、uint8_t cnt:辅助索引,帮助我们记录数组长度,以便于后续CRC验证。

4、uint8_t:代表我们希望得到的数据类型。

Send_Buf[cnt++] = va_arg(args, uint8_t);

这个函数可以帮助我们学习stdarg.hva_list va_start va_arg va_end的使用,再次基础上可以做各种协议发送的拓展。

二、位操作检验标志位

void Check_Process(void)
{
    uint8_t i;
    uint16_t state = 0;
    state = 0xAAAA;
    state ^= 0xffff;
    if (state & 0x0001) { printf("测试1通过\n"); }
    if (state & 0x0002) { printf("测试2通过\n"); }
    if (state & 0x0004) { printf("测试3通过\n"); }
    if (state & 0x0008) { printf("测试4通过\n"); }
    if (state & 0x0010) { printf("测试5通过\n"); }
    if (state & 0x0020) { printf("测试6通过\n"); }
    if (state & 0x0040) { printf("测试7通过\n"); }
    if (state & 0x0080) { printf("测试8通过\n"); }
    if (state & 0x0100) { printf("测试9通过\n"); }
    if (state & 0x0200) { printf("测试10通过\n"); }
    if (state & 0x0400) { printf("测试11通过\n"); }
    if (state & 0x0800) { printf("测试12通过\n"); }
    if (state & 0x1000) { printf("测试13通过\n"); }
    if (state & 0x2000) { printf("测试14通过\n"); }
    if (state & 0x4000) { printf("测试15通过\n"); }
    if (state & 0x8000) { printf("测试16通过\n"); }
    printf("测试完成\n");
}

1、此函数充分利用每一位数据,减少内存占用(其实内存已经不是很值钱,只是为了深一步学习C语言),核心是通过^异或操作检验数据,然后判断uint16数据中的每一位来判断标志位是否被操作。

state = 0xAAAA;
state ^= 0xffff;

2、在这里我们认为当标志位为1时代表事件发生。

3、state是我们的输入数据,异或0xffff后根据相同为零,相异为一的异或性质来检测 标志位是否被置1,没有触发的那一位就变成了0,通过这样的性质我们可以检测事件的状态。

再通过与(&)的操作来检测某一位数据。

希望能帮到有需要的人!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值