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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Arduino

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

Q&A

解決済

2回答

1730閲覧

C#でシリアル通信にて2つ以上の圧力センサの値を読み込む

yakoumori

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Arduino

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

0グッド

0クリップ

投稿2019/01/06 16:11

前提・実現したいこと

VisualStudioにて圧力センサを複数利用して複数のデータを送信し、その値を利用して画面の明るさを変更しようしています。
2つの圧力センサをArduinoに接続させそのデータを受信させることはできました。
イメージ説明
イメージ説明

1つのデータをint型にして画面の明るさを変えることはできたのですが、
2つのデータをint型にしてディスプレイの画面の明るさを変えることができませんでした。
データを区切り、それぞれを格納しなければならないことはわかったのですが、
データを1つ1つに区切る方法がわかりません。
画像は str = serialPort1.ReadLine();を利用して読み込んでいます。

ソースコード

C#

1    //データをシリアル通信にて受信した場合 2 private void serialPort1_DataReceived_1(object sender, SerialDataReceivedEventArgs e) 3 { 4 str = serialPort1.ReadLine(); 5 AddLogDelegate dlg1 = new AddLogDelegate(AddLog); 6 BeginInvoke(dlg1, new object[] { str }); 7 } 8 9 private void AddLog(String text) 10 { 11 //ここで受信した文字列をint型に変更する 12 //int val = int.Parse(str); 13 14 //リストボックスにシリアル通信で得たデータを書き込む 15 listBox1.Items.Insert(0, text); 16 17 //画面の明るさを受信したデータと同じようにする 18 //SetACBrightness(val); 19     } 20

現状listboxにstr型で読み込んだデータを書き込んでいます。

補足情報(FW/ツールのバージョンなど)

VisualStudio2013を利用しています。

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

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

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

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

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

guest

回答2

0

自己解決

C#

1 //受信した複数のデータを分割する 2 char[]separator=new char[]{' ','\t','\n'}; 3 string[]val=str.Split(','); 4 5 6 if (val.Length == 5) 7 { 8 9 int val1 = int.Parse(val[0]); 10 int val2 = int.Parse(val[1]); 11 int val3 = int.Parse(val[2]); 12 int val4 = int.Parse(val[3]); 13 int val5 = int.Parse(val[4]);

Splitを使用して解決しました。

投稿2019/02/19 13:05

yakoumori

総合スコア12

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

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

0

センサー1とセンサー2の値の区切りが何なのか分かりませんが、
String.Splitメソッドを使えばよろしいかと

C#

1string txt = "123 456"; 2string[] values = txt.Split(' '); 3 4Console.WriteLine($"value1 = {values[0]},value2 = {values[1]}");

投稿2019/01/06 22:14

YAmaGNZ

総合スコア10222

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

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

yakoumori

2019/01/07 04:31

回答ありがとうございます。教えていただいたコードを使用して1つの文字列で受信していた2つのデータを分けることができました。 ですが、ハンドルされていない例外が発生しているというエラーメッセージが利用したコードの場所に書かれていました。 private void AddLog(String text) { //受信した複数のデータを分割する char[]separator=new char[]{' ','\t','\n'}; string[]val=str.Split(separator,StringSplitOptions.RemoveEmptyEntries); int val1 = int.Parse(val[0]); int val2 = int.Parse(val[1]); int ave = (val1 + val2)/2; //ここで受信した文字列をint型に変更する //int val = int.Parse(str); //リストボックスにシリアル通信で得たデータを書き込む listBox1.Items.Insert(0, ave); //画面の明るさを受信したデータと同じようにする //SetACBrightness(ave); } 現状2つのデータを平均化することでディスプレイの照度の変更ができるようになってはいるのですが、 int val1 = int.Parse(val[0]); int val2 = int.Parse(val[1]); の部分で入力文字列の形式が正しくないとの表示が出ます。
YAmaGNZ

2019/01/07 04:40

デバッガで分割された結果の値を確認してみてください。
hillacken

2019/01/07 23:15

空白' 'で区切った後のval[1]にはデータが入っていないのではないでしょうか? int val2 = int.Parse(val[1]); この行で例外がでていませんか?
yakoumori

2019/01/08 03:27

その行で例外が出ています。 データが入っているかどうかの確認もしましたが、お察しの通り入ってませんでした。 受信した文字列がうまく分けられていないんですかね?
YAmaGNZ

2019/01/08 03:38 編集

デバッガでvalを見れば、要素がいくつあって、中身がどうなっているか分かるはずです。 実際にどのようなデータを受信しているかは私たちには分かりませんので、ご自身で確認してください。 そこで、例えば val[0] : 61 val[1] : 何かしらの文字 val[2] : 64 となっているかもしれませんし、分割の区切りに指定しているスペース、タブ、改行以外の文字が区切りとなっていて val[0] : "61 64" となっているかもしれません。
yakoumori

2019/01/08 03:49

要素の中に文字は入っていませんでしたが、現状本来5つ受信するはずのデータが4つしか入っていないことがわかりました。
YAmaGNZ

2019/01/08 04:44

受信したデータは2つなのではないのですか?質問もこちらの回答も2つである前提です。 それが「本来5つだが4つしか入っていない」と言われましても、こちらは何のことかさっぱり分かりません。 ただでさえ、本来受信しているデータの詳細が分からないのですから、これ以上は答えようがありません。 ここで解決したいのであれば、最低でも現在どのようなデータを受信し、これをどのように分割するのか第三者にも明確に分かるよう示してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問