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

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

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

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

解決済

c# シリアルポートからの受信データを複数のtextBoxに追加する

yellowcloak
yellowcloak

総合スコア2

C#

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

3回答

-1評価

1クリップ

444閲覧

投稿2022/04/22 08:22

編集2022/04/26 09:57

ご助言をいただきたくよろしくお願いします
serial通信で受信したデータを表示するGuiを作っています。
下記のようにして受信するところまではできました。 
受信データは64個の温度データです。
これをtextBox1-64にそれぞれ格納するようにしたいのですが、
どのようにしたらいいのかわからず困っています。
dataに格納された文字列型のデータをどのように処理したらいいのかご教示いただいたいです。
for文を使ってデータをそれぞれtextBox1~64へ格納したいです。
そこから何をしていったらいいのかわからず困っております。

dataに入っている中身は”3\r\n23\r\n22\r\n22\r\n22\r\n23\r\n…というように数字(温度)\r\nが64個繋がります。最初の3は固定値です。

private void SerialPort1_DataReceived_1(object sender, SerialDataReceivedEventArgs e) //! シリアルポートをオープンしていない場合、処理を行わない. if (serialPort1.IsOpen == false) { return; } else { string data = string.Empty; try { //受信データの読み取り data = serialPort1.ReadExisting()   } catch (Exception ex) { MessageBox.Show(ex.Message); } AddRecievedDataDelegate add = new AddRecievedDataDelegate(AddRecievedData); this.Invoke(add, data); } } private void AddRecievedData(string data){ textBox1.Text += data; }

ご回答をいただいたもの参考に以下のように変更してみました。
this.Invoke(add, data);のところで
System.NullReferenceException: 'オブジェクト参照がオブジェクト インスタンスに設定されていません。とエラーが出てしまい、今までこのようなことがなかったのですが、どこを修正するとこのエラーが解消できるか悩んでおります。
ご教示いただきたくお願いします。

public partial class Form1 : Form { private TextBox[] txtBoxes; public Form1() { InitializeComponent(); int width = 100; int counter = 0; for (var i = 0; i < 8; i++) { for(var j =0; j < 8; j++) { new TextBox { Name = $"textBox{counter + 1}", Location = new Point(j * width + 70, i * 28 + 30), Size = new Size(20,5), Parent = this, }; new Label { Name = $"testPIXCEL{i + 1}", Text = $"PIXECL{counter+ 1}", Location = new Point(j * width + 6, i * 28 + 30), Size = new Size(60, 15), Parent = this, }; counter++; txtBoxes = new TextBox[counter]; } } } private void Form1_Load(object sender, EventArgs e) { string[] ports = SerialPort.GetPortNames(); foreach (string port in ports) { comboBox1.Items.Add(port); //確認できるCOMポートを取得して表示する。 } if (comboBox1.Items.Count > 0) comboBox1.SelectedIndex = 0; } private delegate void AddRecievedDataDelegate(string data); private void SerialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { //! シリアルポートをオープンしていない場合、処理を行わない. if (serialPort1.IsOpen == false) { return; } else { string data = string.Empty; try { //受信データの読み取り data = serialPort1.ReadExisting(); } catch (Exception ex) { MessageBox.Show(ex.Message); } AddRecievedDataDelegate add = new AddRecievedDataDelegate(AddRecievedData); this.Invoke(add, data); } } private void AddRecievedData(string data) { string[] stringdata = new string[] { "\r\n" }; string[] disdata = data.Split(stringdata, StringSplitOptions.None); for(var i =0; i< txtBoxes.Length; i++) { if(i < disdata.Length) { txtBoxes[i].Text = disdata[i]; } else { txtBoxes[i].Text = "---"; } } } private void button1_Click(object sender, EventArgs e) { if (serialPort1.IsOpen == true) { //! シリアルポートをクローズする. serialPort1.Close(); //! ボタンの表示を[切断]から[接続]に変える. button1.Text = "接続"; } else { //! オープンするシリアルポートをコンボボックスから取得 serialPort1.PortName = comboBox1.SelectedItem.ToString(); serialPort1.BaudRate = 115200; serialPort1.Parity = Parity.None; serialPort1.DataBits = 8; serialPort1.StopBits = StopBits.One; serialPort1.Handshake = Handshake.None; serialPort1.Open(); //! ボタンの表示を[切断]から[接続]に変える. button1.Text = "切断"; } } } } コード

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

SurferOnWww

2022/04/22 10:12

> dataに格納された文字列型のデータをどのように処理したらいいのかご教示いただいたいです。 data にはどのようなものが取得できているのか書いてください。
yellowcloak

2022/04/22 12:02

ご連絡ありがとうございます。 dataに入っている中身は”3\r\n23\r\n22\r\n22\r\n22\r\n23\r\n…というように数字(温度)\r\nが64個繋がります。最初の3は固定値です。
SurferOnWww

2022/04/22 12:05

上記は質問欄を編集して追加情報として追記願います、ここコメント欄は「質問への追記・修正の依頼」ですので。
SurferOnWww

2022/04/23 23:55

質問者さん、無言ですが、解決したならクローズしてください。まだ質問があればそれを書いてください。無言で放置はマナー違反です。
SurferOnWww

2022/04/24 14:02 編集

NullReferenceException ぐらいは自分でデバッガを使ってどこに問題があるか切り分けるべき。コードを丸投げしてデバッグしてくれと言うのは回答者に期待しすぎです。どの行で例外がスローされるかさえ書いてないのに・・・
SurferOnWww

2022/04/25 01:07 編集

デバッグしたのですかね? また無言ですが、デバッガの使い方が分かりませんとか、やったけど分かりませんでしたとかのフィードバックぐらいは返したらいかが? 注文を付けるばかりでは何なので、ヒントを書いておきます。Form1 のコンストラクタのコードをよく見てください。入れ物 txtBoxes を作って new TextBox で入れるものも作ったのですが、入れ物の中に作ったものを入れてないのが問題でしょう。(それ以外にも見直すべき所は多々ありそうですが) 上のヒントで解決しなければ、表題とは話が違ってきているので、このスレッドはクローズして(表題の件は解決したはず)、別に新たにスレッドを作って質問してください。一つの問題の解決が次の疑問をよんで次から次へと質問をするのは避けてください。
yellowcloak

2022/04/25 03:13

ご連絡ありがとうございます。 デバッグしてみました。やったことはデバッグの開始F5で動作させてエラーが発生したのでその内容を解消すべく、ググりました。が、エラー内容から何を言ってるのかイマイチ良くわからず困っている状態です。これがご指摘のデバッグをやったことに入らないのであれば、できてませんが正解になります。 ヒント参考にさせていただきます。
SurferOnWww

2022/04/25 03:33 編集

フィードバックを返しましょう。でないと、あなたが何をしたのかなんてわからない。 ちなみに、エラーが出る行の少し前の行にブレークポイントを置いて、デバッグ実行してそこで止まったらステップ実行して、変数を調べ、何が null になっているか調べる・・・なんてアドバイスもフィードバックが無ければできないことを認識してください。
SurferOnWww

2022/04/25 03:35

> ヒント参考にさせていただきます。 上のヒントで解決しなければ、表題とは話が違ってきているので、このスレッドはクローズして(表題の件は解決したはず)、別に新たにスレッドを作って質問してください。一つの問題の解決が次の疑問をよんで次から次へと質問をするのは避けてください。
TN8001

2022/04/25 15:47

> ご回答をいただいたもの参考に以下のように変更してみました。 回答に追記いました。ご確認ください。 ここの通知は来るけど、質問や回答の通知は(今は不具合で)来ないのかな??
SurferOnWww

2022/04/26 00:57

TN8001 さんと私の回答のヒントで解決しなければ、表題とは話が違ってきているので、このスレッドはクローズして(表題の件は解決したはず)、別に新たにスレッドを作って質問してください。一つの問題の解決が次の疑問をよんで次から次へと質問をするのは避けてください。 ここは質問者専用の Q&A の場ではないのです。Teratail は「teratailは技術に興味のある人達が集まって、質問と回答を通してお互いに知識や情報を交換・共有する場所です。」ということで、その意味でも解決したならクローズするのは質問者の務めです。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

C#

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