arduino 程序的机制

        从一个简单的 arduino 程序说起:

/*BlinkTurns on an LED on for one second, then off for one second, repeatedly.This example code is in the public domain.*/// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;// the setup routine runs once when you press reset:
void setup() {               // initialize the digital pin as an output.pinMode(led, OUTPUT);    
}// the loop routine runs over and over again forever:
void loop() {digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)delay(1000);               // wait for a seconddigitalWrite(led, LOW);    // turn the LED off by making the voltage LOWdelay(1000);               // wait for a second
}

        这个程序的主体,提供了 setup() 和 loop() 二个函数。setup 函数做一些初始化的工作,在系统上电或复位后,此函数只会执行一次。     loop 函数会在 setup 之后一直循环运行。


        在了解如何使用之后,其背后的机制是怎样的呢,那么,可以到安装目录下打开代码文件:C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino\main.cpp  代码如下:


#include <Arduino.h>int main(void)
{init();#if defined(USBCON)USBDevice.attach();
#endifsetup();for (;;) {loop();if (serialEventRun) serialEventRun();}return 0;
}

       相信您看到了这段代码,就该知道 setup 和 loop 函数的前世今生了吧。我们所写的setup 和 loop 函数是这两个函数的定义。这两个函数在 main ( )主程序中已经预调用了。   在 loop 函数运行之后,我们还会看到 serialEventRun 的函数,此函数的功能是当串口有数据过来的时候,它可以调用Arduino的另一个函数 serialEvent。

       打开 Arduino IDE , 选择菜单:文件 -> 示例 -> 04.Communication -> SerialEvent 具体看下面的代码:


/*Serial Event exampleWhen new serial data arrives, this sketch adds it to a String.When a newline is received, the loop prints the string andclears it.A good test for this is to try it with a GPS receiverthat sends out NMEA 0183 sentences.Created 9 May 2011by Tom IgoeThis example code is in the public domain.http://www.arduino.cc/en/Tutorial/SerialEvent*/String inputString = "";         // a string to hold incoming data
boolean stringComplete = false;  // whether the string is completevoid setup() {// initialize serial:Serial.begin(9600);// reserve 200 bytes for the inputString:inputString.reserve(200);
}void loop() {// print the string when a newline arrives:if (stringComplete) {Serial.println(inputString);// clear the string:inputString = "";stringComplete = false;}
}/*SerialEvent occurs whenever a new data comes in thehardware serial RX.  This routine is run between eachtime loop() runs, so using delay inside loop can delayresponse.  Multiple bytes of data may be available.*/
void serialEvent() {while (Serial.available()) {// get the new byte:char inChar = (char)Serial.read();// add it to the inputString:inputString += inChar;// if the incoming character is a newline, set a flag// so the main loop can do something about it:if (inChar == '\n') {stringComplete = true;}}
}

        此代码的功能是:系统上电后,接收串口的输入数据并发送回去,类似 echo。系统的实现是通过在主循环判断全局变量 stringComplete 的状态来决定是否发送接收到的数据。而 stringComplete 的状态是在 serialEvent 这个函数里赋值的。根据 serialEvent 函数注释看,此函数的调用是在每次 loop 函数运行之后才执行的。再回到我们之前的代码:


for (;;) {loop();if (serialEventRun) serialEventRun();}

        通过上面的代码,可以很明确的看出 serialEventRun 函数是在 loop 函数之后执行的。如果我们有多个串口,比如 2560 的板子提供了4个串口,那么 serialEventRun 函数又是如何处理的呢,我们打开代码文件:C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino\HardwareSerial.cpp 找到 serialEventRun 函数的实现,代码如下:

void serialEventRun(void)
{
#ifdef serialEvent_implementedif (Serial.available()) serialEvent();
#endif
#ifdef serialEvent1_implementedif (Serial1.available()) serialEvent1();
#endif
#ifdef serialEvent2_implementedif (Serial2.available()) serialEvent2();
#endif
#ifdef serialEvent3_implementedif (Serial3.available()) serialEvent3();
#endif
}

        serialEventRun 的函数体中是依次的调用 serialEvent() serialEvent1() serialEvent2() serialEvent3() 函数的。如果您的应用需要通过多个串口读写数据,那么在使用 serialEvent 函数的过程中,就要考虑接受的数据长度以及函数的处理时间,否则极有可能会导致其它串口的接收缓冲区满而影响应用。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电池技术多年没有较大发展,成为移动设备最大制约

各大厂商致力于发展闪充技术以此解决电池续航问题。 对于电子产品来说&#xff0c;不管是什么&#xff0c;我们最头疼的无疑就是电池问题了。而电池的重要性更是不用多说&#xff0c;但是&#xff0c;以目前的科技水平来看&#xff0c;就拿智能手机的CPU等功能来说&#xff0c…

什么样的数据应该放入缓存

把数据放入缓存,有三个标准: 1.数据量不大 2.访问频率高 3.数据更改频率低转载于:https://www.cnblogs.com/hwgok/p/5494915.html

VMWare 安装 Eclipse

由于之前已经安装了 OpenJDK 所以 这次我们可以直接下载 eclipse来安装。 Eclipse 下载&#xff1a;http://www.eclipse.org/downloads/?osTypelinux&releaseundefined 如果下载后 在 下载目录&#xff0c;运行解压 &#xff08;我下载的&#xff1a;eclipse-inst-lin…

C语言条件编译及编译预处理阶段

一、C语言由源代码生成的各阶段如下&#xff1a; C源程序&#xff0d;>编译预处理&#xff0d;>编译&#xff0d;>优化程序&#xff0d;>汇编程序&#xff0d;>链接程序&#xff0d;>可执行文件其中 编译预处理阶段&#xff0c;读取c源程序&#xff0c;对其中…

HALCON示例程序board.hdev检测电路板焊锡有无程序剖析

HALCON示例程序board.hdev检测电路板焊锡有无程序剖析 示例程序源码&#xff08;加注释&#xff09; *这是关于系统设置的函数&#xff0c;剪辑区域&#xff0c;设置剪辑区域设置为使能。为clip_region做的设置&#xff0c;后文会介绍 get_system (‘clip_region’, Informat…

【机器学习】SVM理论与python实践系列

理论部分: 《机器学习——支持向量机SVM之线性模型》 《机器学习——支持向量机SVM之非线性模型低维到高维映射》 《机器学习——支持向量机SVM之非线性模型原问题与对偶问题》 《机器学习——常用核函数》 《机器学习——支持向量机SVM之非线性模型原问题转化为对偶问题…

eoLinker-API_Shop_验证码识别与生成类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等...

以下示例代码适用于 www.apishop.net 网站下的API&#xff0c;使用本文提及的接口调用代码示例前&#xff0c;您需要先申请相应的API服务。 六位图片验证码生成&#xff1a;包括纯数字、小写字母、大写字母、大小写混合、数字小写、数字大写、数字大小写等情况。四位图片验证码…

网上书店 买方数据库

买方表 属性 字段名 类型 键值 是否空 用户ID UserId char(5) 主键 用户名称 UserName nvarchar(50) 用户密码 UserPwd nvarchar(50) 用户真实姓名 UserRealName nvarchar(50) 用户地址 UserAddress nvarchar(100) …

Web开发模式(MVC设计模式)

1.MVC&#xff1a;(Model-View-Controller)操作流程 显示层View:主要负责接收Servlet传递的内容&#xff0c;并调用JavaBean把内容显示给用户。 控制层Controller:负责所有的用户请求参数&#xff0c;判断请求参数是否合法&#xff0c;根据请求方式调用JavaBean进行处理&#x…

Arduino IDE 配置文件

最近学习Arduino。 Arduino开源硬件和Arduino IDE是一个很容易上手的系统。 目前arduino已经支持很多种板类型&#xff0c;甚至已经支持了部分arm芯片。比如arduino ng、arduino uno、arduino mini、pro mini等。但是大多数情况&#xff0c;都是使用的atmega8/at…

HALCON示例程序bottle.hdev、bottlet.hdev瓶体字符OCR的训练和检测

HALCON示例程序bottle.hdev、bottlet.hdev瓶体字符OCR的训练和检测 示例程序源码&#xff08;加注释&#xff09; 1、先介绍bottlet.hdev&#xff08;训练OCR识别文件&#xff09; *定义一个字符串变量FontName &#xff0c;内容是bottle FontName : ‘bottle’ *第一步分割…

【机器学习】神经网络BP理论与python实例系列

理论部分 《机器学习——人工神经网络之发展历史&#xff08;神经元数学模型、感知器算法&#xff09;》 《机器学习——人工神经网络之多层神经网络&#xff08;多层与三层&#xff09;》 《机器学习——人工神经网络之后向传播算法&#xff08;BP算法&#xff09;》 《机…

bzoj1597: [Usaco2008 Mar]土地购买

斜率优化dp。 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn 50000 10;struct Field {long long x,y; } t[maxn]; long long f[maxn],x[maxn],y[maxn]; int q[maxn],l,r; int n,cnt;bool cmp(F…

vue封装axios接口

一、安装axios axios安装命令&#xff1a;cnpm install axios 二、在文件中引用axios 一开始我是放在src下的main.js这个文件里面&#xff0c;后来发现mounted钩子读取接口方法为undefined&#xff0c;百度了才发现是vue生命周期的原因&#xff0c;最好的解决办法是把axios单独…

编写Arduino支持的C++类库

以下为摘抄的例子&#xff0c;已经亲自验证过&#xff0c;例子是正确的 我们在上一讲中实现了一个TN901红外温度传感器51程序到Arduino程序的转换&#xff0c;如果代码越来越多这样程序的可维护性会随之降低&#xff0c;也不适合团度开发。我们应该把常用的文件封装成C库&#…

函数,游标与存储过程的综合应用

--在TOY数据库中完成以下操作use toygo--1、编写一个存储过程&#xff0c;接收任意一个订单号&#xff0c;打印订单的表头数据。格式如下&#xff1a;--(其中订单编号由订单日期订单号的字符串组成)--订单编号:20010520000001 订货日期:2001-05-20 订货人:拉尔森create pro…

HALCON示例程序check_blister.hdev药品胶囊检测

HALCON check_blister.hdev药品胶囊检测 示例程序源码&#xff08;加注释&#xff09; 显示、读入图片、设置显示字体等&#xff0c;之前的帖子已经介绍过了 dev_close_window () dev_update_off () read_image (ImageOrig, ‘blister/blister_reference’) dev_open_window_f…

【机器学习实战】——常见函数积累

目录 第二章 k近邻算法 1、array.sum(axies 1) : 2、array.argsort(axies0/1) 3、array.tile(mat,(m,n)) 4、dict.get(key,value) 5、sorted函数 6、string.strip()函数 7、string.split() 8、scatter&#xff08;&#xff09;函数 9、min()&max() 10、enumera…

安装oracle 11g 客户端,检查过程中报物理内存不足的解决

今早接到同事电话&#xff0c;说安装oracle 11g客户端的时候&#xff0c;在检查先决条件的时候&#xff0c;报错&#xff0c;说内存不足&#xff0c;但是本机的内存是2G&#xff0c;肯定够用&#xff1a;如图&#xff1a; 找了一圈&#xff0c;原来Oracle执行先决条件检查是依赖…

智能时代 软件赋能——2017中国软件技术大会

由中国科学院软件研究所、中科软科技股份有限公司联合主办&#xff0c;北京中科凯亚科技有限公司协办的第15届中国软件技术大会将于2017年12月在北京 国家会议中心隆重举行。 毋庸置疑&#xff0c;我们正在迈入智能时代&#xff0c;伴随着物联网、云计算、大数据、人工智能等智…