2016-12-18 9 views
0

직렬 포트를 통해 Arduino와 통신해야하는 프로젝트가 있습니다. 필자가 직면 한 문제는 직렬 모니터에서 수신 한 데이터를 richtextbox의 여러 줄에 지속적으로 인쇄 할 수 없다는 것입니다. "Reveice"버튼을 누르면 하나의 값만 수신되고 그 후에 수신 버튼을 다시 누르면 라인을 덮어 씁니다.C# 직렬 포트 통신 Arduino

나는 며칠 동안이 문제를 해결하려고 노력하고 있지만, C#으로 프로그래밍 한 것은 처음이므로, 귀하의 도움을 요청하고 있습니다.

코드 : 최종 응용 프로그램의

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"; 

대신 당신이 원하는 것 :

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

은 또한 당신이 MSDN에이 문서를 살펴해야합니다 https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived(v=vs.110).aspx

이것은 당신이 지속적으로 텍스트를 받기 위해 이벤트를 사용할 수있는 방법을 보여줍니다 Arduino.

+0

정말 고마워, 나는 호출 및 이벤트와 함께 그것을 mannaged! –