2016-12-18 12 views
0

シリアルポートを介してArduinoと通信する必要があるプロジェクトがあります。私が直面している問題は、シリアルモニタから受信したデータをリッチテキストボックスの複数の行に連続して印刷できないことです。 「Reveice」ボタンを押すと、値が1つしか得られません。この後、Receiveボタンをもう一度押すと、行が上書きされます。C#シリアルポート通信Arduino

私はこれを数日間修正するつもりですが、これは初めてのプログラミングであり、あなたの助けを求めています。

コード:最終アプリの

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.IO.Ports; 

namespace aplicatie_comanda_v1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      getAvilablePorts(); 


     } 

     private void textBox1_TextChanged(object sender, EventArgs e) 
     { 

     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private void button2_Click(object sender, EventArgs e) 
     { 

      serialPort1.Close(); 
      progressBar1.Value = 0; 
      button3.Enabled = true; 
      button1.Enabled = false; 
      receive.Enabled = false; 
      richTextBox1.Clear(); 

     } 

     private void label1_Click(object sender, EventArgs e) 
     { 

     } 
     void getAvilablePorts() 
     { 
      string[] ports = SerialPort.GetPortNames(); 
      comboBox1.Items.AddRange(ports); 
     } 

     private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 


     } 

     private void button3_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       if (comboBox1.Text == "" || comboBox2.Text == "" && serialPort1 != null && serialPort1.IsOpen) 
       { 
        richTextBox1.Text = "Select COM port and BAUD rate !"; 
        serialPort1.Close(); 
       } 
       else 
       { 
        string cmd = Convert.ToString(comboBox1.Text); 
        int baud = Convert.ToInt32(comboBox2.Text); 
        serialPort1.PortName = cmd; 
        serialPort1.BaudRate = baud; 
        serialPort1.DtrEnable = true; 
        serialPort1.RtsEnable = true; 
        serialPort1.Open(); 
        progressBar1.Value = 100; 
        button1.Enabled = true; 
        button2.Enabled = true; 
        textBox1.Enabled = true; 
        button3.Enabled = false; 

       } 
      } 
      catch (UnauthorizedAccessException) 
      { 
       richTextBox1.Text = "Unauthorized !"; 
      } 
     } 

     private void textBox2_TextChanged(object sender, EventArgs e) 
     { 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 

      string text = textBox1.Text; 
      serialPort1.Write(text); 

     } 

     private void receive_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       richTextBox1.Text = serialPort1.ReadLine() + "\n"; 

      } 
      catch (TimeoutException) 
      { 
       richTextBox1.Text = "Timeout !"; 
      } 
     } 

     private void button4_Click(object sender, EventArgs e) 
     { 

      serialPort1.Write("w"); 
     } 

     private void button5_Click(object sender, EventArgs e) 
     { 
      serialPort1.Write("s"); 
     } 

     private void trackBar1_Scroll(object sender, EventArgs e) 
     { 

     } 

     private void button6_Click(object sender, EventArgs e) 
     { 
      serialPort1.Write("a"); 
     } 

     private void button7_Click(object sender, EventArgs e) 
     { 
      serialPort1.Write("d"); 
     } 

     private void button12_Click(object sender, EventArgs e) 
     { 
      serialPort1.Write("b"); 
     } 

     private void button13_Click(object sender, EventArgs e) 
     { 
      string cmd = Convert.ToString(trackBar1.Value); 
      serialPort1.Write(cmd); 
     } 

     private void button8_Click(object sender, EventArgs e) 
     { 
      serialPort1.Write("q"); 
     } 

     private void button11_Click(object sender, EventArgs e) 
     { 
      serialPort1.Write("e"); 
     } 

     private void button9_Click(object sender, EventArgs e) 
     { 
      serialPort1.Write("z"); 
     } 

     private void button10_Click(object sender, EventArgs e) 
     { 
      serialPort1.Write("c"); 
     } 

     private void richTextBox1_TextChanged(object sender, EventArgs e) 
     { 


     } 

     private void checkBox1_CheckedChanged(object sender, EventArgs e) 
     { 
      while (serialPort1.IsOpen) 
      { 
       try 
       { 
        string date = serialPort1.ReadLine(); 
        richTextBox1.Text = date + "\n"; 

       } 
       catch (TimeoutException) 
       { 
        richTextBox1.Text = "Timeout !"; 
       } 
      } 
     } 
    } 
} 

印刷画面:http://i.imgur.com/5f8EOly.png

ありがとうございます!

答えて

2

私はまだC#で​​シリアルアプリケーションを書いていませんが、すでにJavaの< - > Arduino通信を含むいくつかのプロジェクトを行っています。 私の最初の推測は、既存の行を受信した行で上書きすることです。

richTextBox1.Text = serialPort1.ReadLine() + "\n"; 

代わりにあなたが望む:あなたはMSDNでこの記事を見てみる必要があります

richTextBox1.Text += serialPort1.ReadLine() + "\n"; 

はまた: https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived(v=vs.110).aspx

これは、あなたが連続からテキストを受け取るためにイベントを使用することができます方法を示していますArduino。

+0

ありがとう、私は呼び出しやイベントでそれを行うmannaged! –

関連する問題