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 的原因。
我觉得解释这超出了我遇到的这个小问题的范围。
我希望这对以后像我这样的初学者有帮助。
感谢提供帮助的人!
大家下午好,
我正在试验 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 的原因。
我觉得解释这超出了我遇到的这个小问题的范围。
我希望这对以后像我这样的初学者有帮助。
感谢提供帮助的人!