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

2023-05-16

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;

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言用结构体实现串口协议 的相关文章

  • PX4开发环境搭建

    PX4开发环境搭建 编译工具链的安装vscode 编译工具链的安装 下载ubuntu sh requirements txt wget https raw githubusercontent com PX4 Firmware master
  • TFmini在nora+(px4)上的使用和验证

    目标 xff1a 使用tfmini完成定高实验 设置 xff1a 1 sens tfmini cfg 设置为telem2 xff08 可修改为其他 xff0c 保证硬件连线一致 xff0c 1一般是无线数传所以没改过去 其他的对应在官网里有
  • ROS | Realsense中的IMU解算orientation

    文章目录 概述 一 定义介绍 二 操作教程 一 下载并编译imu tools功能包 1 创建工作空间并初始化 2 下载imu tools并编译 二 修改配置 1 修改imu tools源码 2 修改launch文件 3 启动解算 概述 本文
  • prometheus服务监控之mysql监控

    文章目录 上传解压安装mysqld exporter安装mariadb在数据库里创建mysql账号用户收集数据在mysql exporter中设置mysql配置信息启动mysql exporter配置prometheus拉取mysql节点信
  • HTTP请求头Authorization

    今天部署了一个Authorization项目 xff0c 由于改了auth服务器客户端id和密码 xff0c 而前端请求header没有修改 xff0c 登录时一直弹框要求输入用户名和密码 xff0c 输入后却无效 xff0c 只好改前端代
  • c语言编程规范第三部分

    3 头文件应向稳定的方向包含 头文件的包含关系是一种依赖 xff0c 一般来说 xff0c 应当让不稳定的模块依赖稳定的模块 xff0c 从而当不稳定的模块发生变化时 xff0c 不会影响 xff08 编译 xff09 稳定的模块 就我们的
  • 看完《C++ primer》后,我都收获了什么?

    文章目录 1 语言只是一个工具2 光学会一门语言还不够3 结语 迫于读研和未来就业的压力 xff0c 我研一上自学了C 43 43 的这门语言 xff0c 自我感觉比较认真的看完了 C 43 43 primer 这本书的大部分章节 xff0
  • Ubuntu18.04 ROS Melodic版本安装gazebo_ros_pkgs包

    疫情期间宅在家没法做实验 xff0c 只能上手gazebo做仿真 xff0c 导入实验室机器人的相关文件后 xff0c 打算看看效果 xff0c 运行代码 roslaunch probot gazebo probot anno gazebo
  • vim如何批量注释

    1 ctrl 43 v 进入 2 按箭头 选中要注释的首行 3 按下大写 i 进入插入模式 4输入 按esc 就可以看到如下内容
  • 还弄不明白【委托和事件】么?看这一篇就足够了!!!

    这两个概念长时间不用了 xff0c 今天看到CAD二次开发中用到了自定义事件 xff0c 有点迷糊了 xff0c 索性再整理一下加深印象 xff01 一说到委托和事件 xff0c 他们总是绑定在一起的不可分割 xff01 可能你会说啊 xf
  • 三种简单排序(冒泡、插入、选择)的比较和图解

    冒泡排序 这种排序方式是最容易理解的 xff0c 主体思想就是 xff1a 指针重复地走访过要排序的数列 xff0c 一次比较两个元素 xff0c 如果他们的顺序错误就把他们交换过来 走访数列的工作是重复地进行直到没有再需要交换 xff0c
  • ModuleNotFoundError: No module named 'XXX'的解决办法

    类似问题一 ModuleNotFoundError No module named 39 captcha 39 pycharm打开的项目 xff0c 在虚拟环境里通过终端命令python manage py runserver运行pytho
  • 微信小程序实现搜索功能以及效果(超详细)

    我们先来看一下实现哪些功能 1 搜索历史记录以及清空历史记录 2 热门搜索推荐以及更新推荐内容 3 根据输入框输入的内容来自动搜索相关查询 后台逻辑是模糊查询 后台就先不扯了 这里我用的是自己定义的虚拟数据 暂时没用后台接口 可能有点问题
  • 微信小程序实现收货地址城市选择效果(添加收货地址)

    先来张效果图 这里主要是城市选择效果 请忽视其他 不要吐槽 谢谢 接下来看一下代码吧 wxml lt pages my my add address index wxml gt lt view class 61 34 redact addr
  • uni-app实现商城多商家购物车功能(超详细, 附带源码)

    我们先来看一下效果 有什么不懂可以直接下方留言 先来看代码 lt template gt lt view class 61 34 cart 34 gt lt 购物车为空 S gt lt view v if 61 34 cartList le
  • 微信小程序web-view的使用教程

    最近公司有需求 xff0c 需要点击小程序首页banner xff0c 跳转到别人的h5页面 首先是域名的问题 xff1a 步骤 xff1a 先登录小程序开发平台 xff0c 将页面需要跳转的域名写上去 xff0c 注意了 xff0c 域名
  • uni-app实现上传图片裁剪效果(附源码)

    我们先来看一下效果 封装一个组件在components下创建一个 文件夹随意命名 xff0c 这里我是uni img cropper uni img cropper vue lt template gt lt view class 61 3
  • js 一维数组和二维数组实现足迹、浏览记录等场景

    再开发过程中 xff0c 再没有接口提供的情况下来实现浏览记录或者搜索记录等场景 我们可以利用本地缓存实现 xff0c 废话不多说 xff0c 直接上代码 xff1a 多维数组 64 param Array arr 数组 64 param
  • Markdown使用(超详细)

    xff08 HBuilderX xff09 掌握md及HBuilderX对md的强大支持 如果没有点右键设置自动换行 xff0c 可按Alt 43 滚轮横向滚动查看 很多人只把markdown用于网络文章发表 xff0c 这糟蹋了markd

随机推荐