C#与arduino通讯

问题描述

大家下午好

我正在尝试c#和arduino之间的串行通信。 要了解通信在发送数字方面是如何工作的(我知道,已经讨论了很多,但请耐心等待),我想将跟踪栏的值发送到arduino,然后将其转换为伺服运动。 / p>

如果我理解正确,则不能直接发送整数,而必须先将其转换为字节。 所以为此,我将轨迹栏的数值转换为字节数组

在C#中:

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

通过串行通讯,我将发送该值

port.Write(Numbers,1);

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

对于Arduino,我将按以下方式“翻译”字节:

int IncomingValue = Serial.parseInt();

然后我想将IncomingValue用于我的伺服器。

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

谢谢

解决方法

对于那些有兴趣修改arduino串行通信的c#(只是描述我所遇到的问题)并发送要在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事件,然后双击它。 基本上,这会产生滚动轨迹栏的事件,现在我们必须在此事件中描述我们想要发生的事情。

我们要通过串行发送轨迹栏的数据。跟踪栏值的检索如下:

trackbar1.value

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

-Write(String)
-Write(Byte [],Int32,Int32)
-Write(Char [],Int32,Int32)

但是当我正在使用int时,我发现第二个是我需要的那个。 如您所见,我们需要一个Byte数组才能发送此消息,因此我们将使用BitConverter并声明一个称为Numbers的字节数组将轨迹栏数据转换为一个字节数组:

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

现在我们有了所需的每个元素:

  • 已打开的端口。我们还介绍了何时关闭它。
  • 轨迹栏及其要发送的数据。
  • 跟踪栏的数据“打包”为发送数据的正确方法。

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

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

            port.Write(Numbers,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,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之间发生串行通信。 这就是为什么我包括液晶显示器的原因。

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

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

感谢那些有帮助的人!