2016-07-07 3 views
0

こんにちは私のプロジェクトであなたの助けが必要です。私はC#プログラムで2つのテキストボックス(タイプ文字列)を持っており、この番号をSerial.Portを使ってArduinoに送る必要があります。これまでのところarduinoに値の1つを送ってきましたが、 "1200" arduinoの読み書きを入力するとうまくいきません。1,2,0,0には "1200"が必要です。どのようにC#からArduinoに2つの値を送るのですか? arduinoがこれらの値(xとy)をどのように読み取るのでしょうか?C#からSerial.Portを使用して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; // necessário para ter acesso as portas 

    namespace interfaceArduinoVS2013 

{ 
    public partial class Form1 : Form 
    { 

     string RxString; 

     public Form1() 
     { 
      InitializeComponent(); 
      timerCOM.Enabled = true; 
     } 

     private void atualizaListaCOMs() 
     { 
      int i; 
      bool quantDiferente; //If there are more ports 

      i = 0; 
      quantDiferente = false; 

      //if there are new ports 
      if (comboBox1.Items.Count == SerialPort.GetPortNames().Length) 
      { 
       foreach (string s in SerialPort.GetPortNames()) 
       { 
        if (comboBox1.Items[i++].Equals(s) == false) 
        { 
         quantDiferente = true; 
        } 
       } 
      } 
      else 
      { 
       quantDiferente = true; 
      } 

      //it was't detected difference 
      if (quantDiferente == false) 
      { 
       return;      
      } 

      //clean comboBox 
      comboBox1.Items.Clear(); 

      //add all the COMs in the list 
      foreach (string s in SerialPort.GetPortNames()) 
      { 
       comboBox1.Items.Add(s); 
      } 
      //select the first position 
      comboBox1.SelectedIndex = 0; 
     } 

     private void timerCOM_Tick(object sender, EventArgs e) 
     { 
      atualizaListaCOMs(); 
     } 

     private void btConectar_Click(object sender, EventArgs e) 
     { 
      if (serialPort1.IsOpen == false) 
      { 
       try 
       { 
        serialPort1.PortName = comboBox1.Items[comboBox1.SelectedIndex].ToString(); 
        serialPort1.Open(); 

       } 
       catch 
       { 
        return; 

       } 
       if (serialPort1.IsOpen) 
       { 
        btConectar.Text = "Desconectar"; 
        comboBox1.Enabled = false; 

       } 
      } 
      else 
      { 

       try 
       { 
        serialPort1.Close(); 
        comboBox1.Enabled = true; 
        btConectar.Text = "Conectar"; 
       } 
       catch 
       { 
        return; 
       } 

      } 
     } 

     private void Form1_FormClosed(object sender, FormClosedEventArgs e) 
     { 
      if(serialPort1.IsOpen == true) // if the port is open 
      serialPort1.Close();   //close 
     } 

     private void btEnviar_Click(object sender, EventArgs e) 
     { 
      if(serialPort1.IsOpen == true)   //porta está aberta 
      serialPort1.Write(textBoxX.Text); //send the text from textboxX 
      serialPort1.Write(textBoxY.Text); 
     } 

     private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
     { 
      RxString = serialPort1.ReadExisting();    //read data from serial 
      this.Invoke(new EventHandler(trataDadoRecebido)); 
     } 

     private void trataDadoRecebido(object sender, EventArgs e) 
     { 
      textBoxReceber.AppendText(RxString); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 
    } 
} 

Arduinoのスクリプト

void setup() 
{ 
    Serial.begin(9600); 
} 


    void loop() 
    { 
     if(Serial.available())   
     { 
     char c = Serial.read(); 
     Serial.println(c);   
     } 
    } 

答えて

2

シリアルポートを介してデータを読み取り、文字列を使用してそれらを分離します。 C#の

  1. は、第一ボックスデータの開始に固有の文字を追加します。

  2. 2番目のボックスデータの開始に一意の文字を追加します。
  3. 2番目のボックスデータの末尾にユニークな文字を追加します。
  4. 2つの文字列を追加し、1つの文字列として送信します。

私はVBの例を持っていた:アルドゥイーノで

Dim WithEvents ADRport As SerialPort = New System.IO.Ports.SerialPort("COM1", 9600, Parity.None, 8, StopBits.One) 

msg = "$" & box1.Text & "#" & box2.Text & "*" & vbCrLf 
ADRport.Write(msg) 

int 1start = int(mstr.indexOf('$')); 
int 2start = int(mstr.indexOf('#',numstart+1)); 
int 2end = int(mstr.indexOf('*')); 
text1 = mstr.substring(1start+1,2start); 
text2 = mstr.substring(2start+1,2end); 
text1.trim(); 
text1.trim(); 

を使用して

//--- Wait for the message starting ----- 
while(Serial.read()!='$'); 
while (!flag) 
{ 
// get the new byte: 
char inChar = (char)Serial.read(); 
// add it to the inputString: 
mstr += inChar; 
//Serial.write(inChar); 
// if the incoming character is a end of line, set a flag 
if (inChar == '*') 
{ 
    flag = true; 
} 
} 

洗面所独立の文字列は、その後、LCD/SERIALPORT ONNそれを表示

lcd.setCursor(0,0); 
lcd.print(msg); 

'$'は文字列に追加されませんのでご注意ください。

1

これは私がやったことであり、それは働いた:

C#

serialPort1.WriteLine(eixver.Text.ToString()+";"+ eixHor.Text.ToString()); 

アルドゥイーノ:

int val; 
int h, v; 


String cont; 
void setup() { 
Serial.begin(9600); 

} 

void loop() { 

while(Serial.available()) 
{ 
char caracter = Serial.read(); 
cont.concat(caracter); 
delay(5); 
} 
if(cont!="") 
{ 
// Serial.println(cont); 
v=cont.substring(0, cont.indexOf(';')).toInt(); 
h=cont.substring(cont.indexOf(';')+1, cont.length()).toInt(); 
Serial.print("v="); 
Serial.print(v); 
Serial.print(" - h="); 
Serial.print(h); 
cont=""; 
} 

} 
0

私は、これはあなたのために良いことだと思います。 C#の一部:

Connect(); 
    if (serialPort1.IsOpen) 
    { 

     double MyInt = ToDouble(lblMixerCase.Text); 
     byte[] b = GetBytes(MyInt); 
     serialPort1.Write(b, 0, 1); 

     double MyInt2 = ToDouble(txtRPM.Text); 
     byte[] z = GetBytes(MyInt2); 
     serialPort1.Write(z, 0, 1); 
     if (MyInt2>1600) 
     { 
      MessageBox.Show("Please enter RPM value between 0 and 1600"); 
     } 
     double MyInt3 = ToDouble(lblCaseRpmSecond.Text); 
     byte[] p = GetBytes(MyInt3); 
     serialPort1.Write(p, 0, 1); 

     double MyInt4 = ToDouble(lblRpmCaseThree.Text); 
     byte[] s = GetBytes(MyInt3); 
     serialPort1.Write(s, 0, 1); 

     serialPort1.Close(); 

Arduinoの部分:

unsigned long currentMillis = millis(); 
    if (currentMillis - previousMillis >= interval) { 
    previousMillis = currentMillis; 
    if (Serial.available() > 0) { 
     // read the incoming byte: 
     n = Serial.read(); 
     if (i < 3) 
     { 
     number[i] = n; 

     switch (number[0]) 
     { 
      case 1: 
      if (i == 2) 
      { 
       switch(number[1]) 
       { 
       case 1: 
       openClose(); 
       break; 
       case 2: 
       openCloseTwice(); 
       break; 
       case 3: 
       openCloseThree(); 
       break; 
       default: 
       openCloseIwanted(number[1], number[2]); 
       break; 
       } 
      } 
      break; 
      case 2: 
      if (i == 2) 
      { 
       switch(number[1]) 
       { 
       case 1: 
       openClose(); 
       break; 
       case 2: 
       openCloseTwice(); 
       break; 
       case 3: 
       openCloseThree(); 
       break; 
       default: 
       openCloseIwanted(number[1], number[2]); 
       break; 
       } 
      } 
      break; 
      case 3: 
      if (i == 2) 
      { 
       openCloseIwanted(number[1], number[2]); 
      } 
      break; 
      default: 
      if (i == 2) 
      { 
       openCloseIwanted(number[1], number[2]); 
      } 
      break; 
     } 
     i++; 
     if (i == 3) 
     { 
      asm volatile (" jmp 0"); //For reset Arduino 
     } 
     } 
     else 
     { 
     i = 0; 
     } 
    } 
関連する問題