2015-04-15 249 views
2

我正在使用gcc編譯器爲STM32編寫C代碼,我嘗試了一些建議。 我通過i2c.h definiton從i2c.c調用函數。可能是我在那裏犯錯了。 感謝您的意見。從'uint8_t * {aka unsigned char *}'無效轉換爲'const char *'[-fpermissive]

(i2c.h中)

#define Chip_TxBurst(wREG, wCNT, pbDATA) \ 
    I2C_TxBurst((0xC0) | (((wREG) >> 7) & 0x1E), (wREG), (wCNT), (pbDATA)) 

(i2c.c)

void I2C_TxBurst (
uint16_t bSLA,   /* I2C slave address */ 
uint16_t bREG,   /* I2C sub-address */ 
uint16_t bCNT,   /* The number of data which will be transmitted */ 
uint8_t *pbDATA  /* Point to the first DATA item */ 
) 
{ 
    uint8_t bIdx; 

    for (bIdx = 0; bIdx < bCNT; bIdx++) 
    { 
     I2C_TxData(pbDATA[bIdx]); 
    } /* for */ 

    } /* I2C_TxBurst */ 

(osd.c)

void OSD0_TEXT(uint8_t  *TEXT, 
        uint8_t  FONT_SIZE_X, 
        ...... 
        ) 
{ 
    Chip_TxBurst(0x400, FONT_SIZE_X, TEXT); 
} 

(主)

main{ 
OSD0_TEXT("STAY FOLISH",11); 
} 
# #

(老問題代碼)

void OSD0_TEXT ( uint8_t  *TEXT) 
{ 
..... 
TxBurst(0x400, strlen(TEXT), TEXT); 
..... 
} 
main{ 
OSD0_TEXT("STAY FOLISH"); 
} 
+2

你傳遞'炭[N]'給需要'uint8_t'和你傳遞'uint8_t'給一個函數('OS0_TEXT')一個函數('strlen')需要'const char *'。 –

回答

1

嚴格地說,uint8_tchar不一定是兼容的,因爲char具有實現定義的符號性和可能是在某些編譯器有符號的類型。

在實踐中,鑄造/從uint8_t /從charchar用於存儲ASCII字符會一直工作,因爲有負指數沒有符號表。

側面說明:

  • 你應該總是力求const正確性,尤其是創建指向字符串常量時。

  • 字符串文字的大小可以在編譯時計算,以節省一點時間。

  • main()在我見過的裸機ARM系統上返回void。它不會返回int,因爲這沒有任何意義(返回給誰?)。

因此,對於你的代碼正確的解決方法是:

void OSD0_TEXT (const uint8_t* TEXT, size_t size) 
{ 
    ... 
    TxBurst(0x400, size, TEXT); 
    ... 
} 

void main (void) 
{ 
    static const char STR[] = "STAY FOOLISH"; // static to ensure it wont end up in RAM 
    const size_t STR_LEN = sizeof(STR) - 1; 

    OSD0_TEXT((const uint8_t*)STR, STR_LEN); 
} 
0
void OSD0_TEXT ( const char *TEXT) 
{ 
..... 
TxBurst(0x400, strlen(TEXT), TEXT); 
..... 
} 
main{ 
OSD0_TEXT("STAY FOLISH"); 
} 
相關問題