找回密码
 注册
关于网站域名变更的通知
查看: 1763|回复: 18
打印 上一主题 下一主题

单片机中"结构体"和"共用体"的妙用

[复制链接]
  • TA的每日心情
    开心
    2023-6-12 15:40
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2020-9-25 10:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    本帖最后由 mnfvbnk 于 2020-9-25 11:11 编辑 : v$ a* J% b9 D; ~8 [2 U& ]2 x3 o  F' s

    % X+ W2 q0 L% s  d: p* y$ mC语言的结构体和共用体,往往在单片机应用开发中被忽视。如果能够用起来,不仅能够极大的提高单片机的运行效率,还可能解决一些看起来无法解决的问题。
    ) @  t* M( E6 P, D& C# |, C现在,给大家举一个例子:单片机串口需要接收并处理大量数据的情况。
    # K, I# W6 q, Q3 Z4 z  L' U; P示例:单片机甲要与某个设备乙通信,它们采用串口连接,设备乙会给单片机甲发送串口数据,数据一共有46个字节,其中前8个字节表示命令,后8个字节表示设备信息,中间30个字节表示有效数据。
    1 i$ a0 c* r/ W0 @; V" @: d普通的程序代码,会进行如下变量定义:
    : R! q, i+ g& Q" g  P- i
    ) ^  x- R: y- i+ _8 I在串口中断函数中,使用rec_buf接收串口数据。此处省略接收代码,自行脑补。" r% o% O3 ~# `
    接收完毕后,再使用如下代码把对应的变量取出来。
    取出来之后,就可以在程序中使用了,比如,判断接收到的是什么命令,如下代码所示:
    ( u+ w* `" `; L7 T1 o( \8 K* d
    好!上面是普通的用法,接下来,我们使用结构体和共用体!

    7 f' m1 c1 r1 x
    上面代码中,我们使用了共用体和结构体的方法定义了串口接收缓存和串口命令、有效数据和器件信息变量。, A2 f5 U" w, r' w& l, G
    当我们在串口中断中接收完数据后。就可以直接使用这些变量了。例如:
    ; f$ g% f( @: G+ l1 t8 K9 s
    下面,我解释一下代码。" }% h# _. }& d8 T1 k! a: r! u+ u
    共用体的特点:内部的变量使用同一个首地址。在我们定义的共用体里面,有两个变量,一个是rec_buf,一个是ComInfo,所以,它俩的内存首地址是相同的。
    5 A) K, \4 j, V! H* l- p* {结构体的特点:内部的变量地址自增。在我们定义的结构体ComInfo中,command变量、valid_data变量、device_info变量使用同一片内存空间,地址连续。% C4 {/ w3 C' [: n. q) f& K
    基于以上共用体和结构体的特点,当我们接收完rec_buf以后,其实,数据就已经在结构体中的这3个变量中了,直接用就可以,省去了前面示例中“取出来”的环节。

      }, I7 i8 l5 E+ c7 q: q% n: y. _4 J8 q! Y0 R; C& @
    ( `0 T" N$ A( `7 z7 y
    9 g( u$ W7 S. J7 a- L  K! z
    : W; L. O5 ~% @: P
    , K! J- r3 w7 v1 X

      Q# i5 p6 L8 A/ M3 E; I
    ! f: k8 Q" Q, m% X1 n$ g5 t. W8 W, h* |8 R" W+ L0 u) I0 O
    8 h3 |2 _5 D  R( m! P

    & _0 L; m- }& x# W. D* J6 S' t" B/ w/ b" X
    $ a: }1 G+ m5 ^- _- A
  • TA的每日心情
    开心
    2023-5-30 15:22
  • 签到天数: 1 天

    [LV.1]初来乍到

    推荐
    发表于 2020-9-27 09:59 | 只看该作者
    行者~ABC 发表于 2020-9-27 09:48
    9 M: i& |9 K& R- Q# @& d. M讲的这么好,要是把指针带上就好了

    : c: e& C% \+ u, b2 I是的,指针和链表也很重要
  • TA的每日心情
    开心
    2023-6-12 15:40
  • 签到天数: 1 天

    [LV.1]初来乍到

    推荐
     楼主| 发表于 2020-9-27 10:01 | 只看该作者
    行者~ABC 发表于 2020-9-27 09:48
    1 r/ h4 p$ Z% @4 _( F$ o讲的这么好,要是把指针带上就好了

    6 O# W% ?) y% }指针比较难学
    ( w8 ~  l; A$ w

    该用户从未签到

    推荐
    发表于 2020-10-16 15:14 | 只看该作者
    ybing12 发表于 2020-10-16 14:455 l4 z! u0 r0 |! T% t. o
    这个讲的有点意思

    + p* Y8 M: K- D% o! S' m就是的,这一招很有用$ a9 N' e) f: E7 Q( {4 S
  • TA的每日心情
    开心
    2023-5-15 15:14
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-9-25 11:05 | 只看该作者
    结构体这块讲的透彻

    点评

    是的。讲的详细  详情 回复 发表于 2020-9-27 09:47

    该用户从未签到

    3#
    发表于 2020-9-27 09:47 | 只看该作者
    Heaven_1 发表于 2020-9-25 11:05
    4 ?- @% T/ U% R# n- o结构体这块讲的透彻

    + {9 x$ w2 J1 s! b3 b是的。讲的详细2 J7 c) m' q; N5 e# l# ]

    该用户从未签到

    4#
    发表于 2020-9-27 09:48 | 只看该作者
    讲的这么好,要是把指针带上就好了

    点评

    指针比较难学  详情 回复 发表于 2020-9-27 10:01
    是的,指针和链表也很重要  详情 回复 发表于 2020-9-27 09:59

    该用户从未签到

    7#
    发表于 2020-9-27 19:23 | 只看该作者
    结构体用的多,

    “来自电巢APP”

    点评

    这个结构体讲的比较到位,  详情 回复 发表于 2020-9-28 10:17
  • TA的每日心情
    开心
    2023-5-15 15:14
  • 签到天数: 1 天

    [LV.1]初来乍到

    8#
    发表于 2020-9-28 10:17 | 只看该作者
    awnatech 发表于 2020-9-27 19:23
    5 u+ m0 F0 Y$ r7 m- Y5 i结构体用的多,

    & e& g9 ]4 \5 y5 l$ @: W& N这个结构体讲的比较到位,+ F4 |' M5 }+ ?9 |8 G& I% X

    该用户从未签到

    9#
    发表于 2020-9-30 13:44 | 只看该作者
    哈哈,这个不错,容易理解

    该用户从未签到

    10#
    发表于 2020-10-12 13:27 | 只看该作者
    又学了一招。

    该用户从未签到

    11#
    发表于 2020-10-13 13:50 | 只看该作者
    这了讲的很妙,C语言想写好,没有指针,结构体是不可能的

    该用户从未签到

    12#
    发表于 2020-10-16 14:45 | 只看该作者
    这个讲的有点意思

    点评

    就是的,这一招很有用  详情 回复 发表于 2020-10-16 15:14

    该用户从未签到

    15#
    发表于 2020-10-22 10:04 | 只看该作者
    这块讲的好

    “来自电巢APP”

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-8-18 16:23 , Processed in 0.187500 second(s), 36 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表