目录
一、函数接收不定长长度的参数
#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_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,通过这样的性质我们可以检测事件的状态。再通过与(&)的操作来检测某一位数据。
希望能帮到有需要的人!