0

Hi guys I need your help with my project. I have a 2 textboxes (type string) in a C# program and i need to send this numbers to Arduino using a Serial.Port. So far i got to send one of the values to arduino but it doesn't work very well if I enter "1200" arduino reads and show: 1,2,0,0 i need "1200". How i send 2 values from C# to Arduino? How the arduino will read these values (x and y)?

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 Script

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


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

3 Answers 3

2

Reading data through serial port and separating them using strings.

In C#

  1. Add a unique character to starting of 1st box data.
  2. Add a unique character to starting of 2nd box data.
  3. Add a unique character to ending of 2nd box data.
  4. Append two strings and send as single string.

I had a VB example:

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)

In Arduino:

//--- 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;
 }
}

Seperate strings using

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();

Then display it onn lcd/serialport:

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

Please note that '$' will not get added to the string.

Sign up to request clarification or add additional context in comments.

Comments

1

This is what i did, and it worked:

C#

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

Arduino:

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

}

Comments

0

I think, this is good for you. C# part:

    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 part:

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.