C语言用结构体实现串口协议

C语言用结构体实现串口协议


需求:我们串口发送是一个字节一个字节的,我们制定的协议如下:一帧协议10个字节,
放于buff[10]
byte0 byte1 0x5555起始
byte2 value1
byte3 byte4 value2
byte5 byte6 byte7 byte8 value3
byte9 0xff 停止

代码实现:

//需求:我们串口发送是一个字节一个字节的,我们制定的协议如下:一帧协议10个字节,
//放于buff[10]
//byte0 byte1               value0=0x5555起始
//byte2                     value1
//byte3 byte4               value2
//byte5 byte6 byte7 byte8   value3
//byte9                     value4=0xff 停止

#include <stdio.h>
void uart_deal(unsigned char *buff,int len)
{
    int i;
    unsigned char value1;
    unsigned short value2;
    unsigned int value3;
    for(i=0;i<len;i++)
    {
        //起始位置
        if(buff[i] == 0x55 && buff[i+1] == 0x55)
        {
            if(buff[i+9]==0xff)
            {
                value1 = buff[i+2];
                value2 = (buff[i+3] << 8) + buff[i+4];
                value3 = (buff[i+5] << 24) + (buff[i+6] << 16) + (buff[i+7] << 8) + buff[i+8];
                printf(" value1:0x%x\n value2:0x%x\n value3:0x%x\n",value1,value2,value3);
            }        
        }
    }
}
void uart_deal_test()
{
    unsigned char buff[] = {0x00,0x55,0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0xff};
    int len ;
    len = (int) sizeof(buff)/sizeof(buff[0]);
    printf(" len:%d\n",len);
    uart_deal(buff,len);
}
//使用了#pragma pack(n)命令强制对齐标准,
//则取n和结构体中最长数据类型占的字节数两者之中的小者作为对齐标准
#pragma pack(1)   //让结构体里面数据以一字节对齐
typedef struct{
    unsigned char value1;
    unsigned short value2;
    unsigned int value3;
}uart_def;	
#pragma pack() //取消自定义字节对齐方式
void uart_deal_point(unsigned char *buff,int len)
{
    int i=0;
    uart_def *value_p;
    for(i=0;i<len;i++)  
    {
        if(buff[i] == 0x55 && buff[i+1] == 0x55)
        {
            if(buff[i+9]==0xff)
            {
                value_p = (uart_def *)&buff[i+2];//强制转value1开始的地址为结构体类型的地址 
                printf(" value1:0x%x\n value2:0x%x\n value3:0x%x\n",value_p->value1,value_p->value2,value_p->value3);
            }
        }
    }
}

void uart_deal_point_test()
{
    unsigned char buff[] = {0x00,0x55,0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0xff,0x08,0x09};
    int len ;
    len = (int) sizeof(buff)/sizeof(buff[0]);
    printf(" len:%d\n",len);
    uart_deal_point(buff,len);
}

int main()
{
    uart_deal_test();
    uart_deal_point_test();
    return 0;
}

注意:
即以结构体成员中占内存最多的数据类型所占的字节数为标准,所有的成员在分配内存时都要与这个长度对齐。

struct STUDENT
{
    char a;
    char b;
    int c;
}data;

在这里插入图片描述

但是:
假如这个字节数为 N,那么对齐的原则是:理论上所有成员在分配内存时都是紧接在前一个变量后面依次填充的,但是如果是“以 N 对齐”为原则,那么,如果一行中剩下的空间不足以填充某成员变量,即剩下的空间小于某成员变量的数据类型所占的字节数,则该成员变量在分配内存时另起一行分配。

struct STUDENT
{
    char a;
    char b;
    char c;
    char d;
    char e;
    int f;
}data;

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值