嵌入式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.h中va_listva_startva_argva_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,通过这样的性质我们可以检测事件的状态。再通过与(&)的操作来检测某一位数据。
希望能帮到有需要的人!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)