結構體: 在單片機開發中,經常會遇到要初始化一個外設,比如串口,它的初始化狀態是由幾個屬性來決定的,比如串口號,波特率,極性及模式。對于這種情況,在我們沒有學習結構體時,我們一般的方法是:
void USART_Init( u8 usartx , u32 BandRate , u8 parity , u8 mode );
這種方式是有效的同時在一定場合是可取的。但是試想,如果有一天,我們希望往這個函數里再傳入一個參數,那么勢必我們需要修改這個函數的定義,重新加入字長這個入口參數。于是我們的定義被修改為:
void USART_Init( u8 usartx , u32 BandRate , u8 parity , u8 mode , u8 wordlength );
但是如果我們這個函數的入口參數是隨著開發不斷的增多,那么是不是我們就要不斷的修改函數的定義呢?這是不是給我們開發帶來很多的麻煩呢?那又怎樣解決這種情況呢?
這樣如果我們使用到結構體就能解決這個問題了。我們可以在不改變入口參數的情況下,只要改變結構體的成員變量,就可以達到上面改變入口參數的目的。
結構體就是將多個變量組合為一個有機的整體。上面的函數,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;
于是,我們在初始化串口的時候入口參數就可以是USART_InitTypeDef類型的變量或者指針變量了,MDK中是這樣做的:
void USART_Init( USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct );
這樣,任何時候,我們只需要修改結構體成員變量,往結構體中間加入新的成員變量,而不需要修改函數定義就可以達到修改入口參數同樣的目的了。
在以后的開發過程中,如果你的變量定義過多時,如果某幾個變量是用來描述某一個對象,你可以考慮將這些變量定義在結構體中,這樣也許可以提高你的代碼的可讀性。
|