zoukankan      html  css  js  c++  java
  • 如何利用c中的指针实现两个8bit的数合并为16bit

    对于从事单片机开发,进行单片机c语言开发的人来说,在对外部信息采集回来的数据进行处理,经常会用到,将采集到的第一个字节作为高8位,采集到的第二个字节作为低8位,从而构成1个16bit的数,得到一次完整的数据。那么如何来实现呢。

    方法1:

    比较普遍的做法是通过移位思想,

    eg:

    void get_data(u16 *p);

    void main()

    {

    u16 data;

    get_data(&data);

    }

    void get_data(u16 *p)

    {

    u8 buf[2];

    u16 temp;

    buf[0]=s_read();

    buf[1]=s_read();

    temp=buf[0]<<8+buf[1];

    *p=temp;

    }

    【注:上面的数据类型定义是采用STM32中的数据类型来定义的,不是标准C,上面程序这样写主要是与下面的形成对比】




    方法2:通过指针来实现

    指针变量作为函数参数,这样在函数中修改实参所对应的地址中存放的数,【通过指针修改实参指针变量所指的值】

    eg.

    void get_data(u8 *p);

    void main()

    {

    u16 data;

    get_data((u8)&data);

    }

    void get_data(u8 *p)

    {

    *p=s_read();

    *(p+1)=s_read();

    }

    这样我们分析一下,由于u16占用两个字节,u8占用1字节,这样形参p中存放的地址和实参&data是相同的,

    我们通过对p地址,p+1地址中赋值,从而对实参&data地址进行了赋值。

    这就是通过指针实现题目的要求。


    但是有个问题,方法二和方法一得到的结果一样吗?

    这里就有了字节序的概念,即低地址中存放高位,还是地址中存放高位。

    即大端模式和小端模式。可以参考这篇文章 大端模式和小端模式参考

    PC机是小端模式,所以上述两种方法得到的结果不一致。

    单片机:51单片机是大端模式,上诉结果一致,

    stm32是小端模式,上述两种方法结果不一致。

    所以需要根据具体的处理器是大端模式,还是小端模式来进行处理。





  • 相关阅读:
    sql 修改表名、列名、列类型
    .Net WinForm下配置Log4Net(总结不输出原因)
    ubuntu20.04 搭建门罗币节点
    python2 和 python3里StringIO和BytesIO的区别
    java.lang.IllegalArgumentException: java.lang.ClassCastException
    iphoneX安全边界
    ios中禁用回弹效果
    将nodejs回调方法变为promise
    实现trim方法
    flex实现三个div上中下布局
  • 原文地址:https://www.cnblogs.com/stoneFang/p/6715334.html
Copyright © 2011-2022 走看看