2012-01-15 40 views
1

我正在使用要在I2C上發送的數據填充陣列,下面的代碼顯示了我正在做什麼。對我來說這看起來很可怕。有沒有更好的/整潔的方式,任何人都可以推薦?C - 使用靜態數據填充結構的方法

感謝

#define DS1337_SECONDS_REG    0x00 
// Default values used for initialisation 
#define DS1337_DEFAULT_SECONDS   0x00 
#define DS1337_DEFAULT_MINUTES   0x00 
#define DS1337_DEFAULT_HOURS_HR_MODE 0x40 
#define DS1337_DEFAULT_DAY    0x00 /* Sun */ 
#define DS1337_DEFAULT_DATE    0x01 
#define DS1337_DEFAULT_MONTH   0x01 
#define DS1337_DEFAULT_YEAR    0x0C /* 2012 */ 
#define DS1337_DEFAULT_ALM1_SECS  0x00 
#define DS1337_DEFAULT_ALM1_MINS  0x00 
#define DS1337_DEFAULT_ALM1_HRS   0x00 
#define DS1337_DEFAULT_ALM1_DAY_DATE 0x00 
#define DS1337_DEFAULT_ALM2_MINS  0x00 
#define DS1337_DEFAULT_ALM2_HRS   0x00 
#define DS1337_DEFAULT_ALM2_DAY_DATE 0x00 

extern i2c_err_t i2c_send(const i2c_ch_t channel, const uint8_t data[], const uint32_t length, const i2c_stop_t stop); 

rtc_err_t ds1337_init(void) 
{ 
    uint8_t data_to_send[17] = { DS1337_SECONDS_REG,  /* Address of first register */ 
          DS1337_DEFAULT_SECONDS, DS1337_DEFAULT_MINUTES, DS1337_DEFAULT_HOURS_HR_MODE, 
          DS1337_DEFAULT_DAY, DS1337_DEFAULT_DATE, DS1337_DEFAULT_MONTH, DS1337_DEFAULT_YEAR, 
          DS1337_DEFAULT_ALM1_SECS, DS1337_DEFAULT_ALM1_MINS, DS1337_DEFAULT_ALM1_HRS, DS1337_DEFAULT_ALM1_DAY_DATE, 
          DS1337_DEFAULT_ALM2_MINS, DS1337_DEFAULT_ALM2_HRS, DS1337_DEFAULT_ALM2_DAY_DATE, 
          DS1337_CTRL_REG_INIT_VAL, /* Turn off the squarewave output pin */ 
          DS1337_CLEAR_STATUS_VAL /* Clear the status registers */ 
          }; 

if (i2c_set_address(DS1337_CHANNEL, DS1337_SPI_ADDRESS) != I2C_NO_ERROR) 
    return RTC_I2C_ADDRESS_ERROR; 

if (i2c_send(DS1337_CHANNEL, data_to_send, sizeof(data_to_send), STOP_CONDITION) != I2C_NO_ERROR) 
    return RTC_I2C_SEND_ERROR; 

//enable_interrupts(GLOBAL); 

return RTC_NO_ERROR; 
} 
+2

非常標準的方法。枚舉(而不是定義)不會使源代碼更短。在代碼中對常量進行硬編碼會使其不可讀。對'i2c_send()'和多個數組的多次調用大致相同,但可能稍大一點,但可讀性較差。定義一些函數來配置每一件小事是確保源代碼更大的肯定方法。我可能只是保持代碼的方式。 – 2012-01-15 18:47:15

+0

做出答案,@Alex – 2012-01-15 19:34:16

+0

@NiklasHansson:完成。 – 2012-01-16 05:10:59

回答

1

這是一個非常標準的方法。枚舉(而不是定義)不會使源代碼更短。在代碼中對常量進行硬編碼會使其不可讀。對i2c_send()進行多次調用並且沒有數組將會大致相同,但可能稍大一點,但可讀性較差。定義一些函數來配置每一件小事是確保源代碼更大的肯定方法。我可能只是保持代碼的方式。

+0

評論贊賞,我會堅持我所擁有的。 – integra753 2012-01-16 08:31:54

+0

@ integra753:不要忘記標記* *答案,如果你考慮這樣的話。 – 2012-01-16 08:51:49

+0

已經這樣做了(我是這個網站的新手!!)。 – integra753 2012-01-17 14:23:32

2

使用枚舉而不是#定義,我會說「12」,而不是「0x0C」於2012年

只考慮硬編碼「0」,在地方顯然未使用*ALM*值。

#include頭文件得到i2c_send()的聲明,而不是明確聲明它。

省略(即隱含)[17]數組大小 - 只是說[]並讓您打包的實際數據確定大小。

+0

考慮只用硬編碼「0」代替明顯未使用的* ALM *值。 – integra753 2012-01-16 08:29:06

+0

對不起,我應該提到我只在i2c_send()中複製,所以API是清晰的。 – integra753 2012-01-16 08:34:13