认真学习套壳技巧-消息队列-日志模块

流程:
第一步把开门日志整理到结构体logData 它是一个大容器 万能对接的!
memset(&logData , 0x00 , sizeof(openlogDataType));
logData.type = OPENLOG_FORM_CARD;
logData.length = openResult;
memcpy(logData.data , (uint8_t *)tag , sizeof(tagBufferType));
journal.save_log(&logData);
也就是在各种开门中只需要调用journal.save_log(&logData);即可!
第二步:保存函数回到log模块做了消息队列
void journal_save_log( openlogDataType *saveLog )
{
	journalTaskQueueType message;

    memset(&message , 0x00 , sizeof(journalTaskQueueType));
	message.cmd = LOG_ADD;
	message.sn = 0;
    memcpy(&message.openlog , saveLog , sizeof(openlogDataType));
    
	xQueueSend( xLogQueue, ( void* )&message, NULL );    
}它的技术是在装了一层壳子 队列在任务循环中被处理
第三部:log任务处理
if(xQueueReceive( xLogQueue, &pst, 1000 ) == pdTRUE)
{
switch(pst.cmd)
{
case LOG_ADD:
log(DEBUG,"接到增加LOG命令, get sn =%d ,device sn = %d\n" , pst.sn , journalSn);
journal_add_log(&pst);
}
它会去执行函数 journal_add_log 依次退去壳子
最后直接	journal_send_queue(LOG_SEND  , 0 );回到任务

有网诺就发出去 没网诺就不发

其实他做了一个定时器 一直在给任务发消息 你去发日志给平台吧!

+++++++++++++补充 随处可见的金蚕脱壳++++++++++++++++

typedef struct
{
    tagTypeEnum     type;
    uint8_t         cardType;
    tagPowerEnum    tagPower;
    uint8_t         allDataCrc;
    uint8_t         UID[16];
    uint8_t         UIDLength;
    uint8_t         buffer[128];
    uint8_t   sak;
    uint8_t         readFinshFlag;
}tagBufferType;

结构体tagBufferType主要是代码内部处理,真正有用的信息是uint8_t         buffer[128];它对应多个的结构体来对倒。

第一个特斯联用户卡:

typedef struct _tagUserDataType{
    //0区 1块   密码KeyA 111111111111
    communityType community;    // 主住户信息   8字节
    uint8_t house0[2];          //房间号
    uint8_t name[6];            //业主姓名
    //0区 2块
    uint8_t setting;            // 设置    1字节
    uint8_t start[3];           // 发卡时间    3字节
    uint8_t stop[3];            // 截止时间    3字节
    uint8_t crc0;               // 校验    1字节
    uint8_t cardID[4];          //卡号  4字节
    uint8_t version;            //版本  1
    uint8_t cardType;           //卡类  1
    uint8_t crc16_0[2];         //CRC      2
    //1区  0块
    uint8_t id[9];              //身份证      9(当最后一位为x 时   用A代替)
    //2区  0块1块
    communityType communitys[4];// 主住户信息   4*8字节
    //2区  2块
    uint8_t house1[2];          //房间号1
    uint8_t house2[2];          //房间号2
    uint8_t house3[2];          //房间号3
    uint8_t house4[2];          //房间号4
    uint8_t crc1;               // 校验    1字节
    uint8_t fdgs1[4];           //分断      1*4
    uint16_t userFloor;
    uint8_t crc16_1[2];         //CRC 16
}tagUserDataType;               //用户卡 共89字节

对倒:比如临时变量

    tagUserDataType         tagUser;  
    memcpy((uint8_t*)&tagUser,tag→buffer,sizeof(tagUserDataType));

如此很快的完成数组→结构体赋值。

猜你喜欢

转载自blog.csdn.net/weixin_42381351/article/details/88818369
今日推荐