串口硬件

Arduino板通过串口(称为UART或USART串口)与其它设备进行通讯。即通用同步/异步收发器
所有Arduino板至少有一个串口,数字引脚位为 0(RX) 和1(TX)注:做通讯时0,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

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个停止位。
  • 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按回车后

  • 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 portif(Serial.available()>0){delay(100);numdata = Serial.readBytes(buffer,3);Serial.print("Serial.readBytes:");Serial.println(buffer);    }
}

当输入:123456789

  • 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 portif(Serial.available()>0){delay(100);if( Serial.find(target)){Serial.print("find traget:");Serial.println(target);       }}// clear serial bufferwhile(Serial.read() >= 0){}
}

  • 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 portif(Serial.available()>0){delay(100);if( Serial.findUntil(target,terminal)){Serial.print("find traget:");Serial.println(target);}}// clear serial bufferwhile(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串口通讯,Serial库,RGBled灯示例相关推荐

  1. Arduino 串口通讯参考笔记 - Serial 类库及相关函数介绍

    @TOArduino 串口通讯参考笔记 - Serial 类库及相关函数介绍 C 声明: 本ID发布的所有文章及随笔均为原创,可随意转载,单转载文章必须注明作者 saner686 及包含原文出处地址 ...

  2. mpu6050 arduino串口 通讯在ros下的可视化实验

    瞎忙好几天,草草做个总结,贴上混乱代码一堆 涉及内容如下 dmp iic  mpu6050的通讯 获取加速度 角速度 二者结合求出角姿势 四元数,发送到计算机. 串口协议编写解析 ros发布位姿里程数 ...

  3. 树莓派与Arduino串口通讯获取DH11温湿度

    本文记录了在树莓派开发时,通过串口获得Arduino开发板上采集到的温湿度,并显示在树莓派上,使用python读取Arduino串口的数据,获得温湿度采集器采集到的温湿度,然后在树莓派上做数据处理: ...

  4. LYL程序员小白的理解之简单易懂的Arduino的串口通讯

    简单易懂的Arduino的串口通讯 自白 启动串口通讯 判断串口接收数据的语句 实践 一个三位数整数 三个三位数整数 自白 我是一名大四应届生,第一次写这个博客,可能很多地方写的不是那么好,也有可能有 ...

  5. STM32的USART串口通讯程序

    文章目录 一.STM32 USART串口通信 1.串口通信简介 1.1.物理层 1.2.协议层 2.STM32 的 USART 简介 二.STM32的USART串口通讯程序 1.创建项目 2.添加.s ...

  6. STM32—串口通讯详解

    串口通讯目录 物理层 协议层 USART简介 开发板与上位机的连接 代码讲解: 一.初始化结构体 二.NVIC配置中断优先级 三.USART配置函数讲解 四.传输数据的函数: 1.发送一个字节 2.发 ...

  7. 【STM32学习笔记】(9)——串口通讯(USART)详解

    本文主要参考了野火的零死角玩转STM32和正点原子的STM32F1 开发指南 V1.1(精英板-库函数版本),文章中大部分知识都是从两本书中提取出来,串口通信协议的知识主要参考野火的书籍,而串口实验部 ...

  8. 第十九节 串口通讯与终端设备

    本章主要讲解串口和终端设备的基本使用,并且通过这个过程解构如何使用ioctl 系统调用向设备文件写入特别的命令,控制硬件.我们需要熟悉ioctl 的使用,是因为在后面编写驱动时,某些硬件需要向内核提供 ...

  9. 串口通讯 IM1281

    例程为基于IM1281单向互感计量模块,关于 Modbus-RTU通讯规约简要理解. 1.通讯规约应注意校检码正确配置,否则所发送数据 无法被外设接收: (1) 预置一个 16 位寄存器为 0FFFF ...

最新文章

  1. Java项目:校园外卖点餐系统(java+SSM+JSP+maven+mysql)
  2. 手动新增swap分区
  3. python素材库_python的JSON库
  4. 洛谷——P1023 税收与补贴问题
  5. 用XenoCode 2006 加密dll(.NET
  6. CentOS安装nginx方法命令教程
  7. c/c++教程 - 2.4.2.6 初始化列表语法,初始化列表参数
  8. Markdown中如何加入上标、下标?
  9. Linux之父新年首次“炮轰”:英特尔在扼杀整个 ECC 行业
  10. MySQL 基础 —— 数据类型、各种变量
  11. 门诊管理系统开发能提高医生的诊疗水平和质量吗
  12. 怎么锻炼java逻辑思维_托马斯逻辑训练板技高一筹,锻炼编程逻辑思维能力
  13. java程序员 thinkpad_JAVA程序员笔记本电脑推荐?
  14. STM32RBT6+RC522读取CPU卡demo
  15. 解读《道德经》nbsp;五十六章nbsp;知者不言…
  16. 一种简单的仓储系统实物可视化分布实现方案
  17. CNC加工中心操机全过程,学数控必备
  18. iOS -- 友盟工具进行Crash分析/dsym文件
  19. 【2022---计算机考研】数据结构之基础算法背诵版
  20. 教你们1秒钟复制百度文库中所有内容

热门文章

  1. 机器学习十大算法之-CART分类决策树、回归树和模型树
  2. 【生活类】帝都美食与旅行
  3. muduo学习笔记:net部分之实现TCP网络编程库-Acceptor
  4. Linux虚拟机配置
  5. 飞腾CPU体系结构之系统指令
  6. 宋祖儿和张新成配音《疯狂元素城》,皮克斯动画新作将于6月16日登陆中国内地...
  7. node环境部署配置超详细
  8. openfire ping的smack解决方案(维持在线状态)
  9. vscode代码行数显示与关闭
  10. json 大括号 综括号_json必须用大括号么