ご助言をいただきたくよろしくお願いします
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 = "切断"; } } } } コード
> dataに格納された文字列型のデータをどのように処理したらいいのかご教示いただいたいです。
data にはどのようなものが取得できているのか書いてください。
ご連絡ありがとうございます。
dataに入っている中身は”3\r\n23\r\n22\r\n22\r\n22\r\n23\r\n…というように数字(温度)\r\nが64個繋がります。最初の3は固定値です。
上記は質問欄を編集して追加情報として追記願います、ここコメント欄は「質問への追記・修正の依頼」ですので。
質問者さん、無言ですが、解決したならクローズしてください。まだ質問があればそれを書いてください。無言で放置はマナー違反です。
NullReferenceException ぐらいは自分でデバッガを使ってどこに問題があるか切り分けるべき。コードを丸投げしてデバッグしてくれと言うのは回答者に期待しすぎです。どの行で例外がスローされるかさえ書いてないのに・・・
デバッグしたのですかね? また無言ですが、デバッガの使い方が分かりませんとか、やったけど分かりませんでしたとかのフィードバックぐらいは返したらいかが?
注文を付けるばかりでは何なので、ヒントを書いておきます。Form1 のコンストラクタのコードをよく見てください。入れ物 txtBoxes を作って new TextBox で入れるものも作ったのですが、入れ物の中に作ったものを入れてないのが問題でしょう。(それ以外にも見直すべき所は多々ありそうですが)
上のヒントで解決しなければ、表題とは話が違ってきているので、このスレッドはクローズして(表題の件は解決したはず)、別に新たにスレッドを作って質問してください。一つの問題の解決が次の疑問をよんで次から次へと質問をするのは避けてください。
ご連絡ありがとうございます。
デバッグしてみました。やったことはデバッグの開始F5で動作させてエラーが発生したのでその内容を解消すべく、ググりました。が、エラー内容から何を言ってるのかイマイチ良くわからず困っている状態です。これがご指摘のデバッグをやったことに入らないのであれば、できてませんが正解になります。
ヒント参考にさせていただきます。
フィードバックを返しましょう。でないと、あなたが何をしたのかなんてわからない。
ちなみに、エラーが出る行の少し前の行にブレークポイントを置いて、デバッグ実行してそこで止まったらステップ実行して、変数を調べ、何が null になっているか調べる・・・なんてアドバイスもフィードバックが無ければできないことを認識してください。
> ヒント参考にさせていただきます。
上のヒントで解決しなければ、表題とは話が違ってきているので、このスレッドはクローズして(表題の件は解決したはず)、別に新たにスレッドを作って質問してください。一つの問題の解決が次の疑問をよんで次から次へと質問をするのは避けてください。
> ご回答をいただいたもの参考に以下のように変更してみました。
回答に追記いました。ご確認ください。
ここの通知は来るけど、質問や回答の通知は(今は不具合で)来ないのかな??
TN8001 さんと私の回答のヒントで解決しなければ、表題とは話が違ってきているので、このスレッドはクローズして(表題の件は解決したはず)、別に新たにスレッドを作って質問してください。一つの問題の解決が次の疑問をよんで次から次へと質問をするのは避けてください。
ここは質問者専用の Q&A の場ではないのです。Teratail は「teratailは技術に興味のある人達が集まって、質問と回答を通してお互いに知識や情報を交換・共有する場所です。」ということで、その意味でも解決したならクローズするのは質問者の務めです。
回答3件
あなたの回答
tips
プレビュー
