Arduino 背景能夠參考官方網站 www.arduino.ccgit
先看一個最簡單的示例程序:併發
打開 Arduino IDE , 選擇菜單:文件 -> 示例 -> 01.Basics -> Blinkdom
/* Blink Turns 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 second digitalWrite(led, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second }
程序主體很簡單,提供了 setup() 和 loop() 二個函數。ide
setup 函數作一些初始化的工做,在系統上電或復位後,此函數只會執行一次。函數
loop 函數會在 setup 以後一直循環運行。oop
在瞭解功能以後,咱們可能對背後的機制很感興趣,那麼咱們能夠到安裝目錄下打開代碼文件:C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino\main.cpp 代碼以下:測試
#include <Arduino.h> int main(void) { init(); #if defined(USBCON) USBDevice.attach(); #endif setup(); for (;;) { loop(); if (serialEventRun) serialEventRun(); } return 0; }
相信您看到了這段代碼,就該知道 setup 和 loop 函數的前世此生了吧。在 loop 函數運行以後,咱們還會看到 serialEventRun 的函數,此函數的功能是當串口有數據過來的時候,它能夠調用Arduino的另外一個函數 serialEvent。網站
打開 Arduino IDE , 選擇菜單:文件 -> 示例 -> 04.Communication -> SerialEvent 具體看下面的代碼:ui
/* Serial Event example When new serial data arrives, this sketch adds it to a String. When a newline is received, the loop prints the string and clears it. A good test for this is to try it with a GPS receiver that sends out NMEA 0183 sentences. Created 9 May 2011 by Tom Igoe This 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 complete void 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 the hardware serial RX. This routine is run between each time loop() runs, so using delay inside loop can delay response. 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 函數運行以後才執行的。再回到咱們以前的代碼:this
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_implemented if (Serial.available()) serialEvent(); #endif #ifdef serialEvent1_implemented if (Serial1.available()) serialEvent1(); #endif #ifdef serialEvent2_implemented if (Serial2.available()) serialEvent2(); #endif #ifdef serialEvent3_implemented if (Serial3.available()) serialEvent3(); #endif }
serialEventRun 的函數體中是依次的調用 serialEvent() serialEvent1() serialEvent2() serialEvent3() 函數的。若是您的應用須要經過多個串口讀寫數據,那麼在使用 serialEvent 函數的過程當中,就要考慮接受的數據長度以及函數的處理時間,不然極有可能會致使其它串口的接收緩衝區滿而影響應用。
**** 看門狗 (測試卡死了 bootloader) 請謹慎操做 ****
最新的 Arduino 1.5.6-r2 燒寫的bootloader 已經支持看門狗了。
從新燒寫mega2560的bootloader 燒寫完以後 用usb直接編譯下載 已經能夠支持avr的這個wdt.h了,不用再像以前那樣非得用ISP下載程序了。
使用代碼以下:
/*------ avr看門狗測試 -----*/ #include <avr/wdt.h> void setup() { pinMode(13,OUTPUT); wdt_enable(WDTO_4S); //開啓看門狗,並設置溢出時間爲4秒 digitalWrite(13,HIGH); delay(100); digitalWrite(13,LOW); delay(100); digitalWrite(13,HIGH); delay(100); digitalWrite(13,LOW); delay(100); } void loop() { digitalWrite(13,HIGH); delay(600); digitalWrite(13,LOW); delay(600); //wdt_reset(); //喂狗操做,使看門狗定時器復位 }
溢出時間以下:
序號
|
常量
|
定義
|
1
|
WDTO_15MS
|
看門狗定時器15ms超時
|
2
|
WDTO_30MS
|
看門狗定時器30ms超時
|
3
|
WDTO_60MS
|
看門狗定時器60ms超時
|
4
|
WDTO_120MS
|
看門狗定時器120ms超時
|
5
|
WDTO_250MS
|
看門狗定時器250ms超時
|
6
|
WDTO_500MS
|
看門狗定時器500ms超時
|
7
|
WDTO_1S
|
看門狗定時器1S超時
|
8
|
WDTO_2S
|
看門狗定時器2S超時
|
9
|
WDTO_4S
|
看門狗定時器4S超時
|
10
|
WDTO_8S
|
看門狗定時器8S超時
|
http://mcukits.com/2009/04/06/arduino-ethernet-shield-mega-hack/
or
pinMode(11,INPUT); pinMode(12,INPUT); pinMode(13,INPUT);