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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1578閲覧

【C言語】Arduinoから送信されたバイナリデータを,PCで受信し,float型, int型として表示したい

takeru_k250

総合スコア11

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/02/12 09:32

使用する物:Arduino,PC(ubuntu16)

したいこと:
C言語を使い,Arduinoからシリアル通信で送られてくるバイナリデータをfloatやintとして表示したいです.

現状:
PC側でバイナリデータは読み込めており,ビッグエンディアンとリトルエンディアンの入れ替えもできているのですが,printf関数を使用してfloatやintとして表示することが出来ません.

よろしくお願いいたします.

以下にArduinoとPC(C言語)のソースコードを貼ります.

Arduino(送信側)

1typedef union { 2 int val; 3 byte binary[2]; 4} u; 5 6typedef union { 7 float val; 8 byte binary[4]; 9} uf; 10 11uf v; 12u fg; 13 14void setup() { 15 // put your setup code here, to run once: 16Serial.begin(115200); 17v.val = 3.14159; 18fg.val = 1997; 19} 20 21 22void loop() { 23 // put your main code here, to run repeatedly: 24 Serial.write(0xff); 25 Serial.write(v.binary, 4); //Z 26 Serial.write(fg.binary, 2); //fg 27 delayMicroseconds(1); 28}
typedef union { int val; unsigned char binary[2]; } u; typedef union { float val; unsigned char binary[4]; } uf; /*****************ここからIArduinoの取得***********************************************************/ int main(){ int plen; int pret; int psize; int32_t v1; int16_t v2; uf vp1; u fg; fdp = open("/dev/ttyACM0", O_RDWR);         /*ポートは開ける*/ if(fdp < 0){ printf("open error\n"); return -1; } while (1){ plen = read(fdp, prs_buf, P_BUFF_SIZE); if(plen == 7 && prs_buf[0] == 0xFF){/*Arduinoから送られてきたデータが5byteで,かつ1番目が0xFFのとき,データを取得*/ /* v1 |= prs_buf[4]; v1 <<= 8; v1 |= prs_buf[3]; v1 <<= 8; v1 |= prs_buf[2]; v1 <<= 8; v1 |= prs_buf[1]; v2 |= prs_buf[5]; v2 <<= 8; v2 |= prs_buf[6]; vp1 = v1; fg = v2; printf("%f\n",vp1); printf("%d\n",fg); wait(10000); */ vp1.binary[0] = prs_buf[4];   /*各prs_buf[]にバイナリデータが格納されていることも確認済みです*/ vp1.binary[1] = prs_buf[3]; vp1.binary[2] = prs_buf[2]; vp1.binary[3] = prs_buf[1]; fg.binary[0] = prs_buf[5]; fg.binary[1] = prs_buf[6]; printf("%f\n",vp1.val);   /*うまく表示できない*/ printf("%d\n",fg.val);    /*うまく表示できない*/ wait(100000); } } }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2020/02/12 10:06

int が2バイトで、floatが4バイトとしていますが、本当にそのサイズであっているのですか?
yuki23

2020/02/12 11:13

「うまく表示できない」とは、どのように表示されるのですか?
takasima20

2020/02/12 11:14

typedef の方は int16_t とかじゃなくてもいいの?
guest

回答2

0

ベストアンサー

よくわからないが、Arduinoはリトルエンディアンとよく書いてあるから、
PC がビッグエンディアン?

prs_buf から vp1,fg のデータ移し替えは int 用と float 用 逆だけど。

で、int は、Arduino も ubuntu16 も 2byte なの?
普通に考えると、ubuntu は int は 32bit だと思うけど。

投稿2020/02/12 11:40

PingHermit

総合スコア478

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PingHermit

2020/02/12 11:45

あ、解決したのね。
guest

0

他のサイトで必要と書かれていたエディアンの入れ替えが不要だったようです…
お騒がせいたしました。

投稿2020/02/12 11:36

takeru_k250

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問