如何使用c#在串口连续发送两个数字

时间:2017-03-06 07:45:55

标签: c# arduino serial-port

我想从c#向串口监视器发送两个号码。但是当我顺序发送数字时,端口没有工作 我的c#代码:

if (serialPort1.IsOpen)
            {
                int MyInt = Convert.ToInt32(textBox1.Text);
                byte[] b = BitConverter.GetBytes(MyInt);
                serialPort1.Write(b, 0, 4);
                if (MyInt == 3)
                {
                    int MyInt2 = Convert.ToInt32(textBox2.Text);
                    byte[] s = BitConverter.GetBytes(MyInt2);
                    serialPort1.Write(s, 0, 4);
                }
                else
                {
                    MessageBox.Show("Continue");
                }
            }
            else
            {
                MessageBox.Show("Please check your connction maybe serial port is not connected");
            }

和Arduino代码:

int LedPin = 12;
int k, s;
void setup()
{
  Serial.begin(9600);
  pinMode(LedPin, OUTPUT);
}
void loop()
{
  if (Serial.available())
  {
    k = Serial.read();
    switch (k)
    {
      case 1:
        openCloseThree();
        break;
      case 2:
        openCloseTwice();
        break;
      case 3:
        s = Serial.read();
        if (s !=0)
        {
          openCloseIwanted();
        }
        break;
      default:
        openCloseIwanted();
        break;
    }
  }
}
void openClose()
{
  for (int i = 0; i < 1; i++)
  {
    delay(500);
    digitalWrite(LedPin, HIGH);
    delay(500);
    digitalWrite(LedPin, LOW);
  }
}
void openCloseTwice()
{
  for (int i = 0; i < 2; i++)
  {
    delay(500);
    digitalWrite(LedPin, HIGH);
    delay(500);
    digitalWrite(LedPin, LOW);
  }
}
void openCloseThree()
{

  for (int i = 0; i < 3; i++)
  {
    delay(500);
    digitalWrite(LedPin, HIGH);
    delay(500);
    digitalWrite(LedPin, LOW);
  }
}
void openCloseIwanted()
{
  s = Serial.read();
  for (int i = 0; i < s ; i++)
  {
    delay(500);
    digitalWrite(LedPin, HIGH);
    delay(500);
    digitalWrite(LedPin, LOW);
  }
}

我的关键数字是3.我想在发送3和5时看到led开 - 关,例如,led必须打开 - 关闭5次。 请帮帮我!

2 个答案:

答案 0 :(得分:2)

我解决了我的问题,我想在这里分享。 我的arduino部分:

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

感谢您的帮助。

答案 1 :(得分:0)

您的代码中有3个问题。

  • 您在此处致电Serial.read()

      case 3:
        s = Serial.read();
        if (s !=0)
        {
          openCloseIwanted();
        }
    

    但实际上你并不知道byte是否已经Serial已经可用。

  • 您在此处再次致电 Serial.read()

    void openCloseIwanted()
    {
      s = Serial.read();
      for (int i = 0; i < s ; i++)
      {
        delay(500);
        digitalWrite(LedPin, HIGH);
        delay(500);
        digitalWrite(LedPin, LOW);
      }
    }
    

    不检查byteSerial是否可用。

  • 您在4 bytes源代码中发送了C#,而不是1

    if (MyInt == 3)
    {
        int MyInt2 = Convert.ToInt32(textBox2.Text);
        byte[] s = BitConverter.GetBytes(MyInt2);
        serialPort1.Write(s, 0, 4);
    }
    

    根据write()的{​​{3}}。如果您发送4 bytes,则不应只读1,甚至2,但必须采用独立/不相关的方式。

如果你发送4 bytes,那么你应该:

  • 等待输入中至少4 bytes可用:

    while (Serial.available() < 4) { };
    
  • 然后将这些字节存储到long变量中:

    unsigned long lvar = 0;
    for (byte i = 0; i < 3; ++i) {
        lvar = (lvar << 8) + (byte) Serial.read();
    }
    

    您需要unsigned long,因为 Arduino 上的int只有2个字节。

  • 然后将lval作为参数传递给您的函数void openCloseIwanted(unsigned long lval)

或许更好的解决方案是仅在1 byte代码中发送C#,我不认为您需要超过255眨眼,是吗?

请注意,修复case 3:中的代码可能不够,因为您第一次发送4 bytes 1, 2, 3。根据架构的字节endianess 0中原始int的前导C#可能会在阅读{{1}之前或之后解析包含byte。这意味着您可能会通过1, 2, 3获得可能未对齐的数据读取。

为什么不发送/接收以 ASCII 表示编码的值,而不是尝试执行二进制输入/输出?这应该更容易处理。