打印
[牛人杂谈]

单片机中的结构体运用

[复制链接]
2003|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhuomuniao110|  楼主 | 2017-5-15 15:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

 结构体

  在 单片机开发中,经常会遇到要初始化一个外设,比如串口,它的初始化状态是由几个属性来决定的,比如串口号,波特率,极性及模式。对于这种情况,在我们没有学习结构体时,我们一般的方法是:

  void USART_Init( u8 usartx , u32 BandRate , u8 parity , u8 mode );

  这种方式是有效的同时在一定场合是可取的。但是试想,如果有一天,我们希望往这个函数里再传入一个参数,那么势必我们需要修改这个函数的定义,重新加入字长这个入口参数。于是我们的定义被修改为:

  void USART_Init( u8 usartx , u32 BandRate , u8 parity , u8 mode , u8 wordlength );

  但是如果我们这个函数的入口参数是随着开发不断的增多,那么是不是我们就要不断的修改函数的定义呢?这是不是给我们开发带来很多的麻烦呢?那又怎样解决这种情况呢?


沙发
zhuomuniao110|  楼主 | 2017-5-15 15:53 | 只看该作者

这样如果我们使用到结构体就能解决这个问题了。我们可以在不改变入口参数的情况下,只要改变结构体的成员变量,就可以达到上面改变入口参数的目的。

  结构体就是将多个变量组合为一个有机的整体。上面的函数,BandRate,wordlength,Parity,mode,这些参数,他们对于串口而言,是一个有机整体,都是来设置串口参数的,所以我们可以将他们通过定义一个结构体来组合在一个。MDK中是这样定义的:

  typedef struct

  {

  uint32_t USART_BandRate;

  uint16_t USART_WordLength;

  uint16_t USART_StopBits;

  uint16_t USART_Parity;

  uint16_t USART_Mode;

  uint16_t USART_HardwareFlowControl;

  } USART_InitTypeDef;


使用特权

评论回复
板凳
zhuomuniao110|  楼主 | 2017-5-15 15:54 | 只看该作者
 于是,我们在初始化串口的时候入口参数就可以是USART_InitTypeDef类型的变量或者指针变量了,MDK中是这样做的:
  void USART_Init( USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct );
  这样,任何时候,我们只需要修改结构体成员变量,往结构体中间加入新的成员变量,而不需要修改函数定义就可以达到修改入口参数同样的目的了。
  在以后的开发过程中,如果你的 变量定义过多时,如果某几个变量是用来描述某一个对象,你可以考虑将这些变量定义在结构体中,这样也许可以提高你的代码的可读性。

使用特权

评论回复
地板
dongnanxibei| | 2017-5-15 22:20 | 只看该作者
如果结构体用好了,可以写很多方便的程序。

使用特权

评论回复
5
dongnanxibei| | 2017-5-15 22:21 | 只看该作者
结构体的位段也是很神奇的一个东西。

使用特权

评论回复
6
稳稳の幸福| | 2017-5-15 23:13 | 只看该作者
可以返回多个值。

使用特权

评论回复
7
dongnanxibei| | 2017-5-16 10:08 | 只看该作者
不少单片机的某个外设的配置都是使用的结构体方式,这样可以封装的更彻底。

使用特权

评论回复
8
天灵灵地灵灵| | 2017-5-16 11:36 | 只看该作者
传递参数很方便。

使用特权

评论回复
9
捉虫天师| | 2017-5-16 16:27 | 只看该作者
普通的返回,只能返回一个变量,而作为结构体整体上看是一个大变量,是可以返回的

使用特权

评论回复
10
xixi2017| | 2017-5-16 23:02 | 只看该作者
用这个可以更好的封装函数,优化移植性

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

189

主题

3256

帖子

10

粉丝