C#向Arduino发送串行命令

本文关键字:命令 Arduino | 更新日期: 2023-09-27 17:59:10

我使用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();
  }
}

C#向Arduino发送串行命令

请尝试:

serialPort1.WriteLine("ON test");