您的位置:首页 > 产品设计 > UI/UE

使用C#应用程序与Arduino进行通信

2019-01-16 15:54 549 查看

在本文中,我们将把Arduino Pro Mini连接到PC并使用C#Windows应用程序与它进行通信。

将硬件连接到PC可能非常有用,不仅是因为您可以发送命令和监视状态。您还可以实时调试代码。当您在使用模块时,检查变量特别有用,并且您想知道模块响应并跟踪状态机。

关于Arduino Pro Mini和C#的注意事项

首先,我想描述一下我选择Arduino Pro Mini的原因。在我看来,小巧的外形是当今设计的一个优势。如今,随着便携式物联网设备的日益普及,小型化的需求变得越来越重要 - 而Arduino Pro Mini即使不是很小也不算什么。Arduino Pro Mini针对小空间进行了优化(当您需要尽可能小的电路时),但在构建项目时却非常强大。另一个好处是它没有焊接头,占用了大量的垂直空间。您可以通过将导线焊接到引脚来简单地访问所需的引脚。由于它体积小,因此没有内置USB组件,因此您需要使用额外的组件来实现该功能。市场上有许多串口转USB转换器,但就个人而言,我更喜欢选择能够为我提供所有握手引脚的转换器,而不仅仅是Rx和Tx。这就是我设计一个基于FT232R的简单接口板的原因。我使用了芯片上的所有串行信号。您可以从图1中的数据表中看到我所采用的电路。其次,我想解释为什么选择C#。有许多编程语言和许多可视化程序使Windows的可视化应用程序编程变得更加简单。他们每个都有优点和缺点。但是,对我来说,使用visual studio可以为我做很多工作。它允许访问许多预编译的库和工具,帮助我们有效地构建应用程序。它还允许我们使用C#语言,这是非常强大的。所以我们在本文中使用C#因为它很方便而且我很熟悉它。

BOM

硬件

Arduino Pro Mini 5V

FT232R USB转串口模块

LED面包板

用于将接头连接到FT232R板并将接头3连接到LED的导线

软件

Arduino IDE

Visual Studio

建立

我使用自己的FT232R板进行编程并与Arduino Pro Mini 5V通信。Arduino PM有六个引脚标题,用于编程标记为“BLK”,“GND”,“VCC”,“RXI”,“TXO”和“GRN”,如图2所示。

图2. Arduino Pro Mini的引脚。

图3. Arduino Pro Mini原理图。图片由Arduino提供。

在用于编程的六个引脚接头中,如图3所示,第一个引脚BLK接地。GND和VCC显然需要连接到FT232R板的VCC和GND。通过这种方式,Arduino将提供USB电源,无需额外供电。我们应该考虑的是USB端口的当前限制。如果我们的电路消耗超过500mA,我们应该添加一个外部电源。RXI应连接到FT232的TX,TXO连接到FT232的RX,GRN连接到FT232的DTR,这将使FT232能够随时复位电路板。接线后,您的电路应如图4所示。现在我们已准备好对Arduino Pro Mini进行编程。

图4.设置

上传草图

出于测试目的,我们将编写一个简单的代码来读取串行输入并相应地设置引脚3的状态:

const int led = 3;

int state=0;

void setup()

{

Serial.begin(115200); //Starts the serial connection with 115200 Buad Rate

pinMode(led, OUTPUT); //Sets led pin as an output

Serial.write("ALL ABOUT CIRCUITS!");//Send "ALL ABOUT CIRCUITS!" to the PC

}

void loop()

{

String data = Serial.readString();//Read the serial buffer as a string

if(data.indexOf("ON")!=-1)//checks if it is "ON"

{

digitalWrite(led, HIGH); // Sets the led ON

state=0;// Sets the state value to 0

}

else if(data.indexOf("OFF")!=-1)//checks if it is "OFF"

{

digitalWrite(led, LOW); //Sets the led OFF

state=0;// Sets the state value to 1

}

else if(data.indexOf("STATE")!=-1)//checks if it is "STATE"

{

Serial.write("state=");//Sends the state

Serial.println(state);

}

}

我们需要做的就是将我们的电路板设置为Arduino Pro或Pro Mini(参见图5),然后上传我们的草图。
编写C#应用程序

为了编写C#应用程序,我们应该在Visual Studio中创建一个简单的窗体。接下来,从工具箱部分,我们需要拖放“串行端口”工具。可以在工具的属性部分中配置所有设置。将端口名称设置为FT232的端口名称。并将波特率设置为115200.握手设置为“无”。我们还需要添加一个按钮来切换LED状态和一个文本框来显示接收的数据。我们可以简单地从工具箱中添加这些内容。设置应如图6所示。
完成视觉工作后,我们准备做一些编码。首先,为了使用串口,我们需要打开它,然后我们可以从串行缓冲区写入或读取。我们可以访问代码中的串行中断。串行通信中断提供了更好的响应,因为我们在数据可用时处理它们。C#串行端口还有一个事件,当数据进入缓冲区时将触发该事件。我们可以通过转到属性部分的events选项卡并双击DataReceived来使用此事件(参见图7)。Visual Studio将自动创建事件。

在我们发送或接收数据之前,我们需要打开串口:

private void Form1_Load(object sender, EventArgs e)

{

serialPort1.Open();

}

然后我们可以读取或写入数据。

代码如下所示:

public delegate void AddDataDelegate(String myString);// Delegate for richtextbox

public AddDataDelegate myDelegate;// An instance of AddDataDelegate

public delegate void AddDataDelegate_button(String myString);// Delegate for button

public AddDataDelegate_button myDelegate_button;// An instance of AddDataDelegate_button

bool status=false;// LED status

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

serialPort1.Open();//Opening the serial port

this.myDelegate = new AddDataDelegate(AddDataMethod);//Assigning "the function that changes richtextbox text" to the delegate

this.myDelegate_button = new AddDataDelegate_button(AddDataMethod_button);//Assigning "the function that changes button text" to the delegate

serialPort1.WriteLine("STATE");

}

public void AddDataMethod_button(String myString)

{

button1.Text = myString;//changes button text

}

public void AddDataMethod(String myString)

{

richTextBox1.Text = myString + Environment.NewLine;//changes richtextbox text

}

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)

{

string s = serialPort1.ReadExisting();//reads the serialport buffer

if (s.Contains("state="))//checks if it is status

{

s=s.Trim();

string new_s = s.Replace("state=", "");

if (new_s.Contains("0"))

{

status = false;

button1.Invoke(this.myDelegate_button, new Object[] { "ON" });//sets button text to on

}

else

{

status = true;

button1.Invoke(this.myDelegate_button, new Object[] { "OFF" });//sets button text to off

}

}

else

{

richTextBox1.Invoke(this.myDelegate, new Object[] { s });//adds the recieved bytes to the richtextbox

}

}

private void button1_Click(object sender, EventArgs e)

{

if(button1.Text.Contains("ON"))

{

serialPort1.WriteLine("OFF");//sends off command when the previous state was on

button1.Text = "OFF";

status = false;

}

else

{

serialPort1.WriteLine("ON");//sends on command when the previous state was off

button1.Text = "ON";

status = true;

}

}

代码说明

示例代码通过ASCII字符进行通信。这种方法方便且可扩展。在C#代码中,我们需要从Arduino Pro Mini读取引脚的状态,以便我们将“STATE”命令发送到Arduino板。Arduino将通过串口回答我们,回答为“state = 0”或“state = 1”。在Arduino向我们发送状态后,我们将相应地更新按钮文本。事件在主表单线程的不同线程中运行,因此它们具有不同的速度。例如,在我们的例子中,当我们从串口接收文本时,我们可能希望在文本框中显示它。但是,从一开始就创建了所有控件处理程序的主Windows线程控制器可能会有一些无法处理的控件,可以是一个richtextbox或一个按钮; 在这些条件下,如果我们从另一个与主处理程序分离的线程中调用一个文本框,程序将因多线程情况而崩溃。文本框控制器一次可以有两个不同的属性,因此我们应该等到它的工作完成。这就是我们无法从另一个线程更改文本框文本的原因,例如串行接收线程。为避免这种情况,我们可以使用Invoke方法。每个控制器都有一个Invoke方法,使我们能够从另一个线程更改其属性; Invoke方法可以从另一个线程执行某个委托。委托就像C ++中的方法指针,这意味着它们引用某种方法并安全地执行它。因此,首先,我们需要定义一个更改控制器属性的委托,在代码中将其命名为“myDelegate”,然后将其引用到Invoke方法。从代码中可以看出,通过使用Invoke函数,我们可以进行线程安全调用。其余的代码很简单。只要用户按下按钮,我们只需将“ON”或“OFF”命令写入串口。

结论

在本文中,我们学习了如何编写与Arduino Pro Mini交互的C#程序。我们使用简单的ASCII命令/响应协议,可以很容易地适用于各种应用程序。

完整代码在CSDN中下载。代码压缩包文件名与本文同名。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: