Arduino - 串口操作函数与示例代码大全
来源:https://blog.csdn.net/iracer/article/details/50334041
Arduino - 串口操作函数与示例代码大全
本文总结了Arduino常用串口操作函数,函数说明部分来源于Arduino 官网串口使用指南,示例与实验部分为自编。本文是对Arduino串口操作函数的较全面总结,可作为工具贴查找使用。
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个停止位。
返回
None
示例
void setup() {
Serial.begin(9600); // opensserial port, sets data rate to 9600 bps
}
Serial.end();
说明
禁止串口传输函数。此时串口传输的pin脚可以作为数字IO脚使用。
语法
Serial.end()
参数
None
返回
None
2.清空串口缓存
Serial.flush();
说明
1.0版本之前为清空串口缓存,现在该函数作用为等待输出数据传送完毕。如果要清空串口缓存的话,可以使用:while(Serial.read() >= 0)来代替。
语法
Serial.flush ()
参数
None
返回
None
while(Serial.read()>= 0){}
说明
因Serial.read()函数读取串口缓存中的一个字符,并删除已读字符。因此可以用这句代码来清空串口缓存。实验代码详见下文代码。
语法
while(Serial.read() >=0){}
参数
None
返回
None
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();
说明
写入字符串数据,并换行。实验代码详见下文。
语法
Serial.println(val) Serial.println(val,format)
参数
val: 打印的值,任意数据类型 format: 输出的数据格式,包括整数类型和浮点型数据的小数点位数。
返回
字节
Serial.SerialEvent();
串口数据准备好时触发的事件函数,即串口数据准备好调用该函数。
语法
Serial.serialEvent{//statements}
参数
statements: 任何有效的语句。
4.读串口缓存区数据
Serial.available();
说明
判断串口缓冲器的状态函数,用以判断数据是否送达串口。注意使用时通常用delay(100)以保证串口字符接收完毕,即保证Serial.available()返回的是缓冲区准确的可读字节数。
语法
Serial.available();
参数
None
返回
返回缓冲区可读字节数目
示例
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){} //清空串口缓存
}
实验结果
Serial.read();
说明
读取串口数据,一次读一个字符,读完后删除已读数据。
语法
Serial.read();
参数
None
返回
返回串口缓存中第一个可读字节,当没有可读数据时返回-1,整数类型。
示例
char comchar;
void setup() {
Serial.begin(9600);
while(Serial.read()>= 0){}/ /clear serialbuffer
}
void loop() {
// read data from serial port
while(Serial.available()>0){
comchar = Serial.read();//读串口第一个字节
Serial.print("Serial.read: ");
Serial.println(comchar);
delay(100);
}
}
实验结果
从实验结果可以看出:Serial.read()每次从串口缓存中读取第一个字符,并将读过的字符删除。
Serial.peek();
说明
读串口缓存中下一字节的数据(字符型),但不从内部缓存中删除该数据。也就是说,连续的调用peek()将返回同一个字符。而调用read()则会返回下一个字符。
语法
Serial.peek();
参数
None
返回
返回串口缓存中下一字节(字符)的数据,如果没有返回-1,整数int型
示例
char comchar;
void setup() {
Serial.begin(9600);
while(Serial.read()>= 0){}//clear serialbuffer
}
void loop() {
// read data from serial port
while(Serial.available()>0){
comchar = Serial.peek();
Serial.print("Serial.peek: ");
Serial.println(comchar);
delay(100);
}
}
实验结果
从实验结果可以看出:Serial.peek()每次从串口缓存中读取一个字符,并不会将读过的字符删除。第二次读取时仍然为同一个字符。
Serial.readBytes(buffer,length);
说明
从串口读取指定长度length的字符到缓存数组buffer。
语法
Serial.readBytes(buffer,length);
参数
buffer: 缓存变量
length:设定的读取长度
返回
返回存入缓存的字符数,0表示没有有效数据。
示例
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);
}
// clear serial buffer
while(Serial.read() >= 0){}
for(int i=0; i<18; i++){
buffer[i]='\0';
}
}
实验结果
Serial.readBytesUntil(character,buffer,length);
说明
从串口缓存读取指定长度的字符到数组buffer,遇到终止字符character后停止。
语法
Serial.readBytesUntil(character ,buffer,length);
参数
character : 查找的字符 (char)
buffer: 存储读取数据的缓存(char[] 或byte[])
length:设定的读取长度
返回
返回存入缓存的字符数,0表示没有有效数据。
示例
char buffer[18];
char character = ','; //终止字符
int numdata=0;
void setup() {
Serial.begin(9600);
while(Serial.read()>= 0){}//clear serialport
}
void loop() {
// read data from serial port
if(Serial.available()>0){
delay(100);
numdata =Serial.readBytesUntil(character,buffer,3);
Serial.print("Serial.readBytes:");
Serial.println(buffer);
}
// clear serial buffer
while(Serial.read() >= 0){}
for(int i=0; i<18; i++){
buffer[i]='\0';
}
}
实验结果
从串口缓存中读取3个字符,当遇到","时终止读取。
Serial.readString();
说明
从串口缓存区读取全部数据到一个字符串型变量。
语法
Serial.readString();
参数
None
返回
返回从串口缓存区中读取的一个字符串。
示例
String comdata = "";
void setup() {
Serial.begin(9600);
while(Serial.read()>= 0){} //clear serialbuffer
}
void loop() {
// read data from serial port
if(Serial.available()>0){
delay(100);
comdata = Serial.readString();
Serial.print("Serial.readString:");
Serial.println(comdata);
}
comdata = "";
}
实验结果
从实验结果可以看出:Serial.readString()从串口缓存中读取字符至字符串。
Serial.readStringUntil();
说明
从串口缓存区读取字符到一个字符串型变量,直至读完或遇到某终止字符。
语法
Serial.readStringUntil(terminator)
参数
terminator:终止字符(cha型)
返回
从串口缓存区中读取的整个字符串,直至检测到终止字符。
示例
String comdata = "";
char terminator = ',';
void setup() {
Serial.begin(9600);
while(Serial.read()>= 0){} //clear serialbuffer
}
void loop() {
// read data from serial port
if(Serial.available()>0){
delay(100);
comdata =Serial.readStringUntil(terminator);
Serial.print("Serial.readStringUntil: ");
Serial.println(comdata);
}
while(Serial.read()>= 0){}
}
实验结果
从串口读取所有字符存放于字符串comdata,直至遇到字符","时终止读取。
Serial.parseFloat();
说明
读串口缓存区第一个有效的浮点型数据,数字将被跳过。当读到第一个非浮点数时函数结束。
语法
Serial.parseFloat()
参数
None
返回
返回串口缓存区第一个有效的浮点型数据,数字将被跳过。
示例
float comfloat;
void setup() {
Serial.begin(9600);
while(Serial.read()>= 0){}//clear serialbuffer
}
void loop() {
// read data from serial port
if(Serial.available()>0){
delay(100);
comfloat = Serial.parseFloat();
Serial.print("Serial.parseFloat:");
Serial.println(comfloat);
}
// clear serial buffer
while(Serial.read() >= 0){}
}
实验结果
从实验结果可以看出:Serial. parseFloat()从串口缓存中读取第一个有效的浮点数,第一个有效数字之前的负号也将被读取,独立的负号将被舍弃。
Serial.parseInt()
说明
从串口接收数据流中读取第一个有效整数(包括负数)。
注意:
- 非数字的首字符或者负号将被跳过
- 当可配置的超时值没有读到有效字符时,或者读不到有效整数时,分析停止
- 如果超时且读不到有效整数时,返回0
语法
Serial.parseInt()
Serial.parseInt(charskipChar)
参数
skipChar用于在搜索中跳过指定字符(此用法未知)
返回
返回下一个有效整型值。
示例
int comInt;
voidsetup() {
Serial.begin(9600);
while(Serial.read()>= 0){}//clear serialbuffer
}
void loop() {
// read data from serial port
if(Serial.available()>0){
delay(100);
comInt = Serial.parseInt();
Serial.print("Serial.parseInt:");
Serial.println(comInt);
}
// clear serial buffer
while(Serial.read() >= 0){}
}
实验结果
从实验结果可以看出:Serial. parseInt()从串口缓存中读取第一个有效整数,第一个有效数字之前的负号也将被读取,独立的负号将被舍弃。
5.串口查找指定字符串
Serial.find()
说明
从串口缓存区读取数据,寻找目标字符串target(char型)
语法
char target[] = ”目标字符串”;
Serial.find(target);
参数
target: 目标字符串(char型)
返回
找到目标字符串返回真,否则为假
示例
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){}
}
实验结果
串口输入字符中只要有test,函数返回真,打印出目标字符串”test”,否则返回假,不打印任何值。
Serial.findUntil(target,terminal);
说明
从串口缓存区读取数据,寻找目标字符串target(char型数组),直到出现给定字符串terminal(char型),找到为真,否则为假。
语法
Serial.findUntil(target,terminal);
参数
target : 目标字符串(char型)
terminal : 结束搜索字符串(char型)
返回
如果在找到终止字符terminal之前找到目标字符target,返回真,否则返回假。
示例
char target[] ="test";
char terminal[] ="end";
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){}
}
实验结果
如果串口缓存中有目标字符”test”,返回真,但如果先遇到终止字符串”end”则函数立即终止,不论字符串后面有没有目标字符”test”。
6.向串口写数据
Serial.write();
说明
串口输出数据函数。写二进制数据到串口。
语法
Serial.write(val) Serial.write(str) Serial.write(buf, len)
参数
val: 字节 str: 一串字节 buf: 字节数组 len: buf的长度
返回
字节长度
示例
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.write(45); // send a byte with thevalue 45
int bytesSent = Serial.write(“hello”); //sendthe string “hello” and return the length of the string.
}
Arduino - 串口操作函数与示例代码大全的更多相关文章
- (转)详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
原文:https://www.jb51.net/article/138363.htm hasattr()函数 hasattr()函数用于判断是否包含对应的属性 语法: hasattr(object,n ...
- 1.NetDh框架之数据库操作层--Dapper简单封装,可支持多库实例、多种数据库类型等(附源码和示例代码)
1.NetDh框架开始的需求场景 需求场景: 1.之前公司有不同.net项目组,有的项目是用SqlServer做数据库,有的项目是用Oracle,后面也有可能会用到Mysql等,而且要考虑后续扩展成主 ...
- C语言文件操作函数大全(超详细)
C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下 fopen(打开文件)相关函数 open,fc ...
- 3.NetDh框架之缓存操作类和二次开发模式简单设计(附源码和示例代码)
前言 NetDh框架适用于C/S.B/S的服务端框架,可用于项目开发和学习.目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型.多库实例,简单强大: 此部分具体说明可参考博客: ...
- 2.NetDh框架之简单高效的日志操作类(附源码和示例代码)
前言 NetDh框架适用于C/S.B/S的服务端框架,可用于项目开发和学习.目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型.多库实例,简单强大: 此部分具体说明可参考博客: ...
- mysql常用字符串操作函数大全,以及实例
今天在论坛中看到一个关于mysql的问题,问题如下 good_id cat_id12654 665,56912655 601,4722 goods_id是商品i ...
- 在Eclipse中运行JAVA代码远程操作HBase的示例
在Eclipse中运行JAVA代码远程操作HBase的示例 分类: 大数据 2014-03-04 13:47 3762人阅读 评论(2) 收藏 举报 下面是一个在Windows的Eclipse中通过J ...
- php分页函数示例代码
分享一例php分页函数代码,用此函数实现分页代码很不错. 代码,php分页函数. <?php /* * Created on 2011-07-28 * Author : LKK , http:/ ...
- C#使用互斥量(Mutex)实现多进程并发操作时多进程间线程同步操作(进程同步)的简单示例代码及使用方法
本文主要是实现操作系统级别的多进程间线程同步(进程同步)的示例代码及测试结果.代码经过测试,可供参考,也可直接使用. 承接上一篇博客的业务场景[C#使用读写锁三行代码简单解决多线程并发写入文件时线程同 ...
随机推荐
- 没想到吧!关于Dubbo的『消费端线程池模型』官网也写错了。
这是why的第 63 篇原创文章 荒腔走板 大家好,我是 why,欢迎来到我连续周更优质原创文章的第 63 篇.老规矩,先荒腔走板聊聊其他的. 上面这张图片是我前几天整理相册的时候看到的.拍摄于 20 ...
- react-native 常用命令
创建项目 react-native init AwesomeProject //AwesomeProject是项目名 启动 Node.js web server react-native start ...
- jinja2快速实现自定义的robotframework的测试报告
一.背景 RF的结果报告可以方便我们查看每一条用例集.用例的执行结果统计,但是有的项目涉及到一些数据的比对,希望能够直观到看到数据,原生的测试报告就无法满足这个需求了. 原生的报告 项目需求报告格式 ...
- 剑指 Offer 55 - I. 二叉树的深度
题目描述 输入一棵二叉树的根节点,求该树的深度.从根节点到叶节点依次经过的节点(含根.叶节点)形成树的一条路径,最长路径的长度为树的深度. 例如: 给定二叉树 [3,9,20,null,null,15 ...
- Activiti7 组任务
需求:在流程定义中在任务节点的assignee固定设置任务负责人,这种情况不是很好,如果有天任务负责人请假了,你想请假,等着吧..没人审批,针对这种情况,可以给任务设置多个候选人,可以从候选中选择参与 ...
- Redis6.0.6集群服务搭建
实现目标 一台主机上搭建3主3从高可用redis集群 环境 Linux :CentOS7 Redis : 6.0.6 准备工作 1.查看是否有安装wget命令,如果没有安装使用yum命令安装wgt命令 ...
- Kubernetes-5:搭建企业级私有仓库Harbor
搭建企业级私有仓库Harbor 安装需求 python版本 >= 2.7 Docker引擎版本 >= 1.10 docker-compose版本 >= 1.6.0 安装环境 一.Py ...
- 阿里出品Excel工具EasyExcel使用小结
前提 笔者做小数据和零号提数工具人已经有一段时间,服务的对象是运营和商务的大佬,一般要求导出的数据是Excel文件,考虑到初创团队机器资源十分有限的前提下,选用了阿里出品的Excel工具EasyExc ...
- Linux系统安装01-centos7系统安装
2020注定是一个不平凡的年份,对于各行各业都是不小的波动.话说回来,从当前的互联网趋势来看,linux的使用以后会越来越广泛,既然之前不懂linux,那么我们就从头开始,先学习Linux的系统安装. ...
- First-blog:解决mybatis 用mysql进行模糊搜索时,查不了中文问题
如图:点击小字 按搜索时,出现乱码搜索不了 解决办法:出现乱码问题,一般无非两种 1.是数据库问题 2.是服务器问题 我在MySQL命令行搜索时,中文可以实现,说明时服务器问题 通过修改 tomcat ...