使用C#应用程序与Arduino进行通信
在本文中,我们将把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中下载。代码压缩包文件名与本文同名。
- 使用C#应用程序与Arduino开发板进行通信
- Arduino开发板使用NRF24L01进行无线通信
- 应用程序使用Crypto API进行加密通信的一般步骤
- RPC 编程 使用 RPC 编程是在客户机和服务器实体之间进行可靠通信的最强大、最高效的方法之一。它为在分布式计算环境中运行的几乎所有应用程序提供基础。
- 使用GPIO模拟I2C总线进行通信
- 使用AIDL来进行跨进程通信
- 使用ARM标准C库进行嵌入式应用程序开发
- ios: 使用http进行通信(Transport Security has Blocked a cleartext HTTP)
- linux进程间的通信(C): 使用信号量进行同步的共享内存机制
- Arduino使用蓝牙通信模块
- 简单的,使用套接字进行TCP通信(使用进程实现并发)。
- Android中使用Socket来实现服务器端和客户端,进行数据通信(使用原生Socket)
- Java 网络编程(五) 使用TCP/IP的套接字(Socket)进行通信
- 使用TCP/IP的套接字(Socket)进行通信
- 逐步教你使用.net进行Socket通信进阶篇
- Android中使用HTTP和HttpClient进行通信
- 翻译:使用红外传感器与Arduino进行简单动作与手势检测
- 使用Visual C++进行串口通信编程
- Arduino与ESP8266进行串口通信
- 一步一步学习SignalR进行实时通信_9_托管在非Web应用程序