#Arduino語法
setup() 初始化函數
loop() 循環體函數
控制語句類似于C
//if if...else for switch case while do... while break continue return goto
擴展語法類似于C
//;(分號) {}(花括號) //(單行注釋) /* */(多行注釋) #define #include
算數運算符類似于C
//=(賦值運算符) +(加) -(減) *(乘) /(除) %(模)
比較運算符類似于C
//==(等于) !=(不等于) <(小于) >(大于) <=(小于等于) >=(大于等于)
布爾運算符類似于C
//&&(與) ||(或) !(非)
指針運算符類似于C
//* 取消引用運算符 & 引用運算符
位運算符類似于C
& (bitwise and) | (bitwise or) ^ (bitwise xor) ~ (bitwise not) << (bitshiftleft) >> (bitshift right)
復合運算符類似于C
++ (increment) -- (decrement) += (compound addition) -= (compound subtraction) *=(compound multiplication) /= (compounddivision) &= (compound bitwise and) |= (compound bitwise or)
常量
constants 預定義的常量
BOOL true false
引腳電壓定義,HIGH和LOW【當讀。read)或寫入(write)數字引腳時只有兩個可能的值: HIGH 和 LOW 】
HIGH(參考引腳)的含義取決于引腳(pin)的設置,引腳定義為INPUT或OUTPUT時含義有所不同。當一個引腳通過pinMode被設置為INPUT,并通過digitalRead讀。read)時。如果當前引腳的電壓大于等于3V,微控制器將會返回為HIGH。 引腳也可以通過pinMode被設置為INPUT,并通過digitalWrite設置為HIGH。輸入引腳的值將被一個內在的20K上拉電阻 控制 在HIGH上,除非一個外部電路將其拉低到LOW。 當一個引腳通過pinMode被設置為OUTPUT,并digitalWrite設置為HIGH時,引腳的電壓應在5V。在這種狀態下,它可以 輸出電流 。例如,點亮一個通過一串電阻接地或設置為LOW的OUTPUT屬性引腳的LED。
LOW的含義同樣取決于引腳設置,引腳定義為INPUT或OUTPUT時含義有所不同。當一個引腳通過pinMode配置為INPUT,通過digitalRead設置為讀取(read)時,如果當前引腳的電壓小于等于2V,微控制器將返回為LOW。 當一個引腳通過pinMode配置為OUTPUT,并通過digitalWrite設置為LOW時,引腳為0V。在這種狀態下,它可以 倒灌 電流。例如,點亮一個通過串聯電阻連接到+5V,或到另一個引腳配置為OUTPUT、HIGH的的LED。 數字引腳(Digital pins)定義,INPUT和OUTPUT【數字引腳當作 INPUT 或 OUTPUT都可以 。用pinMode()方法使一個數字引腳從INPUT到OUTPUT變化】
Arduino(Atmega)引腳通過pinMode()配置為 輸入(INPUT) 即是將其配置在一個高阻抗的狀態。配置為INPUT的引腳可以理解為引腳取樣時對電路有極小的需求,即等效于在引腳前串聯一個100兆歐姆(Megohms)的電阻。這使得它們非常利于讀取傳感器,而不是為LED供電。
引腳通過pinMode()配置為 輸出(OUTPUT) 即是將其配置在一個低阻抗的狀態。
這意味著它們可以為電路提供充足的電流。Atmega引腳可以向其他設備/電路提供(提供正電流positive current)或倒灌(提供負電流negative current)達40毫安(mA)的電流。這使得它們利于給LED供電,而不是讀取傳感器。輸出(OUTPUT)引腳被短路的接地或5V電路上會受到損壞甚至燒毀。Atmega引腳在為繼電器或電機供電時,由于電流不足,將需要一些外接電路來實現供電。
整數常量
進制 例子 格式 備注
10(十進制) 123 無
2(二進制) B1111011 前綴'B' 只適用于8位的值(0到255)字符0-1有效
8(八進制) 0173 前綴”0” 字符0-7有效
16(十六進制) 0x7B 前綴”0x” 字符0-9,A-F,A-F有效
小數是十進制數。這是數學常識。如果一個數沒有特定的前綴,則默認為十進制。
二進制以2為基底,只有數字0和1是有效的。
'u' or 'U' 指定一個常量為無符號型。(只能表示正數和0) 例如: 33u
'l' or 'L' 指定一個常量為長整型。(表示數的范圍更廣) 例如: 100000L
'ul' or 'UL' 這個你懂的,就是上面兩種類型,稱作無符號長整型。 例如:32767ul
浮點常量
浮點數 被轉換為 被轉換為
10.0 10
2.34E5 2.34 * 10^5234000
67E-12 67.0 *10^-12 0.000000000067
數據類型類似于C
void boolean char unsigned char byte int unsigned int word
long unsigned long float double string - char array String - object array -(數組)
數據類型轉換類似于C
char() byte() int() word() long() float()
word()
把一個值轉換為word數據類型的值,或由兩個字節創建一個字符。
word(x)
word(h, l)
參數
X:任何類型的值
H:高階(最左邊)字節
L:低序(最右邊)字節
修飾符類似于C
static volatile const
輔助工具
sizeof()
數字 I/O
pinMode()
將指定的引腳配置成輸出或輸入【pinMode(pin, mode) pin:要設置模式的引腳 mode:INPUT或OUTPUT】
例子:
ledPin = 13 // LED連接到數字腳13
void setup()
{
pinMode(ledPin,OUTPUT); //設置數字腳為輸出
}
void loop()
{
digitalWrite(ledPin,HIGH); //點亮LED
delay(1000); // 等待一秒
digitalWrite(ledPin, LOW); // 滅掉LED
delay(1000); //等待第二個
}
digitalWrite()
給一個數字引腳寫入HIGH或者LOW。
如果一個引腳已經使用pinMode()配置為OUTPUT模式,其電壓將被設置為相應的值,HIGH為5V(3.3V控制板上為3.3V),LOW為0V。
如果引腳配置為INPUT模式,使用digitalWrite()寫入HIGH值,將使內部20K上拉電阻(詳見數字引腳教程)。寫入LOW將會禁用上拉。上拉電阻可以點亮一個LED讓其微微亮,如果LED工作,但是亮度很低,可能是因為這個原因引起的。補救的辦法是 使用pinMode()函數設置為輸出引腳。
注意:數字13號引腳難以作為數字輸入使用,因為大部分的控制板上使用了一顆LED與一個電阻連接到他。如果啟動了內部的20K上拉電阻,他的電壓將在1.7V左右,而不是正常的5V,因為板載LED串聯的電阻把他使他降了下來,這意味著他返回的值總是LOW。如果必須使用數字13號引腳的輸入模式,需要使用外部上拉下拉電阻。
digitalRead()
digitalRead(PIN)【pin:你想讀取的引腳號(int),返回 HIGH 或 LOW】
例子:
ledPin = 13 // LED連接到13腳
int inPin = 7; // 按鈕連接到數字引腳7
int val = 0; //定義變量存以儲讀值
void setup()
{
pinMode(ledPin, OUTPUT); // 將13腳設置為輸出
pinMode(inPin, INPUT); // 將7腳設置為輸入
}
void loop()
{
val =digitalRead(inPin); // 讀取輸入腳
digitalWrite(ledPin,val); //將LED值設置為按鈕的值
}
模擬 I/O
analogReference()
analogReference(type)
配置用于模擬輸入的基準電壓(即輸入范圍的最大值)。選項有:
DEFAULT:默認5V(Arduino板為5V)或3.3伏特(Arduino板為3.3V)為基準電壓。
INTERNAL:在ATmega168和ATmega328上以1.1V為基準電壓,以及在ATmega8上以2.56V為基準電壓(Arduino Mega無此選項)
INTERNAL1V1:以1.1V為基準電壓(此選項僅針對Arduino Mega)
INTERNAL2V56:以2.56V為基準電壓(此選項僅針對Arduino Mega)
EXTERNAL:以AREF引腳(0至5V)的電壓作為基準電壓。
type:使用哪種參考類型(DEFAULT, INTERNAL,INTERNAL1V1, INTERNAL2V56, 或者 EXTERNAL)
改變基準電壓后,之前從anal??ogRead()讀取的數據可能不準確。
不要在AREF引腳上使用使用任何小于0V或超過5V的外部電壓。如果你使用AREF引腳上的電壓作為基準電壓,你在調用analogRead()前必須設置參考類型為EXTERNAL。否則,你將會削短有效的基準電壓(內部產生)和AREF引腳,這可能會損壞您Arduino板上的單片機。
另外,您可以在外部基準電壓和AREF引腳之間連接一個5K電阻,使你可以在外部和內部基準電壓之間切換。請注意,總阻值將會發生改變,因為AREF引腳內部有一個32K電阻。這兩個電阻都有分壓作用。所以,例如,如果輸入2.5V的電壓,最終在在AREF引腳上的電壓將為2.5 * 32 /(32 + 5)= 2.2V。
analogRead()
從指定的模擬引腳讀取數據值。 Arduino板包含一個6通道(Mini和Nano有8個通道,Mega有16個通道),10位模擬數字轉換器。這意味著它將0至5伏特之間的輸入電壓映射到0至1023之間的整數值。這將產生讀數之間的關系:5伏特/ 1024單位,或0.0049伏特(4.9 mV)每單位。輸入范圍和精度可以使用analogReference()改變。 它需要大約100微秒(0.0001)來讀取模擬輸入,所以最大的閱讀速度是每秒10000次。
analogRead(PIN)
引腳:從輸入引腳(大部分板子從0到5,Mini和Nano從0到7,Mega從0到15)讀取數值,返回從0到1023的整數值
例子:
int analogPin = 3; //電位器(中間的引腳)連接到模擬輸入引腳3
//另外兩個引腳分別接地和+5 V
int val = 0; //定義變量來存儲讀取的數值
void setup()
{
serial.begin(9600); //設置波特率(9600)
}
void loop()
{
val =analogRead(analogPin); //從輸入引腳讀取數值
serial.println(val); //顯示讀取的數值
}
analogWrite() - PWM
analogWrite(pin,value)
從一個引腳輸出模擬值(PWM)?捎糜谧LED以不同的亮度點亮或驅動電機以不同的速度旋轉。analogWrite()輸出結束后,該引腳將產生一個穩定的特殊占空比方波,直到下次調用analogWrite()(或在同一引腳調用digitalRead()或digitalWrite())。PWM信號的頻率大約是490赫茲。
在大多數arduino板(ATmega168或ATmega328),只有引腳3,5,6,9,10和11可以實現該功能。在aduino Mega上,引腳2到13可以實現該功能。老的Arduino板(ATmega8)的只有引腳9、10、11可以使用analogWrite()。在使用analogWrite()前,你不需要調用pinMode()來設置引腳為輸出引腳。
analogWrite函數與模擬引腳、analogRead函數沒有直接關系。
pin:用于輸入數值的引腳。
value:占空比:0(完全關閉)到255(完全打開)之間。
例子:
int ledPin = 9; // LED連接到數字引腳9
int analogPin = 3; //電位器連接到模擬引腳3
int val = 0; //定義變量存以儲讀值
void setup()
{
pinMode(ledPin,OUTPUT); //設置引腳為輸出引腳
}
void loop()
{
val =analogRead(analogPin); //從輸入引腳讀取數值
analogWrite(ledPin,val / 4); // 以val / 4的數值點亮LED(因為analogRead讀取的數值從0到1023,而analogWrite輸出的數值從0到255)
}
高級 I/O
tone()
在一個引腳上產生一個特定頻率的方波(50%占空比)。持續時間可以設定,否則波形會一直產生直到調用noTone()函數。該引腳可以連接壓電蜂鳴器或其他喇叭播放聲音。
在同一時刻只能產生一個聲音。如果一個引腳已經在播放音樂,那調用tone()將不會有任何效果。如果音樂在同一個引腳上播放,它會自動調整頻率。
使用tone()函數會與3腳和11腳的PWM產生干擾(Mega板除外)。
注意:如果你要在多個引腳上產生不同的音調,你要在對下一個引腳使用tone()函數前對此引腳調用noTone()函數。
tone(pin, frequency)
tone(pin, frequency, duration)
pin:要產生聲音的引腳
frequency: 產生聲音的頻率,單位Hz,類型unsigned int
duration:聲音持續的時間,單位毫秒(可選),類型unsigned long
noTone()
停止由tone()產生的方波。如果沒有使用tone()將不會有效果。
noTone(pin)
pin: 所要停止產生聲音的引腳
shiftOut()
將一個數據的一個字節一位一位的移出。從最高有效位(最左邊)或最低有效位(最右邊)開始。依次向數據腳寫入每一位,之后時鐘腳被拉高或拉低,指示剛才的數據有效。
注意:如果你所連接的設備時鐘類型為上升沿,你要確定在調用shiftOut()前時鐘腳為低電平,如調用digitalWrite(clockPin, LOW)。
注意:這是一個軟件實現;Arduino提供了一個硬件實現的SPI庫,它速度更快但只在特定腳有效。
shiftOut(dataPin, clockPin,bitOrder, value)
dataPin:輸出每一位數據的引腳(int)
clockPin:時鐘腳,當dataPin有值時此引腳電平變化(int)
bitOrder:輸出位的順序,最高位優先或最低位優先
value: 要移位輸出的數據(byte)
dataPin和clockPin要用pinMode()配置為輸出。 shiftOut目前只能輸出1個字節(8位),所以如果輸出值大于255需要分兩步。
//最高有效位優先串行輸出
int data= 500;
//移位輸出高字節
shiftOut(dataPin, clock, MSBFIRST,(data >> 8));
//移位輸出低字節
shiftOut(data, clock, MSBFIRST,data);
//最低有效位優先串行輸出
data = 500;
//移位輸出低字節
shiftOut(dataPin, clock, LSBFIRST,data);
//移位輸出高字節
shiftOut(dataPin, clock, LSBFIRST,(data >> 8));
例子:
相應電路,查看tutorial on controlling a74HC595 shift register
//引腳連接到74HC595的ST_CP
int latchPin = 8;
//引腳連接到74HC595的SH_CP
int clockPin = 12;
// //引腳連接到74HC595的DS
int dataPin = 11;
void setup() {
//設置引腳為輸出
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
//向上計數程序
for(J = 0;J <256; J + +){
//傳輸數據的時候將latchPin拉低
digitalWrite(latchpin, LOW);
shiftOut(dataPin,clockPin,LSBFIRST,J);
//之后將latchPin拉高以告訴芯片
//它不需要再接受信息了
digitalWrite(latchpin, HIGH);
delay(1000);
}
}
shiftIn()
將一個數據的一個字節一位一位的移入。從最高有效位(最左邊)或最低有效位(最右邊)開始。對于每個位,先拉高時鐘電平,再從數據傳輸線中讀取一位,再將時鐘線拉低。
注意:這是一個軟件實現;Arduino提供了一個硬件實現的SPI庫,它速度更快但只在特定腳有效。
shiftIn(dataPin,clockPin,bitOrder)
dataPin:輸出每一位數據的引腳(int)
clockPin:時鐘腳,當dataPin有值時此引腳電平變化(int)
bitOrder:輸出位的順序,最高位優先或最低位優先
pulseIn()
讀取一個引腳的脈沖(HIGH或LOW)。例如,如果value是HIGH,pulseIn()會等待引腳變為HIGH,開始計時,再等待引腳變為LOW并停止計時。返回脈沖的長度,單位微秒。如果在指定的時間內無脈沖函數返回。
此函數的計時功能由經驗決定,長時間的脈沖計時可能會出錯。計時范圍從10微秒至3分鐘。(1秒=1000毫秒=1000000微秒)
pulseIn(pin, value)
pulseIn(pin, value, timeout)
pin:你要進行脈沖計時的引腳號(int)。
value:要讀取的脈沖類型,HIGH或LOW(int)。
timeout (可選):指定脈沖計數的等待時間,單位為微秒,默認值是1秒(unsigned long)
返回:脈沖長度(微秒),如果等待超時返回0(unsigned long)
例子:
int pin = 7;
unsigned long duration;
void setup()
{
pinMode(pin, INPUT);
}
void loop()
{
duration =pulseIn(pin, HIGH);;
}
時間
millis()
返回Arduino開發板從運行當前程序開始的毫秒數。這個數字將在約50天后溢出(歸零)
例子:
unsigned long time;
void setup(){
Serial.begin(9600);
}
void loop(){
serial.print("Time:");
time =millis();
//打印從程序開始到現在的時間
serial.println(time);
//等待一秒鐘,以免發送大量的數據
delay(1000);
}
參數 millis 是一個無符號長整數,試圖和其他數據類型(如整型數)做數學運算可能會產生錯誤
micros()
返回 Arduino 開發板從運行當前程序開始的微秒數。這個數字將在約70分鐘后溢出(歸零)。在 16MHz 的 Arduino 開發板上(比如 Duemilanove 和 Nano),這個函數的分辨率為四微秒(即返回值總是四的倍數)。在 8MHz 的 Arduino 開發板上(比如 LilyPad),這個函數的分辨率為八微秒。
注意 :每毫秒是1,000微秒,每秒是1,000,000微秒。
例子:
unsigned long time;
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.print(“Time:”);
time =micros();
//打印從程序開始的時間
Serial.println(time);
//等待一秒鐘,以免發送大量的數據
delay(1000);
}
delay()
使程序暫停設定的時間(單位毫秒)。(一秒等于1000毫秒)
參數:ms:暫停的毫秒數(unsigned long)
例子:
ledPin = 13 / / LED連接到數字13腳
void setup()
{
pinMode(ledPin, OUTPUT); // 設置引腳為輸出
}
void loop()
{
digitalWrite(ledPin, HIGH); // 點亮LED
delay(1000); // 等待1秒
digitalWrite(ledPin, LOW); // 滅掉LED
delay(1000); // 等待一秒
}
雖然創建一個使用delay()的閃爍LED很簡單,并且許多例子將很短的delay用于消除開關抖動,delay()確實擁有很多顯著的缺點。在delay函數使用的過程中,讀取傳感器值、計算、引腳操作均無法執行,因此,它所帶來的后果就是使其他大多數活動暫停。其他操作定時的方法請參加millis()函數和它下面的例子。大多數熟練的程序員通常避免超過10毫秒的delay(),除非arduino程序非常簡單。
但某些操作在delay()執行時任然能夠運行,因為delay函數不會使中斷失效。通信端口RX接收到得數據會被記錄,PWM(analogWrite)值和引腳狀態會保持,中斷也會按設定的執行。
delayMicroseconds()
使程序暫停指定的一段時間(單位微秒)。一毫秒等于一千微秒,一秒等于1000000微秒。 目前,能夠產生的最大的延時準確值是16383。這可能會在未來的Arduino版本中改變。對于超過幾千微秒的延遲,你應該使用delay()代替。
例子:
int outPin = 8; // digital pin 8
void setup()
{
pinMode(outPin,OUTPUT); //設置為輸出的數字管腳
}
void loop()
{
digitalWrite(outPin,HIGH); //設置引腳高電平
delayMicroseconds(50); // 暫停50微秒
digitalWrite(outPin, LOW); // 設置引腳低電平
delayMicroseconds(50); // 暫停50微秒
}
數學運算
min() max() abs()
constrain(x,a,b)【將一個數約束在一個范圍內】
map(value, fromLow, fromHigh,toLow, toHigh)
value:需要映射的值
fromLow:當前范圍值的下限
fromHigh:當前范圍值的上限
toLow:目標范圍值的下限
toHigh:目標范圍值的上限
例子:
void setup(){}
void loop()
{
int val =analogRead(0);
val =map(val, 0, 1023, 0, 255);
analogWrite(9, val);
}
數學實現
long map(long x, long in_min, longin_max, long out_min, long out_max)
{
return (x - in_min) *(out_max - out_min) / (in_max - in_min) + out_min;
}
pow(base, exponent) sqrt(x)
三角函數
sin() cos() tan()
隨機數
randomSeed()【隨機數種子】 random()【random(max),random(min, max)】
位操作
lowByte() 取一個變量(例如一個字)的低位(最右邊)字節。
highByte() 提取一個字節的高位(最左邊的),或一個更長的字節的第二低位。
bitRead() 讀取一個數的位。bitRead(x, n) X:想要被讀取的數 N:被讀取的位,0是最重要(最右邊)的位 該位的值(0或1)
bitWrite() 在位上寫入數字變量 bitWrite(x, n,b) X:要寫入的數值變量 N:要寫入的數值變量的位,從0開始是最低(最右邊)的位 B:寫入位的數值(0或1)
bitSet() 為一個數字變量設置一個位 bitSet(x,n) X:想要設置的數字變量 N:想要設置的位,0是最重要(最右邊)的位
bitClear() 清除一個數值型數值的指定位(將此位設置成 0) bitClear(x,n) X:指定要清除位的數值 N:指定要清除位的位置,從0開始,0 表示最右端位
bit() 計算指定位的值(0位是1,1位是2,2位4,以此類推) bit(n) 需要計算的位
設置中斷函數
attachInterrupt()
attachInterrupt(interrupt,function, mode)
當發生外部中斷時,調用一個指定函數。當中斷發生時,該函數會取代正在執行的程序。大多數的Arduino板有兩個外部中斷:0(數字引腳2)和1(數字引腳3)。
arduino Mege有四個外部中斷:數字2(引腳21),3(20針),4(引腳19),5(引腳18)
interrupt:中斷引腳數
function:中斷發生時調用的函數,此函數必須不帶參數和不返回任何值。該函數有時被稱為中斷服務程序。
mode:定義何時發生中斷以下四個contstants預定有效值:
LOW 當引腳為低電平時,觸發中斷
CHANGE 當引腳電平發生改變時,觸發中斷
RISING 當引腳由低電平變為高電平時,觸發中斷
FALLING 當引腳由高電平變為低電平時,觸發中斷.
當中斷函數發生時,delya()和millis()的數值將不會繼續變化。當中斷發生時,串口收到的數據可能會丟失。你應該聲明一個變量來在未發生中斷時儲存變量。
在單片機自動化程序中當突發事件發生時,中斷是非常有用的,它可以幫助解決時序問題。一個使用中斷的任務可能會讀一個旋轉編碼器,監視用戶的輸入。
如果你想以確保程序始終抓住一個旋轉編碼器的脈沖,從來不缺少一個脈沖,它將使寫一個程序做任何事情都要非常棘手,因為該計劃將需要不斷輪詢的傳感器線編碼器,為了趕上脈沖發生時。其他傳感器也是如此,如試圖讀取一個聲音傳感器正試圖趕上一按,或紅外線槽傳感器(照片滅弧室),試圖抓住一個硬幣下降。在所有這些情況下,使用一個中斷可以釋放的微控制器來完成其他一些工作。
例子:
int pin = 13;
volatile int state = LOW;
void setup()
{
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, CHANGE);
}
void loop()
{
digitalWrite(pin, state);
}
void blink()
{
state =!state;
}
detachInterrupt()
關閉給定的中斷
detachInterrupt(interrupt)
interrupt: 中斷禁用的數(0或者1)
開關中斷
interrupts()
重新啟用中斷(使用noInterrupts()命令后將被禁用)。中斷允許一些重要任務在后臺運行,默認狀態是啟用的。禁用中斷后一些函數可能無法工作,并傳入信息可能會被忽略。中斷會稍微打亂代碼的時間,但是在關鍵部分可以禁用中斷
noInterrupts()
禁止中斷(重新使能中斷interrupts())。中斷允許在后臺運行一些重要任務,默認使能中斷。禁止中斷時部分函數會無法工作,通信中接收到的信息也可能會丟失。
中斷會稍影響計時代碼,在某些特定的代碼中也會失效
例子:
void setup()
void loop()
{
noInterrupts();
//關鍵的、時間敏感的代碼放在這
interrupts();
//其他代碼放在這
}
通訊
Serial
用于Arduino控制板和一臺計算機或其他設備之間的通信。所有的Arduino控制板有至少一個串口(又稱作為UART或USART)。它通過0(RX)和1(TX)數字引腳經過串口轉換芯片連接計算機USB端口與計算機進行通信。因此,如果你使用這些功能的同時你不能使用引腳0和1作為輸入或輸出。
您可以使用Arduino IDE內置的串口監視器與Arduino板通信。點擊工具欄上的串口監視器按鈕,調用begin()函數(選擇相同的波特率)。
Arduino Mega 有三個額外的串口:Serial 1使用19(RX)和18(TX),Serial 2使用17(RX)和16(TX),Serial3使用15(RX)和14(TX)。 若要使用這三個引腳與您的個人電腦通信,你需要一個額外的USB轉串口適配器,因為這三個引腳沒有連接到Mega上的USB轉串口適配器。若要用它們來與外部的TTL串口設備進行通信,將TX引腳連接到您的設備的RX引腳,將RX引腳連接到您的設備的TX引腳,將GND連接到您的設備的GND。(不要直接將這些引腳直接連接到RS232串口;他們的工作電壓在+/- 12V,可能會損壞您的Arduino控制板。)Arduino Leonardo板使用Serial 1通過0(RX)和1(TX)與viaRS-232通信,。Serial預留給使用Mouse and Keyboard libarariies的USB CDC通信 。更多信息,請參考Leonardo 開始使用頁和硬件頁。
函數:
if (Serial)
表示指定的串口是否準備好
在Leonardo上,if(Serial)表示不論有無USB CDC,串行連接都是開放的。對于所有其他的情況,包括Leonardo上的if(Serial1),將一直返回true。 這來自于 Arduino 1.0.1版本的介紹
對于所有的arduino板: if (Serial)
ArduinoLeonardo 特有: if (Serial1)
ArduinoMega 特有:
if (Serial1)
if (Serial2)
if (Serial3)
available()
獲取從串口讀取有效的字節數(字符)。這是已經傳輸到,并存儲在串行接收緩沖區(能夠存儲64個字節)的數據。 available()繼承了 Stream類
Serial.available()
僅適用于Arduino Mega :
Serial1.available()
Serial2.available()
Serial3.available()
例子:
incomingByte = 0; //傳入的串行數據
voidsetup() {
Serial.begin(9600); // 打開串行端口,設置傳輸波特率為9600 bps
}
voidloop() {
//只有當你接收到數據時才會發送數據,:
if (Serial.available() > 0) {
//讀取傳入的字節:
incomingByte = Serial.read();
//顯示你得到的數據:
Serial.print("I received: ");
Serial.println(incomingByte, DEC);
}
}
begin()
將串行數據傳輸速率設置為位/秒(波特)。與計算機進行通信時,可以使用這些波特率:300,1200,2400,4800,9600,14400,19200,28800,38400,57600或115200。當然,您也可以指定其他波特率 - 例如,引腳0和1和一個元件進行通信,它需要一個特定的波特率
Serial.begin(speed) 僅適用于Arduino Mega : Serial1.begin(speed) Serial2.begin(speed)Serial3.begin(speed)
speed: 位/秒 (波特) - long
end()
停用串行通信,使RX和TX引腳用于一般輸入和輸出。要重新使用串行通信, 需要 Serial.begin()語句
Serial.end()
僅適用于Arduino Mega: Serial1.end()Serial2.end() Serial3.end()
find()
Serial.find() 從串行緩沖器中讀取數據,直到發現給定長度的目標字符串。如果找到目標字符串,該函數返回true,如果超時則返回false
Serial.flush() 繼承了 Stream 類
Serial.find(target)
target : 要搜索的字符串(字符)
findUntil()
Serial.findUntil()從串行緩沖區讀取數據,直到找到一個給定的長度或字符串終止位。
如果目標字符串被發現,該函數返回true,如果超時則返回false。
Serial.findUntil()繼承了Stream類。
Serial.findUntil(target, terminal)
target : 要搜索的字符串(char) terminal : 在搜索中的字符串終止位 (char)
flush()
等待超出的串行數據完成傳輸。(在1.0及以上的版本中,flush()語句的功能不再是丟棄所有進入緩存器的串行數據。)
flush()繼承了Stream類
Serial.flush()
僅 Arduino Mega 可以使用的語法:
Serial1.flush()
Serial2.flush()
Serial3.flush()
parseFloat()
查找傳入的串行數據流中的下一個有效的浮點數。 parseFloat()繼承了Stream類
Serial.parseFloat()
僅適用于Arduino Mega:
Serial1.parseFloat()
Serial2.parseFloat()
Serial3.parseFloat()
parseInt()
查找傳入的串行數據流中的下一個有效的整數。 parseInt()繼承了Stream類
Serial.parseInt()
僅適用于Arduino Mega:
Serial1.parseInt()
Serial2.parseInt()
Serial3.parseInt()
peek()
返回傳入的串行數據的下一個字節(字符),而不是進入內部串行緩沖器調取。也就是說,連續調用 peek()將返回相同的字符,與調用read()方法相同。peek()繼承自 Stream類
Serial.peek()
僅適用于Arduino Mega :
Serial1.peek()
Serial2.peek()
Serial3.peek()
print()
以人們可讀的ASCII文本形式打印數據到串口輸出。此命令可以采取多種形式。每個數字的打印輸出使用的是ASCII字符。浮點型同樣打印輸出的是ASCII字符,保留到小數點后兩位。Bytes型則打印輸出單個字符。字符和字符串原樣打印輸出。Serial.print()打印輸出數據不換行,Serial.println()打印輸出數據自動換行處理。例如
Serial.print(78)輸出為“78”
Serial.print(1.23456)輸出為“1.23”
Serial.print(“N”)輸出為“N”
Serial.print(“Hello world.”)輸出為“Hello world.”
也可以自己定義輸出為幾進制(格式);可以是BIN(二進制,或以2為基數),OCT(八進制,或以8為基數),DEC(十進制,或以10為基數),HEX(十六進制,或以16為基數)。對于浮點型數字,可以指定輸出的小數數位。例如
Serial.print(78,BIN)輸出為“1001110”
Serial.print(78,OCT)輸出為“116”
Serial.print(78,DEC)輸出為“78”
Serial.print(78,HEX)輸出為“4E”
Serial.println(1.23456,0)輸出為“1”
Serial.println(1.23456,2)輸出為“1.23”
Serial.println(1.23456,4)輸出為“1.2346”
你可以通過基于閃存的字符串來進行打印輸出,將數據放入F()中,再放入Serial.print()。例如 Serial.print(F(“Hello world”)) 若要發送一個字節,則使用 Serial.write()
Serial.print(val)
Serial.print(val,格式)
val:打印輸出的值 - 任何數據類型
格式:指定進制(整數數據類型)或小數位數(浮點類型)
例子:
int x =0; // 定義一個變量并賦值
voidsetup() {
Serial.begin(9600); // 打開串口傳輸,并設置波特率為9600
}
voidloop() {
//打印標簽
Serial.print("NO FORMAT"); // 打印一個標簽
Serial.print("\t"); // 打印一個轉義字符
Serial.print("DEC");
Serial.print("\t");
Serial.print("HEX");
Serial.print("\t");
Serial.print("OCT");
Serial.print("\t");
Serial.print("BIN");
Serial.print("\t");
for(x=0; x< 64; x++){ // 打印ASCII碼表的一部分, 修改它的格式得到需要的內容
//打印多種格式:
Serial.print(x); // 以十進制格式將x打印輸出 - 與 "DEC"相同
Serial.print("\t"); // 橫向跳格
Serial.print(x, DEC); // 以十進制格式將x打印輸出
Serial.print("\t"); // 橫向跳格
Serial.print(x, HEX); // 以十六進制格式打印輸出
Serial.print("\t"); // 橫向跳格
Serial.print(x, OCT); // 以八進制格式打印輸出
Serial.print("\t"); // 橫向跳格
Serial.println(x, BIN); // 以二進制格式打印輸出
// 然后用 "println"打印一個回車
delay(200); // 延時200ms
}
Serial.println(""); // 打印一個空字符,并自動換行
}
println()
打印數據到串行端口,輸出人們可識別的ASCII碼文本并回車 (ASCII 13, 或 '\r') 及換行(ASCII 10, 或 '\n')。此命令采用的形式與Serial.print ()相同
Serial.println(val)
Serial.println(val, format)
val: 打印的內容 - 任何數據類型都可以
format: 指定基數(整數數據類型)或小數位數(浮點類型)
例子:
intanalogValue = 0; // 定義一個變量來保存模擬值
voidsetup() {
//設置串口波特率為9600 bps:
Serial.begin(9600);
}
voidloop() {
//讀取引腳0的模擬輸入:
analogValue = analogRead(0);
//打印g各種格式:
Serial.println(analogValue); //打印ASCII編碼的十進制
Serial.println(analogValue, DEC); //打印ASCII編碼的十進制
Serial.println(analogValue, HEX); //打印ASCII編碼的十六進制
Serial.println(analogValue, OCT); //打印ASCII編碼的八進制
Serial.println(analogValue,BIN); //打印一個ASCII編碼的二進制
// 延時10毫秒:
delay(10);
}
read()
讀取傳入的串口的數據。read() 繼承自 Stream 類
serial.read()
ArduinoMega獨有:
erial1.read()
serial2.read()
serial3.read()
例子:
intincomingByte = 0; // 傳入的串行數據
voidsetup() {
Serial.begin(9600); // 打開串口,設置數據傳輸速率9600
}
voidloop() {
// 當你接收數據時發送數據
if (Serial.available() > 0) {
// 讀取傳入的數據:
incomingByte = Serial.read();
//打印你得到的:
Serial.print("I received: ");
Serial.println(incomingByte, DEC);
}
}
readBytes()
Serial.readBytes()從串口讀字符到一個緩沖區。如果預設的長度讀取完畢或者時間到了 (參見 Serial.setTimeout()),函數將終止.
Serial.readBytes()返回放置在緩沖區的字符數。返回0意味著沒有發現有效的數據。
Serial.readBytes()繼承自 Stream 類
Serial.readBytes(buffer, length)
buffer:用來存儲字節(char[]或byte[])的緩沖區
length:讀取的字節數(int)
readBytesUntil()
Serial.readBytesUntil()將字符從串行緩沖區讀取到一個數組。如果檢測到終止字符,或預設的讀取長度讀取完畢,或者時間到了 (參見 Serial.setTimeout())函數將終止。
Serial.readBytesUntil()返回讀入數組的字符數。返回0意味著沒有發現有效的數據。
Serial.readBytesUntil()繼承自 Stream類
Serial.readBytesUntil(character, buffer, length)
character :要搜索的字符(char)
buffer :緩沖區來存儲字節(char[]或byte[])
length:讀的字節數(int)
setTimeout()
Serial.setTimeout()設置使用Serial.readBytesUntil() 或Serial.readBytes()時等待串口數據的最大毫秒值. 默認為1000毫秒。
Serial.setTimeout()繼承自Stream 類
Serial.setTimeout(time)
time :以毫秒為單位的超時時間(long)
write()
寫入二級制數據到串口。發送的數據以一個字節或者一系列的字節為單位。如果寫入的數字為字符,需使用print()命令進行代替
Serial.write(val)
Serial.write(str)
Serial.write(buf, len)
ArduinoMega還支持:Serial1,Serial2,Serial3 (替代Serial)
val: 以單個字節形式發的值
str: 以一串字節的形式發送的字符串
buf: 以一串字節的形式發送的數組
len: 數組的長度
返回結果:
byte
write() 將返回寫入的字節數,但是否使用這個數字是可選的
SerialEvent()
Stream
USB(僅適用于 Leonardo 和 Due)
鍵盤
鼠標
|