[英]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.