我如何将字节推入C中的缓冲区?

问题描述 投票:1回答:1

我必须通过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函数,该函数具有一个指针uint8_t数据作为参数,该数据用于通过总线发送的缓冲区以及缓冲区的长度。

我想为应用程序软件编写一个功能,应用程序可以使用该功能将缓冲区发送到显示器,但是首先,总线必须将数据流即将到来的命令发送到显示控制器。

我不能两次调用传输,因为这样控制器将在总线上两次发送从属地址。

我不想使用memcpy

c i2c
1个回答
0
投票

首先malloc()具有额外长度的缓冲区。然后使用memcpy()放置0x40,然后复制缓冲区。我对字节的处理总是有点不同。

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

在您的情况下,您需要使用malloc() & memcpy(),因为您不确定要发送多少长度。

另一个解决方案是先发送第一个0x40,然后发送其余的缓冲区(如果您的情况可行,请发送idk)。

或记住多余的字节,然后执行buffer | 0x4000,其中零的总数是您可以通过uint32_t variable = 0x40;variable << length*2;轻松设置的偏移量。使用这种方法时,您必须牢记额外的缓冲区长度。

© www.soinside.com 2019 - 2024. All rights reserved.