2

除了呼吸之外,我在所有方面都是新手,如果我不清楚,很抱歉,但这里是:

我在 C 中有一个函数,它通过 I2C 总线将字节写入电路,在头文件中它看起来像这样:

BOOL WINAPI JidaI2CWrite(HJIDA hJida, DWORD dwType, BYTE bAddr, LPBYTE pBytes, DWORD dwLen);
  • hJida:板把手。
  • dwType:I2C 总线的从零开始的编号。
  • bAddr:I2C 总线上设备的地址,写入总线时的完整 8 位。
  • pBytes:指向包含字节的位置的指针。
  • dwLen:要写入的字节数。

如果我只想将一个字节写入地址为 0x98 的电路,我会这样做:

unsigned char writing[1];
writing[0]=0x10;

unsigned char *pointer;
pointer = &writing[0];


JidaI2CWrite(hJida,0,0x98,pointer,1);

这似乎可行,但如果我想写两个字节,比如 0x10FF,它不会。那么如何创建一个指向两个字节而不是一个字节的指针呢?

谢谢

4

5 回答 5

10

你想要这样的东西:

unsigned char writing[2];
writing[0] = 0x01;
writing[1] = 0x02;

JidaI2CWrite(hJida, 0, 0x98, writing, 2);

请注意,C 中的数组通常可以像指针一样使用。该变量writing可以被认为只是一个指向一块内存的指针,在这种情况下,它的大小为 2 个字节。创建另一个指向该位置的指针是多余的(在这种情况下)。

请注意,您可以使其指向任意数量的字节:

unsigned char writing[12];

//fill the array with data

JidaI2CWrite(hJida, 0, 0x98, writing, 12);
于 2009-08-19T13:32:29.163 回答
6

尝试这个...

//A buffer containing the bytes to be written
unsigned char writeBuffer[] = {0x10, 0xFF}; 

//writeBuffer itself points to the start of the write buffer
//you dont need an extra pointer variable
//Indicate the size of the buffer in the call to the function
//pointers do not carry array size information with them (in C/C++)
JidaI2CWrite(hJida,0,0x98,writeBuffer,2); 

或者更好

unsigned char writeBuffer[] = {0x10, 0xFF};

JidaI2CWrite(hJida,0,0x98,writeBuffer
              ,sizeof(writeBuffer)/sizeof(unsigned char));

注意:sizeof(writeBuffer)/sizeof(writeBuffer[0])自动为您计算数组的大小(以字节为单位)

于 2009-08-19T13:32:52.223 回答
1

看起来dwLen参数是要写入的字节数。所以:

unsigned char writing[2];
writing[0] = 0x10;
writing[1] = 0xff;
JidaI2CWrite(hJida, 0, 0x98, writing, 2);

请注意,您对pointer指向的使用writing[1]可能不应该像所写的那样工作,因为它设置pointer为指向您真正想要写入的字节之后的字节。我怀疑这是一个错字,但如果不是,您可能希望在继续之前查看您现有的代码。

于 2009-08-19T13:33:30.303 回答
1

writing已经是你想要的指针。

摆脱pointer.

JidaI2CWrite 的最后一个参数是要写入的字节数。

指针pBytes指向要写入的块的开头。

于 2009-08-19T13:35:37.603 回答
0

我看到 2 个选择:

1)分别写:

写作[0] = 0x10;写作[1] = 0xFF;

2)检查系统上的 short 是否为 2Bytes 并使用 short。

可能是 ((short*)writing)[0] = 0x10FF;

此外,您需要声明写作是字符写作[2];

然后,正如其他人所说,写2个字节......

于 2009-08-19T13:34:35.730 回答