[英]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.