簡體   English   中英

如何在 C 的緩沖區中推送一個字節?

[英]How can I push a byte in a buffer in C?

我必須通過 I2C 發送帶有數據像素的緩沖區,但首先,我必須使用顯示命令為緩沖區修補一個額外的字節。 如何在 C 中執行此操作?

//
//  Send a data byte sequence to the GDDRAM
//
static void ssd1306_WriteData(uint8_t *buffer,uint16_t length)
{
     uint8_t data[2] = {

     CNTRL_BYTE_SEND_DATA, /* 0x40 */

     buffer /* this does not work, I try to find a way to combine two buffers */

     };

    HAL_I2C_Master_Transmit(&SSD1306_I2C_PORT,SSD1306_I2C_ADDR,data,length,timeout);
} 

詳細地說,我有低級 I2C function,它有一個指針 uint8_t 數據作為參數,用於通過總線發送的緩沖區和緩沖區的長度。

我想為應用軟件寫一個function,應用程序可以通過它向顯示器發送緩沖區,但首先總線必須向顯示器發送controller,一個數據流即將到來的命令。

我不能兩次調用傳輸,因為 controller 將在總線上發送從地址兩次。

我不想使用memcpy

首先malloc()具有額外長度的緩沖區。 然后使用memcpy()放置0x40然后復制緩沖區。 我總是用字節做一些不同的事情。

volatile uint8_t data[2];
data[0] = address | 0x40; // multibyte write enabled
data[1] = value;

在您的情況下,您需要使用malloc() & memcpy() ,因為您不確定要發送什么長度。

另一種解決方案是發送第一個0x40 ,然后發送緩沖區的 rest(如果這適用於您的情況,則為 idk)。

或者記住那個額外的字節並做buffer | 0x4000 buffer | 0x4000 ,其中零的總數是您的偏移量,您可以使用uint32_t variable = 0x40; 然后variable << length*2; . 使用這種方法,您必須記住額外的緩沖區長度。

預分配一個工作緩沖區,該緩沖區覆蓋最大命令大小,即 65536 字節,因為您的大小是 16 位 + 命令 header 大小。 您可以分配一個額外的頁面,以便對齊 memory。 然后可以使用簡單的 memcpy 復制和調度命令。 也許您不想使用 memcpy,因為需要分配臨時緩沖區。 這有幫助嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM