goksurahsan Ответов: 2

Как очистить последовательные данные в arduino с помощью C#?


Всем привет, сейчас я работаю над C# и Arduino. Я хочу отправить два или более данных из текстовых полей в приложении формы C#. к последовательному монитору. Но мой последовательный порт считывал только первое число, а других чисел не было видно. Я искал некоторые, чтобы очистить первое имя после того, как последовательный порт прочитал. Но я не нашел ничего подходящего для своей цели. Мой код c# :

private void btnSend_Click(object sender, EventArgs e)
        {

            if (serialPort1.IsOpen)
            {
                int MyInt = Convert.ToInt32(textBox1.Text);
                byte[] b = BitConverter.GetBytes(MyInt);
                serialPort1.Write(b, 0, 4);
                if (MyInt == 3)
                {
                    Form DataSend = new Form();
                    DataSend.BackColor = Color.Empty;
                    DataSend.Text = "DATA SEND";
                    DataSend.Show(); // ya da ShowDialog();
                    DataSend.Cursor = Cursors.Hand;
                    DataSend.StartPosition = FormStartPosition.CenterScreen;
                    Button btn = new Button();
                    btn.Text = "Send Again";
                    btn.Name = "btnSendAgain";
                    btn.Location = new Point(100,50);
                    btn.Click += btn_Click;
                    TextBox txbox = new TextBox();
                    txbox.Text = "";
                    txbox.Name = "txtNumber2";
                    txbox.Location = new Point(100,20);
                    DataSend.Controls.Add(btn);
                    DataSend.Controls.Add(txbox);
                }
            }
            else
            {
                MessageBox.Show("Please check your connction maybe serial port is not connected");
            }

        }
 void btn_Click(object sender, EventArgs e)
        {
            
                
                int MyInt = Convert.ToInt32(textBox1.Text);
                byte[] b = BitConverter.GetBytes(MyInt);
                serialPort1.Write(b, 0, 4);
            
            
        }


Мой код arduino:

<pre>int led = 12;
int num1;
int data[4];

void setup()
{
  Serial.begin(9600);
  pinMode(led, OUTPUT);
}
void loop()
{
  if (Serial.available())
  {
    num1 = Serial.read();
    for (int i = 0; i < 2; i++)
    {
      data[i] = num1;
    }
    switch (num1)
    {
      case 1:
        openCloseThree();
        break;
      case 2:
        openCloseTwice();
        break;
      case 3:
         openCloseIwanted();
        break;
      default:
        break;
    }
  }
}

void openClose()
{
  for (int i = 0; i < 1; i++)
  {
    delay(500);
    digitalWrite(led, HIGH);
    delay(500);
    digitalWrite(led, LOW);
  }
}
void openCloseTwice()
{
  for (int i = 0; i < 2; i++)
  {
    delay(500);
    digitalWrite(led, HIGH);
    delay(500);
    digitalWrite(led, LOW);
  }
}
void openCloseThree()
{

  for (int i = 0; i < 3; i++)
  {
    delay(500);
    digitalWrite(led, HIGH);
    delay(500);
    digitalWrite(led, LOW);
  }
}
void openCloseIwanted()
{

  for (int i = 0; i < num1; i++)
  {
    delay(500);
    digitalWrite(led, HIGH);
    delay(500);
    digitalWrite(led, LOW);
  }

}


Что я уже пробовал:

На самом деле я хочу этого: когда я отправляю 3 с помощью C#, открывается другая форма, и снова я пишу любое число, мой светодиод открыт до последнего числа, которое я пишу.

2 Ответов

Рейтинг:
1

goksurahsan

Моя часть Arduino:

<pre>int number[3];
int n;
int i = 0;
int led = 12;
int led2=7;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(led, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available() > 0) {
    // read the incoming byte:
    n = Serial.read();
    if (i < 3)
    {
      number[i] = n;
      switch (number[0])
      {
        case 1:
          openClose();
          break;
        case 2:
          openCloseTwice();
          break;
        case 3:
          if (i == 2)
          {
            for (int j = 0; j < number[1]; j++)
            {
              delay(500);
              digitalWrite(led, HIGH);
              delay(500);
              digitalWrite(led, LOW);
            }
            delay(500);
            for (int k = 0; k < number[2]; k++)
            {
              delay(500);
              digitalWrite(led2, HIGH);
              delay(500);
              digitalWrite(led2, LOW);
            }
          }
          break;
        default:
          break;
      }
      i++;
    }
    else
    {
      i = 0;
    }

  }
}
void openClose()
{
  for (int i = 0; i < 1; i++)
  {
    delay(500);
    digitalWrite(led, HIGH);
    delay(500);
    digitalWrite(led, LOW);
  }
}
void openCloseTwice()
{
  for (int i = 0; i < 2; i++)
  {
    delay(500);
    digitalWrite(led, HIGH);
    delay(500);
    digitalWrite(led, LOW);
  }
}


Моя часть c# :

if (serialPort1.IsOpen)
            {
                int MyInt = Convert.ToInt32(textBox1.Text);
                byte[] b = BitConverter.GetBytes(MyInt);
                serialPort1.Write(b, 0, 1);

                int MyInt2 = Convert.ToInt32(textBox2.Text);
                byte[] z = BitConverter.GetBytes(MyInt2);
                serialPort1.Write(z, 0, 1);

                int MyInt3 = Convert.ToInt32(textBox3.Text);
                byte[] p = BitConverter.GetBytes(MyInt3);
                serialPort1.Write(p, 0, 1);
            }
            else
            {
                MessageBox.Show("Please control your connection");
            }


Рейтинг:
0

CPallini

Непонятно, чем вы на самом деле хотите заниматься. В любом случае, пожалуйста, обратите внимание:

  • Например, в вашем коде C#, если вы введете, "1" тогда в вашем текстовом поле четыре байты отправляются в последовательную линию: три 0и один 1 (этот 0s не будет обрабатываться вашим кодом Arduino).
  • В своем коде Arduino вы не проверили, если Serial.read() вернет -1 (то есть данные отсутствуют).


goksurahsan

На самом деле я хочу отправить два данных из c# в Arduino

CPallini

Два байта или два целых числа? Вы знаете, что 32-битное целое число занимает 4 байта...

goksurahsan

Два целых числа.Но когда я посылаю, например, 3 следующих 5, я хочу очистить 3 в памяти Arduino.
Я использовал метод Serial. flush ();, но он не работал в моей программе.

CPallini

"очистить из памяти" - это перезапись памяти, которую вы использовали с новым значением.
В своем коде вы присваиваете одно и то же значение (num1) данным[0], данным[1] и данным[2]. Это выглядит бессмысленно.