Arduino串口通讯,Serial库,RGBled灯示例

串口硬件

Arduino板通过串口(称为UART或USART串口)与其它设备进行通讯。即通用同步/异步收发器
所有Arduino板至少有一个串口,数字引脚位为 0(RX) 和1(TX)注:做通讯时0,1引脚不能做他用。
Arduino串口通讯,Serial库,RGBled灯示例_第1张图片
Arduino Mega 有三个额外的 TTL串口如下:
Serial1:19(Rx) 和 18(Tx)
Serial2:17(Rx) 和 16(Tx)
Serial3:15(Rx) 和 14(Tx)
Arduino Due 有三个额外的3.3V TTL串口,额外串口引脚排布和 Arduino Mega 相同
Arduino Lenonardo 串口 Serial1直接通过 TTL 5V 通讯,占用引脚 0(Rx)和 1(Tx)

波特率与字节的关系如下图

Arduino串口通讯,Serial库,RGBled灯示例_第2张图片

常用arduino串口操作函数Serial

1、串口设置

  • Serial.begin();开启串口,通常置于setup()函数中。
    语法:
    Serial.begin(speed);
    Serial.begin(speed,config);
    参数:
    speed: 波特率,一般取值300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600,115200
    config: 设置数据位、校验位和停止位。例如 Serial.begin(speed,Serial_8N1); Serial_8N1中:8表示8个数据位,N表示没有校验,1表示有1个停止位。
    Arduino串口通讯,Serial库,RGBled灯示例_第3张图片
  • Serial.end();禁止串口传输函数。此时串口传输的pin脚可以作为数字IO脚使用
    语法:Serial.end()

2、清空串口缓存

  • Serial.flush(); 等待输出数据传送完毕。
    语法:Serial.flush()
  • Serial.read(); 调用该语句,读取串口缓存中的一个字符,并删除已读字符,每次都会返回一个字节的数据,这个返回值便是当前串口读取到的数据
    常用while(Serial.read()>= 0){}清空缓存。

3、输出串口数据

  • Serial.print(); 串口输出数据函数,写入字符串数据到串口
    语法:
    Serial.print(val)
    Serial.print(val,format)

       val: 打印的值,任意数据类型
       format: 输出的数据格式,包括整数类型和浮点型数据的小数点位数
    

    Serial.print(78, BIN) 得到 “1001110”
    Serial.print(78, OCT) 得到 “116”
    Serial.print(78, DEC) 得到 “78”
    Serial.print(78, HEX) 得到 “4E”
    Serial.print(1.23456, 0) 得到 “1”
    Serial.print(1.23456, 2) 得到 “1.23”
    Serial.print(1.23456, 4) 得到 “1.2346”
    Serial.print(‘N’) 得到 “N”
    Serial.print(“Hello world.”) 得到 “Hello world.”

  • Serial.println();用法与print类似并换行

  • Serial.SerialEvent(); 串口数据准备好时触发的事件函数,即串口数据准备好调用该函数

4、读串口缓存数据

  • Serial.available(); 判断串口缓冲器的状态函数,用以判断数据是否送达串口。注意使用时通常用delay(100)以保证串口字符接收完毕,即保证Serial.available()返回的是缓冲区准确的可读字节数。
    返回值:返回缓冲区可读字节数目
    程序示例
void setup() {
  Serial.begin(9600);
  while(Serial.read()>= 0){}//clear serialbuffer
}
 
void loop() {
   if (Serial.available() > 0) {
    delay(100); // 等待数据传完,如果没有将不能获取完整数据
    int numdata = Serial.available();
    Serial.print("Serial.available = :");
    Serial.println(numdata);
  }
  while(Serial.read()>=0){} //清空串口缓存
}

当输入123456按回车后
Arduino串口通讯,Serial库,RGBled灯示例_第4张图片

  • Serial.read(); 调用该语句,读取串口缓存中的一个字符,并删除已读字符,每次都会返回一个字节的数据,这个返回值便是当前串口读取到的数据
  • Serial.peek(); 读串口缓存中下一字节的数据(字符型),但不从内部缓存中删除该数据。也就是说,连续的调用peek()将返回同一个字符。而调用read()则会返回下一个字符。
    返回:
    返回串口缓存中下一字节(字符)的数据,如果没有返回-1,整数int型
  • Serial.readBytes(buffer,length); 从串口读取指定长度length的字符到缓存数组buffer。
    语法:Serial.readBytes(buffer,length);
    程序示例
char buffer[18];
int numdata=0;
void setup() {
  Serial.begin(9600);
  while(Serial.read()>= 0){}//clear serial port
}
 
void loop() {
  // read data from serial port
  if(Serial.available()>0){
      delay(100);
      numdata = Serial.readBytes(buffer,3);
      Serial.print("Serial.readBytes:");
      Serial.println(buffer);    
    }
}

当输入:123456789
Arduino串口通讯,Serial库,RGBled灯示例_第5张图片

  • Serial.readBytesUntil(character,buffer,length); 从串口缓存读取指定长度的字符到数组buffer,遇到终止字符character后停止。
  • Serial.readString(); 从串口缓存区读取全部数据到一个字符串型变量
  • Serial.readStringUntil();从串口缓存区读取字符到一个字符串型变量,直至读完或遇到某终止字符。
  • Serial.parseFloat();读串口缓存区第一个有效的浮点型数据,数字将被跳过。当读到第一个非浮点数时函数结束
  • Serial.parseInt(); 从串口接收数据流中读取第一个有效整数(包括负数)。
    注意:
    非数字的首字符或者负号将被跳过
    当可配置的超时值没有读到有效字符时,或者读不到有效整数时,分析停止
    如果超时且读不到有效整数时,返回0

5、串口查找指定字符串

  • Serial.find(); 从串口缓存区读取数据,寻找目标字符串target(char型)
    语法
    char target[] = ”目标字符串”;
    Serial.find(target);
char target[] ="test";
 
void setup() {
  Serial.begin(9600);
  while(Serial.read()>= 0){}//clear serialbuffer
}
 
void loop() {
  // read data from serial port
   if(Serial.available()>0){
      delay(100);
      if( Serial.find(target)){
         Serial.print("find traget:");
         Serial.println(target);       
        }
     }
    // clear serial buffer
    while(Serial.read() >= 0){}
}

Arduino串口通讯,Serial库,RGBled灯示例_第6张图片

  • Serial.findUntil(target,terminal); 从串口缓存区读取数据,寻找目标字符串target(char型数组),直到出现给定字符串terminal(char型),找到为真,否则为假。
char target[] ="haha";
char terminal[] ="9527";
 
void setup() {
  Serial.begin(9600);
  while(Serial.read()>= 0){}//clear serialbuffer
}
 
void loop() {
  // read data from serial port
   if(Serial.available()>0){
      delay(100);
      if( Serial.findUntil(target,terminal)){
         Serial.print("find traget:");
         Serial.println(target);
        }
     }
    // clear serial buffer
    while(Serial.read() >= 0){}
}

在这里插入图片描述在这里插入图片描述
由于9527在haha前,所以没有数据显示

6、向串口写数据

  • Serial.write(); 串口输出数据函数。写二进制数据到串口
    语法:
    Serial.write(val) ;val: 字节
    Serial.write(str) ;str: 一串字节
    Serial.write(buf, len); buf: 字节数组 ,len: buf的长度

RGB led灯示例

const int redp =3;//const关键字代表常量,用于修改变量的性质使其变为只读
const int greenp =5;
const int bluep = 6;
void setup()
{
  //开启串行通信接口并设置波特率
  Serial.begin(9600);
  pinMode(redp,OUTPUT);
  pinMode(greenp,OUTPUT);
  pinMode(bluep,OUTPUT);
  Serial.println("hello");
}
void loop()
{
  while(Serial.available()>0)
  {
    int red = Serial.parseInt();
    int green = Serial.parseInt();//声明局部变量获得串口数据,绿色亮度
    int blue = Serial.parseInt();
    if (Serial.read() == '\n')
    {//调整到区间,
      red = 255- constrain(red,0,255);将red限制在0-255之间
      green = 255- constrain(green,0,255);
      blue = 255- constrain(blue,0,255);
      analogWrite(redp,red);
      analogWrite(greenp,green);
      analogWrite(bluep,blue);
      Serial.println(red,HEX);
      Serial.println(green,HEX);
      Serial.println(blue,HEX);
    }
  }
  }

你可能感兴趣的:(arduino)