C#与Arduino通过串口通信来控制LED灯的状态
一、引言
最近摆弄了一段时间的Arduino,发现Arduino做一些电子类项目、监控、机器人、电子玩具比较容易,并且Arduino与.NET程序集成也不难。接下来介绍一个简单的小程序,C#做的一个Windows Form程序,通过.NET串口编程与Arduino通信,来控制LED灯的状态,以此演示C#与Arduino串口通信的方法。
二、功能演示
这个小程序功能极其简单,运行Windows Form程序,点击“开灯”单选框则点亮与Arduino相连的LED灯,点击“关灯”单选框则熄灭LED灯,图下2图所示:

三、实现机制
- C#程序向Arduino使用的串口COM4(可通过操作系统的控制面板查看Arduino使用的串口号)输出命令字符:1—表示点亮,0—表示熄灭;
- Arduino读取串口接收到的命令字符,如果读到的字符为1则向LED所在针脚pin 13输出高电平点亮LED灯,如果读到的字符为0则输出低电平熄灭LED灯。
四、开发环境
- Arduino 1.0.5 IDE
- Visual studio 2010
五、所需元件
- Arduino UNO板1块(必需)
- Arduino UNO板与电脑相连的USB线1根(必需)
- LED灯1个(可选)
- 面包板1块(可选)
- 10K电阻1个(可选)
- 跳线2根(可选)
注:Arduino UNO板在pin 13自带了1个LED灯,可以用此灯代替单独的LED灯,所以面包板、LED灯等为可选元件。
六、元件连接
元件连接很简单:LED灯的正极与Arduino的数字针脚pin 13相连,电阻与LED串联,然后接回Arduino的GND,最后用USB线把Arduino板与电脑相连,如上图所示。
七、C#实现代码
创建一个Windows Form,拖放2个单选框,编写Windows Form后台代码,利用.NET的SerialPort类进行串口操作:
public partial class Form1 : Form
{
SerialPort port; public Form1()
{
InitializeComponent(); this.FormClosed += new FormClosedEventHandler(Form1_FormClosed); if (port == null)
{
//COM4为Arduino使用的串口号,需根据实际情况调整
port = new SerialPort("COM4", );
port.Open();
}
} void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if (port != null && port.IsOpen)
{
port.Close();
}
} //点亮
private void rbOpen_CheckedChanged(object sender, EventArgs e)
{
if (this.rbOpen.Checked)
{
PortWrite("");
}
} //熄灭
private void rbClose_CheckedChanged(object sender, EventArgs e)
{
if (this.rbClose.Checked)
{
PortWrite("");
}
} //向串口输出命令字符
private void PortWrite(string message)
{
if (port != null && port.IsOpen)
{
port.Write(message);
//port.WriteLine(message);
}
}
}
八、Arduino Sketch代码
读取串口接收到的字符,并根据字符向pin 13输出高电平或低电平,对LED灯进行点亮或熄灭控制:
const int LedPin = ;
int ledState = ; void setup()
{
pinMode(LedPin, OUTPUT); Serial.begin();
} void loop()
{
char receiveVal; if(Serial.available() > )
{
receiveVal = Serial.read(); if(receiveVal == '')
ledState = ;
else
ledState = ;
} digitalWrite(LedPin, ledState); delay();
}
九、总结
本文通过一个简单的例子,演示了C#与Arduino通过串口通信来控制LED灯状态的机制,总共几十行代码就搞定,体现了Arduino开发简单的宗旨。当然本例子只实现了C#程序向Arduino发数据的单向通信,真实的系统还可根据需要实现Arduino向C#发送数据的双向通信。
Arduino与.NET两者集成可以发挥两个平台的长处:Arduino擅长控制硬件设备与各类传感器;而.NET则拥有强大的数据处理能力、通信功能、以及美观的程序界面。当然,通过USB线实现Arduino与PC之间的串口通信,由于需要与PC连线且USB线的长度往往有限,所以这些因素制约了其应用。但是,Arduino与PC之间还有其他的通信方式,比如以太网线、Wifi、蓝牙等,极大的提高了Arduino的应用范围。
写文章真的比较耗时间,所以一直就不怎么喜欢写文章。今天就写到这,后面有时间的话会陆陆续续写一些关于Arduino应用与开发等各个方面的文章。
十、参考资料
- Arduino官网
- Arduino Cookbook
- Arduino in Action
- Beginning Arduino
- Arduino Internals
- Arduino Workshop: A Hands-On Introduction with 65 Projects
- Exploring Arduino: Tools and Techniques for Engineering Wizardry
- Pro Arduino
- Arduino Robotics
- Building Wireless Sensor Networks: with ZigBee, XBee, Arduino, and Processing
- Arduino and Kinect Projects: Design, Build, Blow Their Minds
- Arduino Wearables
C#与Arduino通过串口通信来控制LED灯的状态的更多相关文章
- arduino入门学习实现语音控制LED灯
需要的准备的硬件arduino+PC+麦克风实现语音命令控制LED灯的亮灭. 首先需要将写好的arduino程序烧录到arduino uno主板中,下面是代码如下: int val;//定义变量val ...
- arduino 红外遥控器控制LED灯
/* 日期:2016.9.1 功能:红外遥控器控制LED灯 开,关,闪烁,呼吸 元件: 跳线公公头 * 5 led 220欧电阻 红外接收管,红外遥控 接线: 红外灯面向自己从左到右分别接 IO3 , ...
- Arduino控制LED灯(开关控制)
问题:当使用"digitalRead(BUT) == 1"控制LED灯时会出现"digitalWrite(LED, ledState);"的值出现跳动. 原因: ...
- enc28J60 网页控制LED灯
软件IDE:Arduino 1.6.3 1.库的安装: 从https://github.com/jcw/ethercard 下载源码包,解压,复制ethercard-master文件夹到Arduino ...
- 嵌入式学习笔记(综合提高篇 第一章) -- 利用串口点亮/关闭LED灯
1 前言 从踏入嵌入式行业到现在已经过去了4年多,参与开发过的产品不少,有交换机.光端机以及光纤收发器,停车场出入缴费系统,二维码扫码枪,智能指纹锁以及数字IC芯片开发等; 涉及产品中中既有 ...
- 嵌入式Linux学习入门:控制LED灯
记录自己linux学习过程,让自己能够一直坚持下去 1.原理图分析: nLED_1, nLED_2, nLED_4, 给低电平则对应LED灯亮,高电平则对应LED灯灭, S3C2440芯片GPF4-G ...
- BLE 安卓APP控制LED灯的实现(转)
源:BLE 安卓APP控制LED灯的实现 //注:参考AmoMcu源代码修改. 打开APP,检查蓝牙是否打开 BluetoothAdapter mBluetoothAdapter; final Blu ...
- TI-RTOS 控制LED灯
TI将FreeRtos放在自家芯片上,于是得到了TI-RTOS,两者的区别我还不太清楚,近日因为项目需要,开始试用TI-RTOS,先来一个点灯的实验吧,算是 hello world. 这次手上的板子是 ...
- 云中树莓派(4):利用声音传感器控制Led灯
云中树莓派(1):环境准备 云中树莓派(2):将传感器数据上传到AWS IoT 并利用Kibana进行展示 云中树莓派(3):通过 AWS IoT 控制树莓派上的Led 云中树莓派(4):利用声音传感 ...
随机推荐
- (hdu step 6.3.2)Girls and Boys(比赛离开后几个人求不匹配,与邻接矩阵)
称号: Girls and Boys Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- OCP-1Z0-051-标题决心-文章5称号
5. Which SQL statements would display the value 1890.55 as $1,890.55? (Choose three .) A. SELECT TO_ ...
- JS 精度问题处理
/除法函数,用来得到精确的除法结果 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显.这个函数返回较为精确的除法结果. //调用:accDiv(arg1,arg2) ...
- PHP进口Excel至MySQL方法
PHP-ExcelReader,下载地址: http://sourceforge.net/projects/phpexcelreader 注意点: reader.php 中的以下这行要改动 1.将 ...
- 【百度地图API】建立全国银行位置查询系统(一)——如何创建地图
原文:[百度地图API]建立全国银行位置查询系统(一)--如何创建地图 <摘要>你将在第一章中学会以下知识: 如何创建一个网页文件 怎样利用百度地图API建立一张2D地图,以及3D地图 如 ...
- datatables表格
datatables表格 并不是所有的后台开发都有美工和前端工程师来配合做页面,为了显示数据并有一定的美感,jQuery的DataTables插件对于像我这样的前端菜鸟来说真是雪中送炭,当然对于专业的 ...
- ASP.NET 5:初始化数据库
ASP.NET 5:初始化数据库 1.初始化数据库 1.2目录 这不是专述模式/架构设计的帖子,架构搭建以讲解文章为目的,先不过多分层. 截这个图也是便于你对应下面找代码文件路径! 1.2代码 先控制 ...
- SSH六部曲
<strong> 一共有6步(文章底部附有源码下载地址,刚学完ssh的可以借鉴)</strong> 1 写一个Hibernate应用,完成用户的增加 1) User实体 2)U ...
- Robotium源码分析之Instrumentation进阶
在分析Robotium的运行原理之前,我们有必要先搞清楚Instrumentation的一些相关知识点,因为Robotium就是基于Instrumentation而开发出来的一套自动化测试框架.鉴于之 ...
- ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)
原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!) 继上篇:ORACLE P ...