簡體   English   中英

如何使用C#在串行端口中順序發送兩個數字

[英]how to send two number in serial port sequential using c#

我想將兩個數字從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必須開閉五次。 請幫我!

我解決了我的問題,我想在這里分享。 我的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");
        }

謝謝你的幫助。

您的代碼中有3個問題。

  • 您在這里調用Serial.read()

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

    但實際上您不知道Serial上是否已有byte

  • 您在這里再次調用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上是否可用。

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

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

    根據write()文檔 如果發送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)

也許更好的解決方案是僅在C#代碼中發送1 byte ,我認為您不需要超過255閃爍,是嗎?


請注意,這可能不足以修復代碼case 3:因為您發送4 bytes的第一次圍繞也為1, 2, 3 根據您的體系結構的字節序 ,可能會在讀取包含1, 2, 3byte之前或之后解析C#原始int的前導0 這意味着您可能會通過Serial獲得未對齊的數據讀取。

為什么不發送/接收以ASCII表示形式編碼的值,而不是嘗試執行二進制輸入/輸出? 那應該更容易處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM