0

airspayce.com の RadioHead Packet Radio ライブラリを使用しています。例 (nrf24_reliable_datagram_client & server) では、文字列を前後に送信することで 2 つのノードが互いに通信できるようにしています。ここで、文字列の代わりに int を送信し、このデータで何かをしたいと考えています。これは、例で行うことです。

buf バイトを定義します。

uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];

この関数は次のデータを受け取ります。

manager.recvfromAckTimeout(buf, &len, 500, &from)

buf 変数を出力します。

Serial.print((char*)buf);

これまでのところとても良い.今私は次のようなことをしたい:

int value = (char*)buf;

または:

char value[10] = { (char*)buf };

しかし、私は得る:

invalid conversion from 'char*' to 'int' (or to 'char'...)

その次に、データを送信している反対側には、次のものがあります。

uint8_t data[] = { analogRead(A0) };

最初の質問のコードを使用して受信側でこのデータを印刷すると、奇妙な文字が表示されます。だから私は思った、試してみましょう:

Serial.print((char*)buf, DEC); // or BYTE

しかし、私は得る:

call of overloaded 'print(char*, int)' is ambiguous

私は何を間違っていますか?前もって感謝します!

4

1 に答える 1

0

配列を整数に代入して、要素を一緒にマージすることを期待することはできません。たとえば、それらをマージする方法をどのように知っているのでしょうか?

uint16_t を uint8_t[2] 配列に変換するには、次のようにします。

uint16_t analog = analogRead(A0); //read in as int.
uint8_t data[2] = {analog, (analog >> 8)}; // extract as {lower byte, upper byte)
Serial.write(data,2); //write the two bytes to the serial port, lower byte first.

uint16_t と 2 つの uint8_t の配列との結合を使用するなど、他の方法でも実行できますが、上記の方法の方が移植性が高くなります。ポインターを int に型キャストすることもできますが、一方の端でビッグ エンディアンを使用し、もう一方の端でリトル エンディアンを使用している場合は、配列内のデータを受信時に反転しない限り機能しません。

受信側の場合、次のようになります。

uint8_t data[2];
...
... //whatever you do to receive the bytes that were sent over serial.
...
//Now assuming that data[] contains the received bytes where:
//data[0] was the first in (lower byte) and data[1] was the second in (upper byte)
uint16_t merged = (data[1] << 8) | data[0]; //merge them back together

うまくいけば、それは役に立ちます。

また、「オーバーロードされたプロトタイプ」は、その特定の入力変数セットを取る関数が存在しないことを示しています。ただし、印刷クラスのヘッダーから、次のプロトタイプがあることがわかります。

write(const uint8_t *buffer, size_t size);

これはあなたが望むことをします - 指定された数の uint8_t を配列から出力します。

于 2014-07-05T16:17:37.110 に答える