2

我正在使用这样的结构与 spidev 传输一些数据

struct spi_ioc_transfer tr = {
    .tx_buf = (unsigned long)tx,  // transferred 
    .rx_buf = (unsigned long)rx,  // received
    .len = ARRAY_SIZE(tx),
    .delay_usecs = delay,
    .speed_hz = speed,
    .bits_per_word = bits,
};

我要发送的数据是uint8_t tx[] = {0xAC, 0xDC} 所以我要像这样转换数组:msg.tx_buf = (unsigned long)tx;

但这不利于可移植性,并且依赖于字节序。有没有更好更快的方法来做到这一点?我还需要比较 msg.tx_buf 和 msg.rx_buf 的值,以确保正确写入值。

谢谢

4

3 回答 3

2

如果您的“spidev”期望发送 32 位字(bits是 32),那么您需要重新排列内存中的数据以正确布局。

你需要做:

const uint32_t tx32[] = { tx[0], tx[1] };

然后将.tx_buf值设置为tx32,假设它想要发送数据的地址。记住要确保.len正确设置为 2,仍然。

于 2013-09-06T09:19:56.270 回答
1

您可以使用位和移位操作组合这两个值:

tx_buf = tx[ 0 ] | (TX[1]<<8);

它是便携的,很容易理解。

于 2013-09-06T09:22:35.543 回答
-1

您可以使用:

uint8_t tx[] = {0xAC, 0xDC};
unsigned long* longDataPtr = reinterpret_cast<unsigned long*>(tx);

现在longDataPtr是指向结果的指针。

但是,要使用,reinterpret_cast您需要sizeof(unsigned long)在缓冲区中有元素,否则结果将被破坏。

于 2013-09-06T09:11:29.600 回答