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

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

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

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

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

2回答

4392閲覧

ArduinoとMATLAB間の複数種類のデータのシリアル通信

yataka1

総合スコア1

C

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

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2020/06/18 09:38

編集2020/06/18 09:41

目的はシリアル通信を用いてArduinoからMATLABへ複数種類のデータを送信しプロットするプログラムを作成することです。
Arduinoから送信するデータは値の試用としてsin、cosを使用しています。
単一のデータなら通信してプロットすることができたのですが複数種類を順次送信するとエラーは出ていないのですがMATLABではデータがすべてNaNになってしまいプロットに表示されません。
現在は2つのデータのプログラムですが将来的にはもっと沢山のデータを通信・プロットしたいと考えています。
原因と解決方法を教えてください。

単一データのプログラム
MATLAB

clear all clc s = serial('COM7', 'BaudRate', 9600, 'Terminator', 'CR', 'StopBit', 1, 'Parity', 'None'); fopen(s); t=1; out = 0; while(1) if (t<=30) fprintf(s,'1'); out(t) = str2double(fscanf(s)) else fclose(s); delete(s); clear s break; end t = t+1; end t=1:1:30; figure plot(t,out,'-.') hold on

Arduino

int i = 0; double u; void setup() { Serial.begin(9600); } void loop() { u=sin(i*50.0/360.0); Serial.print(u); Serial.write(13); Serial.write(10); i += 1; delay(1000); }

複数データのプログラム
MATLAB

s = serial('COM7', 'BaudRate', 9600, 'Terminator', 'CR', 'StopBit', 1, 'Parity', 'None'); fopen(s); a=1; t=1; N=30; out = zeros(2,N); while(1) if (t<=N) fprintf(s,'1'); out(1,:) = str2double(fscanf(s)); s.BytesAvailable; fprintf(s,'2'); out(2,:) = str2double(fscanf(s)); s.BytesAvailable; else fclose(s); delete(s); clear s break; end t = t+1; end t=1:1:30; figure plot(t,out(1,N),'-.') hold on plot(t,out(2,N),'-.') hold on

Arduino

int i = 0; double u; double a; void setup() { Serial.begin(9600); } void loop() { u=sin(i*50.0/360.0); a=cos(i*30.0/360.0); Serial.print(u); Serial.write(13); Serial.write(10); Serial.print(a); Serial.write(20); Serial.write(23); i += 1; delay(10); }

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

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

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

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

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

guest

回答2

0

MATLABのシリアルは知りませんが、

Arduino

1 Serial.write(20); 2 Serial.write(23);

の間違いがNanの原因でしょう。
ベタな数字を書くのはやめて、

Arduino

1const int CR=13; 2const int LF=10;

としておいて、

Arduino

1Serial.println(a); 2serial.write(CR); 3serial.write(LF);

とするか、それよりもっといいのは

Arduino

1Serial.println(u); 2Serial.println(a);

として機械に任せてしまうのが間違いを防ぐ方法かと思います。

ついでに言えば、MATLAB側でfprintf(s,'1');としているのはArduinoに送るべきデータを指示しているのではないですか? であれば、Arduino側ではそれを受信して送るべきデータを切り替えるような処理があって然るべきではないでしょうか。

投稿2020/06/18 13:36

thkana

総合スコア7703

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

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

0

回答ではありませんが、

将来的にはもっと沢山のデータを通信・プロットしたいと考えています。

のとこらへんの考え方を書いておきます
多数のデータを送る場合には、通信のデータフォーマットを決め、データ種類、データ、必要とあればチェックデータ、終端記号(改行?)をひとまとめとしたメッセージ単位で通信する必要があります
終端記号を改行とするならば、1行で一つのメッセージとなります

受信側では、改行が来るまでバッファに受信文字列として貯めていき、決められたフォーマットに従い、データ種類によりデータを振り分けていく形となります

投稿2020/06/18 12:30

y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問