質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

UDPでfloat型の値を送りたい.

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 148

WK_ZAKK

score 14

Arduino IDEを用いてESP32からRaspberry Piにfloat型のデータ送信したいのですが,うまく受け取ることが出来ません.
(Raspi側の受信にはNODE-REDを用いています.)
試しに

const int sensor_pin = 5;
int input_value = 0;
float convert_V = 0.00;
float i = 2.5;
int input_value_send = 0;

input_value = analogRead(sensor_pin);
convert_V = (input_value * 5 ) / 1024;

UDP.write(1);
UDP.write(100);
UDP.write(255);
UDP.write(256);
UDP.write(2.5);
UDP.write(i);
UDP.write(convert_V);
UDP.write(input_value);

input_value_send = input_value / 4;

UDP.write(input_value_send);


と送ってみたところ受信側結果は

1
100
255
0
2
2
0
0

186


だったので1byte以上の値を送ることが出来ないのかなという状況です.

UDP.writeを使ってfloat型の数値の送り方を教えていただきたいです.

追記::もしくは受信側に問題があるのでしょうか.
追記2::float型でデータを送信できたわけではないので自己解決方法で記入はしませんが,ひとまず,生データ2bitシフトしたデータ(4で割り算したデータ)を送信し,受信側で再度2bitシフトする(4で掛け算)という形をとりました.

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

お使いの言語は知りませんが、引数の値を持つ1バイトデータを送る機能のようなので、複数バイトのデータを送る場合は、バイトに分解して、1バイトずつ送る必要があります。
受信側では、受け取った複数のバイトから元データを組み立てる必要があります。

また、バイトオーダー(上位バイトを先に送るか、下位バイトから順に送るか)を送受信側で合わせておく必要があります。普通は、上位バイトから順に送ります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

UDP.writeには、

Syntax
UDP.write(message);
UDP.write(buffer, size);
message: the outgoing message (char)
buffer: an array to send as a series of bytes (byte or char)
size: the length of the buffer

という2つの書式があります
提示のコードでは、1バイトの送信となりますんで、そりゃバイトの範囲内でしか送信できません
ということでどうするかというと、そのFloatの数値を文字配列に文字列として展開し、それを送信することになります

char bff[32];
sprintf(bff,"%f\n",floatvalue);
UDP.write(bff,strlen(bff));

そして受信側では、改行で区切られた文字列を読み込み、floatに変換すればよろしい

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

はずしていたら、ごめんなさい。

通常は float を含む、実数の表現は、CPU のアーキテクチャ等に依存するので、通信には向きません。

一般的に、実数を通信に使用する場合は、送る側で、テキスト形式等にエンコードし、受信する側でデコードします。

蛇足)
正数であっても、2バイト以上になれば、エンディアンの影響を受けるので、これも通信には、ネットワークバイトオーダの変換を行うことになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/20 08:15

    ikadzuchi さんが、おいくつの方かは、存じませんが。「ほぼ例外なく」の、「ほぼ」の時点で例外はあるのですよね?
    そういう例外で痛い目に合ったことがないのかと思います。痛い目にあった経験では、確実なものを求めます。生の値に頼るのは危険であるという認識です。
    「テキスト形式は...データ量が多い点から、通信に向かない」に関しては、おっしゃる点、じゅうぶんわかります。
    実際、サンプリングレート最大 8000Hz のデータにそれより低いサンプリングレートのデータで、8、16、32ビット が混合しているデータを、周期的に通信するものでは、「テキスト形式」以外に別途、表現形式を定義して通信していました。

    キャンセル

  • 2019/09/20 09:40

    まあ悪魔の証明ですからねえ。
    私の知っているのはPICマイコンのライブラリで内部的に使われているもの(ビット配置が違うだけ; IEEEとの変換は用意されている)と、最近流行りのbfloat16(IEEEの前半のみとったもの)くらいですが、中にはIEEEと根本的に違う例えばIBMの古い16進のものなどを使っている環境も今もあるかもしれません。
    そのような環境で、IEEEとの変換も用意されていない場合も、無いとは言い切れません。
    一方、そのようなごく稀な環境を気にして欠点の多い方式を使うべきか(特に初心者に教えるべきか)という点について、私はそう思いません。
    (コードの簡単さを理由にテキスト形式を勧めるのなら有りだと思います)

    キャンセル

  • 2019/09/20 10:28

    おっしゃること、ごもっとも、ご意見は、納得できます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る