< >
Home » Arduino语法参考 » Arduino语法-串口通讯

Arduino语法-串口通讯

函数列表

  • begin()
  • available()
  • read()
  • flush()
  • print()
  • println()
  • write()
  • peak()
  • serialEvent()

begin()函数说明

void HardwareSerial::begin  (long speed) 

打开串口

参数:

speed 波特率 

available()函数说明

获取串口上可读取的数据的字节数。该数据是指已经到达并存储在接收缓存(共有64字节)中。available()继承自Stream实用类。

语法:

Serial.available()

Arduino Mega only:

Serial1.available() Serial2.available() Serial3.available()

参数:

返回值:

返回可读取的字节数 

示例:

int incomingByte = 0;   // for incoming serial data

void setup() {
        Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
}

void loop() {

        // send data only when you receive data:
        if (Serial.available() > 0) {
                // read the incoming byte:
                incomingByte = Serial.read();

                // say what you got:
                Serial.print("I received: ");
                Serial.println(incomingByte, DEC);
        }
}

Arduino Mega example:

void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);

}

void loop() {
  // read from port 0, send to port 1:
  if (Serial.available()) {
    int inByte = Serial.read();
    Serial1.print(inByte, BYTE);

  }
  // read from port 1, send to port 0:
  if (Serial1.available()) {
    int inByte = Serial1.read();
    Serial.print(inByte, BYTE);
  }
}

read()函数说明

读串口数据,read()继承自Stream实用类。 语法:

Serial.read()

Arduino Mega only:

Serial1.read() Serial2.read() Serial3.read()

参数:

返回值:
串口上第一个可读取的字节(如果没有可读取的数据则返回-1)- int型。

示例:

int incomingByte = 0;   // 用于存储从串口读到的数据

void setup() {
        Serial.begin(9600);     // 打开串吕,设置速率为9600 bps
}

void loop() {

        // 只在收到数据时发送数据
        if (Serial.available() > 0) {
                // 读取传入的字节
                incomingByte = Serial.read();

                // 指示你收到的数据
                Serial.print("I received: ");
                Serial.println(incomingByte, DEC);
        }
}

flush()函数说明

刷新串口数据

print()函数说明

往串口发数据,无换行 描述
以人类可读的ASCII码形式向串口发送数据,该函数有多种格式。整数的每一数位将以ASCII码形式发送。浮点数同样以ASCII码形式发送,默认保留小数点后两位。字节型数据将以单个字符形式发送。字符和字符串会以其相应的形式发送。例如:

Serial.print(78) 发送 "78"
Serial.print(1.23456) 发送 "1.23"
Serial.print('N') 发送 "N"
Serial.print("Hello world.") 发送 "Hello world." 

可选的第二个参数用于指定数据的格式。允许的值为:BIN (binary二进制), OCT (octal八进制), DEC (decimal十进制), HEX (hexadecimal十六进制)。对于浮点数,该参数指定小数点的位数。例如:

Serial.print(78, BIN) gives "1001110"
Serial.print(78, OCT) gives "116"
Serial.print(78, DEC) gives "78"
Serial.print(78, HEX) gives "4E"
Serial.println(1.23456, 0) gives "1"
Serial.println(1.23456, 2) gives "1.23"
Serial.println(1.23456, 4) gives "1.2346" 

你可以用F()把待发送的字符串包装到flash存储器。例如:

Serial.print(F(“Hello World”)) 

要发送单个字节数据,请使用Serial.write()。

语法:

Serial.print(val)
Serial.print(val, format)

参数:

val: 要发送的数据(任何数据类型) 

format: 指定数字的基数(用于整型数)或者小数的位数(用于浮点数)。 

返回值:<>

size_t (long): print()返回发送的字节数(可丢弃该返回值)。 

示例:

/*
Uses a FOR loop for data and prints a number in various formats.
*/
int x = 0;    // variable

void setup() {
  Serial.begin(9600);      // open the serial port at 9600 bps:    
}

void loop() {  
  // print labels
  Serial.print("NO FORMAT");       // prints a label
  Serial.print("\t");              // prints a tab

  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++){    // only part of the ASCII chart, change to suit

    // print it out in many formats:
    Serial.print(x);       // print as an ASCII-encoded decimal - same as "DEC"
    Serial.print("\t");    // prints a tab

    Serial.print(x, DEC);  // print as an ASCII-encoded decimal
    Serial.print("\t");    // prints a tab

    Serial.print(x, HEX);  // print as an ASCII-encoded hexadecimal
    Serial.print("\t");    // prints a tab

    Serial.print(x, OCT);  // print as an ASCII-encoded octal
    Serial.print("\t");    // prints a tab

    Serial.println(x, BIN);  // print as an ASCII-encoded binary
    //                             then adds the carriage return with "println"
    delay(200);            // delay 200 milliseconds
  }
  Serial.println("");      // prints another carriage return
}

编程技巧:

在版本1.0时,串口传输是异步的,Serial.print()会在数据发送完成前返回。


println()函数说明

往串口发数据,类似Serial.print(),但有换行

write()函数说明

写二进制数据到串口,数据是一个字节一个字节地发送的,若以字符形式发送数字请使用print()代替。

语法:

Serial.write(val)
Serial.write(str)
Serial.write(buf, len) 

Arduino Mega也支持:

Serial1, Serial2, Serial3(在Serial的位置)

参数:

val: 作为单个字节发送的数据 

str: 由一系列字节组成的字符串 

buf: 同一系列字节组成的数组 

len: 要发送的数组的长度 

返回:

byte 

write()会返回发送的字节数,所以读取该返回值是可选的。

示例:

void setup(){
  Serial.begin(9600);
}

void loop(){
  Serial.write(45); //以二进制形式发送数字45

   int bytesSent = Serial.write(“hello”); //发送字符串“hello” 并返回该字符串的长度。
}

peak()函数说明

描述:

返回收到的串口数据的下一个字节(字符),但是并不把该数据从串口数据缓存中清除。就是说,每次成功调用peak()将返回相同的字符。与read()一样,peak()继承自Stream实用类。 语法:

可参照Serail.read()


serialEvent()函数说明

描述:

当串口有数据到达时调用该函数(然后使用Serial.read()捕获该数据)。
注意:目前serialEvent()并不兼容于Esplora, Leonardo, 或 Micro。

语法:

void serialEvent(){
//statements
}

Arduino Mega only:

void serialEvent1(){
//statements
}

void serialEvent2(){
//statements
}

void serialEvent3(){
//statements
}

statements可以是任何有效的语句。

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: arduino语法, arduino串口通讯