如何解决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之间发生串行通信。 这就是为什么我包括液晶显示器的原因。
我觉得解释这超出了我这个小问题的范围。
我希望这对以后像我一样的其他初学者有帮助。
感谢那些有帮助的人!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。