国外课栈 - 国外电子信息技术视频教程、电子书和博文栈

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

 二维码 59
发表时间:2019-01-15 22:52


在本文中,我们将把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#因为它很方便而且我很熟悉它。

图1.   FT232R数据表。图片由   FTDI Chip提供   (PDF)

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),然后上传我们的草图。


图5. Arduino IDE

编写C#应用程序

为了编写C#应用程序,我们应该在Visual Studio中创建一个简单的窗体。接下来,从工具箱部分,我们需要拖放“串行端口”工具。可以在工具的属性部分中配置所有设置。将端口名称设置为FT232的端口名称。并将波特率设置为115200.握手设置为“无”。我们还需要添加一个按钮来切换LED状态和一个文本框来显示接收的数据。我们可以简单地从工具箱中添加这些内容。设置应如图6所示。

图6.主窗体和串口配置

完成视觉工作后,我们准备做一些编码。首先,为了使用串口,我们需要打开它,然后我们可以从串行缓冲区写入或读取。我们可以访问代码中的串行中断。串行通信中断提供了更好的响应,因为我们在数据可用时处理它们。C#串行端口还有一个事件,当数据进入缓冲区时将触发该事件。我们可以通过转到属性部分的events选项卡并双击DataReceived来使用此事件(参见图7)。Visual Studio将自动创建事件。

图7.我们将使用DataReceived中断

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

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命令/响应协议,可以很容易地适用于各种应用程序。


完整代码地址链接:https://download.csdn.net/download/jiyotin/10920988





文章分类: 平台创客Arduino
分享到:
会员登录
登录
我的资料
留言
回到顶部