我有一个函数应该初始化一个长度为3的数组并返回它。请参阅下面的代码。它到目前为止工作,但只适用于某些颜色。当我尝试写紫罗兰时,我认出了代码中的一个错误。当我写紫罗兰时,我有一个尾随的橙色元素。为什么这样,我该如何解决?我有更多像这样定义的颜色数组,其中一些似乎“泄漏”颜色。我想如何初始化数组有些不对劲。希望有人可以对此有所了解。
#define LEDS 64
struct array{ unsigned char hex[LEDS * 3]; };
struct array init_array(int r, int g, int b) {
int i;
struct array z;
//GRB data, 3 bits for each color
for(i = 0; i < sizeof(struct array) / sizeof(char); i++) {
if(i == 0) z.hex[i] = g | 128;
else if(i==1) z.hex[i] = r | 128;
else z.hex[i] = b | 128;
}
return z;
}
...
struct array orange;
struct array violet;
...
violet=init_array(173, 141, 171);
orange=init_array(192, 145, 128);
while(1) {
for(i=0; i<=LEDS; i++) {
transfer(fd, violet.hex, sizeof (violet.hex));
}
for(i=0; i<=LEDS; i++) {
transfer(fd, orange.hex, sizeof (orange.hex));
}
}
这是传递函数:
void transfer(int fd, char* tx, uint32_t len) {
int ret;
uint8_t rx[sizeof (&tx)] = {0,}; // RX buffer
struct spi_ioc_transfer data = {
.tx_buf = (unsigned long) tx,
.rx_buf = (unsigned long) rx,
.len = len,
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
.cs_change = 0,
};
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &data);
if (ret < 1)
pabort("can't send spi message");
usleep(50);
}
答案 0 :(得分:1)
在您的代码中,数组类型定义为
struct array {unsigned char hex[LED * 3];};
LED定义为64,因此您要初始化一个3 * 64 = 192个无符号字符的数组,每个字符为一个字节。你确定这是你想要的吗?
此外,从init_array代码中,您分别给出绿色和红色一个字节。请注意,z.hex [0]是无符号字符,因此是z.hex [1]。对于剩下的190个字节,你给b | 128为所有人。这绝对不是RGB的工作方式。
假设您需要3个64位无符号值来保存每个RGB值,而不是使用for循环一次,您应该进行三个循环,每个循环用于R,G或B.在每个循环中,基于RGB值,填充64位,即8个字节。所以你的LED应该被定义为每个颜色空间8个无符号字符。
答案 1 :(得分:1)
如果你的数组代表64个LED,颜色如下:
+-----------------------------------
| g | r | b | g | r | b | g | r | b ... and so on
+-----------------------------------
您的代码实际上是这样初始化它们:
+-----------------------------------
| g | r | b | b | b | b | b | b | b ... and so on
+-----------------------------------
您可能希望这样做,而不是像第一个例子中那样设置颜色
for(i = 0; i < sizeof(z.hex); i += 3) {
z.hex[i ] = g | 128;
z.hex[i + 1] = r | 128;
z.hex[i + 2] = b | 128;
}
(请注意|128
始终设置每种颜色的最重要位,您需要验证这是您真正想要的那样)
如果这不相关,请更新您的帖子并说明您想要做什么,为什么LEDS被定义为64,以及每个LEDS * 3 = 192字节用于什么,发布传输代码()并解释它应该做什么。
答案 2 :(得分:0)
异常但几乎有效的初始化需要进行调整:int j = i % 3
struct array init_array(int r, int g, int b) {
int i;
struct array z;
printf("%u ", (unsigned) (sizeof(struct array) / sizeof(char)));
//GRB data, 3 bits for each color
for (i = 0; i < sizeof(struct array) / sizeof(char); i++) {
int j = i % 3;
if (j == 0)
z.hex[i] = g | 128;
else if (j == 1)
z.hex[i] = r | 128;
else
z.hex[i] = b | 128;
}
return z;
}
答案 3 :(得分:0)
据我所知,在你的例子中,你想要使用相同的3 * 8位RGB颜色将所有64个LED更改为紫罗兰色,而不是橙色,紫罗兰色等等。
考虑这样一个结构:
struct color {
char green;
char red;
char blue;
};
在堆栈上创建颜色结构(此处,不在init fkt的框架中!):
struct color violett, orange;
初始化
init_array( *col, int r, int g, int b) {
col->red = r | 128;
col->green = g | 128;
col->blue = b | 128;
}
...
init_array(&violet, 173, 141, 171);
init_array(&orange, 192, 145, 128);
转到您的转帐fkt:
while(1) {
for(i=0; i<=LEDS; i++) {
transfer(fd, &violet, sizeof (struct color));
}
for(i=0; i<=LEDS; i++) {
transfer(fd, &orange, sizeof (struct color));
}
}
使用提供的传输fkt写入LED。 玩得开心: - )
答案 4 :(得分:-1)
你的代码有很多问题..
for(i = 0; i&lt; LEDS; i ++){
z.hex[i] = g|128;
z.hex[i + 1] = r|128;
z.hex[i + 2] = b|128;
}
和其他人一样:返回价值,通过参考转移......
对不起,c剂量不包含引用,以struct array init_array(int r,int g,int b)为例:
int init_array(array* z, int r, int g, int b){
int i;
//GRB data, 3 bits for each color
for(i = 0; i < LEDS; i++) {
z->hex[i] = g|128;
z->hex[i + 1] = r|128;
z->hex[i + 2] = b|128;
}
return z;
}
它使用一个点将z转换为init函数,而不是返回一个新数组。