Arduino-串口函数Serial
串口是Arduino与其它设备进行通信的接口,我们需要很好的掌握它的使用。Arduino串口使用相关的函数共有10个(随着版本的升级,新版本加入了更多,具体请参见官网:http://www.arduino.cc/)。
Serial.begin(); //开启串行通信接口并设置通信波特率
Serial.end(); //关闭通信串口
Serial.available();//判断串口缓冲器是否有数据装入
Serial.read(); //读取串口数据
Serial.peek(); //返回下一字节(字符)输入数据,但不删除它
Serial.flush(); //清空串口缓存
Serial.print(); //写入字符串数据到串口
Serial.println(); //写入字符串数据+换行到串口
Serial.write(); //写入二进制数据到串口
Serial.SerialEvent();//read时触发的事件函数
Serial.readBytes(buffer,length);//读取固定长度的二进制流
Serial.println(incomingByte, DEC);//打印接到数据十进制表示的ascii码。 HEX 十六进制表示
peek():功能类似于read(),但是我们知道当调用一次read()后,缓冲区的数据流会被读取并删除read过的数据,也就是available值会减少,但peek()不会出现类似情况,其功能类似于检测缓冲区的头部数据,反复调用peek()返回的值是一样的。用得好的话可以精简很多代码。
write():写入二进制数据到串行端口。这个数据是作为一个字节或字节序列发送的。如果发送字符串则需要用到print方法。
最后注意一下:当烧程序入板卡的时候,在完成前即L、TX、RX灯闪烁前,断开数据线很可能损坏硬件。同时测试前养成按一次reset键复位的习惯,这里特别注意,在打开串口监视器后,需要reset一次,否则无法看到效果。
还有一个问题:
一般将字符通过串口打印到电脑(用USB串口)已经够用了,但是当你想把把字符发送到另一个串口的时候,或是想用一块你手头上已有的开发板发送数据给Arduino,然后让Arduino显示,问题顿时变得麻烦起来!
如何从一个单片机的串口发送数据到Arduino上,然后用Arduino显示呢?
这就要从Arduino的串口收发函数说起了.
(以下实例基于Arduino UNO)
1,接收函数Serial.read()
int Serial.read(void)
如果串行数据缓冲区有数据,这个函数会读取串行数据缓冲区的第一个字节,数据读取位置移动到下一个数据缓冲区,也就是说如果继续读取的话会读取下一个数据缓冲区的第一个字节.
如果数据缓冲区没有数据,将返回-1.
2,发送函数Serial.print()
Serial.print(val)
Serial.print(val, format)
Serial.print(val)
首先注意: print是一个打印函数,主要用于在上位机上显示,让数据可视化,它会将数据用字符的形式(ASCII码)逐个发送到串口. 一般不用这个函数来进行数据传输.
比如下面这段代码不会在串口助手上显示3个256,而会分别显示'2','5','6'的ASCII码值,50,53,54(分三次发送,有三个地址不同的数据缓冲区)
void setup() {
// initialize serial ports:
Serial.begin();
Serial1.begin();
Serial3.begin();
Serial3.print();
if (Serial1.available()>) {
Serial.println(Serial1.read());
Serial.println(Serial1.read());
Serial.println(Serial1.read());
}
}
void loop() {
}
既然print是一个打印函数,那么自然,参数val的类型是任意的.
Serial.print(val, format)
将val的值转换成format指定的形式发送,可为BIN,OCT,HEX,DEC.
3,发送函数Serial.write
Serial.write(str)
str为字符串的首地址,buf为一个用来存放数据的数组的首地址. 这个函数会先发送字符串,然后返回字符串的长度.
void setup(){
Serial.begin();
}
void loop(){
Serial.write(); // send a byte with the value 45
int bytesSent = Serial.write("hello");
Serial.println(bytesSent);
}
Serial.write(val)
val的数据类型为unsigned char,这个函数每次只发送一个字节的数据,所以val的值在0-255之间.
Serial.write(buf, len)
buf为要发送的数组的首地址(注意数组的类型为unsigned char),len为数组的长度.
void setup(){
Serial.begin();
Serial3.begin();
Serial1.begin();
}
void loop(){
unsigned char data[] ={,};
Serial3.write(data,);
if(Serial1.available()>)
Serial.println(Serial1.read());
Serial.println(Serial1.read());
}
回到开头的问题,如何从一个单片机的串口发送数据到Arduino上,然后用Arduino显示呢?
我们可以先用单片机的print函数把数据打印到串口,然后用Serial1.readBytes(Serial的加强版,具体看官方参考手册)把数据从串口读取回来(以ASCII码的形式),然后把ASCII码转换成字符,然后发送.
unsigned int send_data =;
char rx_data[];
void setup(){
Serial.begin();
Serial3.begin();
Serial1.begin();
} void loop()
{
Serial3.print( send_data);
if(Serial1.available()>)
{
Serial1.readBytes(rx_data,);
for(char i=;i<;i++)
{
Serial.print(char(rx_data));
}
Serial.print("\n");
}
delay();
}
Arduino-串口函数Serial的更多相关文章
- Eclipse编译Arduino程序不能使用串口函数Serial.begin解决办法
在Arduino官方的编译器当中Serial.begin(9600);初始化语句是可以直接使用的,而到Eclipse当中,同样的语句却不能用了.会出现下面的问题: 显然,这是Eclipse没有找到Se ...
- Arduino 串口通讯参考笔记 - Serial 类库及相关函数介绍
声明: 本ID发布的所有文章及随笔均为原创,可随意转载,单转载文章必须注明作者 aiyauto 及包含原文出处地址 http://www.cnblogs.com/aiyauto/p/7071712.h ...
- 进阶之路(基础篇) - 019 Serial串口函数说明
本文总结了Arduino常用串口操作函数,函数说明部分来源于Arduino 官网串口使用指南,示例与实验部分为自编.本文是对Arduino串口操作函数的较全面总结,可作为工具贴查找使用. 函数:if( ...
- Arduino - 串口操作函数与示例代码大全
来源:https://blog.csdn.net/iracer/article/details/50334041 Arduino - 串口操作函数与示例代码大全 本文总结了Arduino常用串口操作函 ...
- Arduino 串口篇 Arduino发送十六进制 send HEX via serial port RS232-to-USB to PC
发送十六进制比较直观,可以在上位机中直接获取十六进制的数据,然后在在上位机上将十六进制HEX转换成BIN(二进制)或者DEC(十进制)就十分简单有效了. 下面是在Arduino上怎么演示直接发送16进 ...
- ESP-8266 串口通信(Serial)
ESP8266的串口通信与传统的Arduino设备完全一样.除了硬件FIFO(128字节用于TX和RX)之外,硬件串口还有额外的 256字节的TX和RX缓存.发送和接收全都由中断驱动.当FIFO/缓存 ...
- Arduino 串口篇 Arduino发送二进制 send binary via RS232-to-USB to PC
有用的链接在这里:http://hi.baidu.com/mizuda/item/06b7fdc1d0e45a0ec710b2dd 更加详细的内容请查阅Arduino官方:http://arduino ...
- win10上使用php与python实现与arduino串口通信
注意: php 需要php7,安装及开启php_dio.dll com口按照实际的进行设置,如果不知道可以打开arduino编辑器进行查看 可以与用户实现命令行交互,但是效率过慢,不清楚如何优化,使用 ...
- Arduino串口的一些高级用法
1.配置串口通信数据位.校验位.停止位通常我们使用Serial.begin(speed)来完成串口的初始化,这种方式,只能配置串口的波特率.而使用Serial.begin(speed, config) ...
随机推荐
- POJ3469Dual Core CPU
题意:给你n个模块,每个模块在A核花费为ai,在B核跑花费为bi,然后由m个任务(ai,bi,wi),表示如果ai,bi不在同一个核上跑,额外的花费为wi,求最小的花费. 分析: 用最小的费用将对象划 ...
- echarts图调用多个接口
html: <div id="sentimentMain1" style="width:960px;height:500px;margin:20px auto;&q ...
- Python 初识爬虫-**机场出港业务
# -*- coding:utf-8 -*- from lxml import etree import requests ##先进单页测试,然后在进行多页循环 没有解决的问题,动态解决最大页数,目前 ...
- HttpClient,Socket,URL知识
java中: tip/ip , udp 传输协议 网络编程有三大类:Socket,URL,datagram HTTP协议是建立在TCP协议之上的一种应用. 一:HttpClient HttpCli ...
- mysql 示例数据库安装
示例数据库不和bin安装文件在一块, 安装数据库没有这个选项 https://dev.mysql.com/doc/index-other.html
- c#之GDI简单实现代码及其实例
作业:文档形式 3到5页理解 1.理解 2.源代码解释(1到2页) 3.实现效果 项目地址: https://github.com/zhiyishou/polyer Demo:https://zhiy ...
- svn被锁 The project was not built due to "org.apache.subversion.javahl.ClientException: Attempted to lock an already-locked dir
解决办法 : 右键该项目 ,---->Team---->选"Team"-->"Refresh/Cleanup",并确认"Ref ...
- 深入学习webpack(三)
在前面两篇博客中,主要讲了webpack的使用和webpack的核心概念,他们都是非常重要的,在这篇博客中,讲主要讨论webpack配置相关问题. 参考文章:https://webpack.js.or ...
- empty,isset,is_null比较(差异与异同)
做php开发时候,想必在使用:empty,isset,is_null 这几个函数时候,遇到一些问题.甚至给自己的程序带来一些安全隐患的bug.很多时候,对于isset,empty都认为差不多.因此开 ...
- Scroller类的使用总结
Scroll类之所以不好理解是因为没有搞清楚View的绘制流程. 1)简单来讲 viewgroup重绘时依次会调用 dispatchDraw -- drawChild --child.compute ...