C# 到 arduino 通信

C# to arduino communication

大家下午好,

我正在试验 c# 和 arduino 之间的串行通信。 要了解通信在发送数字方面的工作方式(我知道,已经讨论了很多但请耐心等待)我想将轨迹栏的值发送到 arduino,然后在伺服运动中转换这个数字。

如果我没理解错的话,整数不能直接发送,必须先转换成字节。 因此,为此我会将轨迹栏的数值转换为字节数组

在 C# 中:

byte[] Numbers;
Numbers = BitConverter.GetBytes(trackBar1.Value);

通过串行通信我会发送值

port.Write(Numbers, 0, 1);

我认为这就是我要出错的地方 轨迹栏值从 0 到 255,所以我想我需要知道等于 0 到 255 的字节才能调整最后一个数字(在我的示例中为“1”)以在 Arduino 中翻译后获得正确的数字?

至于Arduino,我会'translate'字节如下:

int IncomingValue = Serial.parseInt();

然后我想为我的伺服系统使用 IncomingValue。

我的问题是我做错了什么。

谢谢

对于那些有兴趣用 c# 修补 arduino 串行通信(只是描述我遇到的问题)并发送轨迹栏值以在 arduino 中使用的人:

给自己做一个表单项目,随便命名。 然后创建一个轨迹栏。我将创建一个最小值为 0,最大值为 255 的轨迹栏,如下所示:

trackbar1.Minimum = 0;
trackbar1.Maximum = 255;
trackBar1.TickFrequency = 10;   // this will set ticks every 10 units.

现在我们可以设置c#和arduino之间的实际通信了。我将从 c# 开始。

打开一个端口:

  port = new SerialPort("COM5", 9600);   //Set your Arduino COM port and baud rate
            port.Open();

现在我们还需要创建一个事件,在程序关闭时关闭端口:

 void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (port != null && port.IsOpen)
            {
                port.Close();
            }
        }

现在我们已经设置了端口,但是我们还需要发送数据。在我们的示例中,我们告诉我们要发送轨迹栏的值。为此,请单击您的轨迹栏并找到 trackBar1_Scroll 事件并双击它。 这基本上创建了滚动轨迹栏的事件,现在我们必须在这个事件中描述我们想要发生的事情。

我们想通过串口发送trackbar的数据。轨迹栏值检索如下:

trackbar1.value

现在我们知道如何检索值了,我们必须看看发送它的选项,使用 port.write() 有 3 个选项,我们稍后会用到它:

-写入(字符串)
-写入(字节[],Int32,Int32)
-Write(Char[], Int32, Int32)

但是当我使用 int 时,我发现第二个是我需要的。 如您所见,我们需要一个字节数组才能发送它,因此我们将通过使用 BitConverter 并声明一个名为 Numbers:

的字节数组,将轨迹栏数据转换为字节数组
byte[] Numbers = BitConverter.GetBytes(trackBar1.Value);

现在我们拥有所需的所有元素:

  • 已经打开的端口。我们还描述了何时关闭它。
  • 轨迹栏及其要发送的数据。
  • trackbar的数据'packaged'正确的发送方式

我们唯一没有做的是描述滚动事件,但现在我们有了正确的数据格式,我们可以:

private void trackBar1_Scroll(object sender, EventArgs e)
        {
            
            byte[] Numbers = BitConverter.GetBytes(trackBar1.Value);

            port.Write(Numbers, 0, 1);

        }

所以在 C# 中我们的代码将如下所示:

 public Form1()
        {
            InitializeComponent();
            
            trackBar1.Minimum = 0;
            trackBar1.Maximum = 255;
            trackBar1.TickFrequency = 10;

            port = new SerialPort("COM5", 9600);//Set your board COM
            port.Open();

            this.FormClosed += new FormClosedEventHandler(Form1_FormClosed);
           
        }
 
void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (port != null && port.IsOpen)
            {
                port.Close();
            }
        }

private void trackBar1_Scroll(object sender, EventArgs e)
        {
            byte[] Numbers = BitConverter.GetBytes(trackBar1.Value);

            port.Write(Numbers, 0, 1);

        }

关于arduino,我们需要做的就是:

A]开始我们的连载

B]读取传入数据

#include <LiquidCrystal.h>                 // include the LCD library

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);     //define the LCD display

int Number;                               //define the number int (the one we'll store our received trackbar value in)
    
    void setup()
    {
      Serial.begin(9600);           //A] Start our serial
    }
    
    void loop()
    {
      
       lcd.setCursor(0, 0);     // Set the LCD cursor at the top left corner

      if (Serial.available() > 0 ) {         //B] Read the incoming data
        nummer = Serial.read();              //
        lcd.print(nummer);                   //
      }                                      //
      else {};                               //
                      
   }

我使用 LCD 读取数据,因为我无法找到一种方法来打开串行监视器,同时发生 c# 和 arduino 之间的串行通信。 这就是我加入 LCD 的原因。

我觉得解释这超出了我遇到的这个小问题的范围。

我希望这对以后像我这样的初学者有帮助。

感谢提供帮助的人!