
ご助言をいただきたくよろしくお願いします
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 = "切断"; } } } } コード









回答3件
あなたの回答
tips
プレビュー