簡體   English   中英

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,我會按如下方式“翻譯”字節:

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 事件並雙擊它。 這基本上創建了滾動軌跡欄的事件,現在我們必須在這個事件中描述我們想要發生的事情。

我們想通過串口發送軌跡欄的數據。 軌跡欄值檢索如下:

trackbar1.value

現在我們知道如何檢索值,我們必須查看發送它的選項,使用port.write()有 3 個選項,我們稍后將使用它:

-寫(字符串)
-寫(字節[],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, 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 之間進行串行通信。 這就是為什么我包括一個液晶顯示器。

我覺得解釋這超出了我遇到的這個小問題的范圍。

我希望這對將來像我一樣的其他初學者有所幫助。

感謝那些有幫助的人!

暫無
暫無

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

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