簡體   English   中英

C#將串行命令發送到Arduino

[英]C# Sending Serial Commands to Arduino

我正在使用Arduino Mega 2560開發板來控制LED燈條。 我正在嘗試使用一個簡短的C#控制台程序向我的Arduino程序發送串行命令。 在Arduino中,我有一個名為SerialCommand的庫,可以在其中讀取串行字符串並使用它執行函數,還可以傳遞類似這樣的參數:“ functionName arg1 arg2 arg3”。 我已經通過終端發送串行命令進行了測試,效果很好! 我也通過從C#程序發送串行命令來運行Arduino函數,但前提是該串行字符串不包含任何空格。

這是我的C#代碼:

class Program
{
    public static System.IO.Ports.SerialPort serialPort1;

    private void establishConnection()
    {
        serialPort1 = new System.IO.Ports.SerialPort("COM4");
        serialPort1.BaudRate = 115200;

        serialPort1.Open();
    }

    static void Main(string[] args)
    {
        Program p = new Program();
        p.establishConnection();

        string i;
        while (true)
        {
            Console.Write("Enter command:  ");
            i = Console.ReadLine();
            if (i == "exit")
            {
                serialPort1.Close();
                break;
            }
            else if (i == "1")
            {
                // Turn LED's on and pass argument "test"
                serialPort1.Write("ON test\n");
            }
        }
    }
}

我知道我的連接有效並且我的命令正在發送,因為如果我在Arduino中對ON函數進行編程以使其不帶參數就可以正常工作。 但是,如果我發送“ ON”命令並在空格后加上參數,或者通常使用空格,則Arduino無法正確讀取它。

您是否知道為什么空間會干擾我在C#中的串行命令? 謝謝你的幫助。

這是我在Arduino中所做的一個簡單示例:

#include "SerialCommand.h"
#include <Adafruit_NeoPixel.h>

SerialCommand sCmd;

#define PIN7 7
// Strip of LED's
Adafruit_NeoPixel testStrip = Adafruit_NeoPixel(10, PIN7, NEO_GRB + NEO_KHZ800);
uint32_t testStripColor = 0xFFFFFF;

void setup() {
  Serial.begin(115200);

  sCmd.addCommand("ON",  lightsOn);
  sCmd.addCommand("OFF",  lightsOff);

  testStrip.begin();
  testStrip.show();
}

void loop() {
  sCmd.readSerial();
}

void lightsOn() {
  char *lightSet;
  lightSet = sCmd.next();  // Read argument

  if (strcmp(lightSet, "test") == 0) {
    for (int i=0; i < testStrip.numPixels(); i++) 
    {
      testStrip.setPixelColor(i, testStripColor);
    }
    testStrip.show();
  }
}

void lightsOff() {
  char *lightSet;
  lightSet = sCmd.next();  // Read argument

  if (strcmp(lightSet, "test") == 0) {
    testStrip.clear();  
    testStrip.show();
  }
}

請試試:

serialPort1.WriteLine("ON test");

暫無
暫無

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

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