1、串口设置
arduino串口通信
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
示例
[cpp] view plain copy
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
返回
返回缓冲区可读字节数目
示例
[cpp] view plain copy
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,整数类型。
示例
[cpp] view plain copy
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型
示例
[cpp] view plain copy
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表示没有有效数据。
示例
[cpp] view plain copy
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’;
}
}
实验结果
从串口缓存读取指定长度为3的字节。
serial.readbytesuntil(character,buffer,length);
说明
从串口缓存读取指定长度的字符到数组buffer,遇到终止字符character后停止。
语法
serial.readbytesuntil(character ,buffer,length);
参数
character : 查找的字符 (char)
buffer: 存储读取数据的缓存(char[] 或byte[])
length:设定的读取长度
返回
返回存入缓存的字符数,0表示没有有效数据。
示例
[cpp] view plain copy
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
返回
返回从串口缓存区中读取的一个字符串。
示例
[cpp] view plain copy
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型)
返回
从串口缓存区中读取的整个字符串,直至检测到终止字符。
示例
[cpp] view plain copy
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
返回
返回串口缓存区第一个有效的浮点型数据,数字将被跳过。
示例
[cpp] view plain copy
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用于在搜索中跳过指定字符(此用法未知)
返回
返回下一个有效整型值。
示例
[cpp] view plain copy
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型)
返回
找到目标字符串返回真,否则为假
示例
[cpp] view plain copy
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,返回真,否则返回假。
示例
[cpp] view plain copy
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的长度
返回
字节长度
示例
[cpp] view plain copy
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.
}
南湖区领导莅临赛思总部考察指导工作
利雅得开春大戏剧情剖析
伯克利大学教授说:相对于传统的加密货币,比特币“极不稳定”
iic china展IMS分析师解读今年LED市场机会与挑战
VR全景技术将助力打造虚拟现实智慧城市
arduino串口通信
8位与32位MCU如何选择?
教您怎么选型固态电解电容器
德赛西威2022年合作伙伴大会成功举办
【免费试用】免开发快速接入,机智云转接板ML302-GC211试用开始啦!
在DS1863/DS1865上使用内部校准和右移增强ADC性能
紫光展锐12纳米5G基带芯片实现量产,达到国际先进水平
美国机器人计划大揭密 拟进军普通家庭
Qorvo®发布全新功率倍增器,扩展其DOCSIS 3.1 CATV产品系列
纳米软件分享:射频MEMS芯片测试解决方案
防反接电路方案二极管串联
超级汽车电池充电技术,充电一分钟行驶500英里
华友钴业变废为宝,打造动力电池全生命周期价值链
基于IPSec VPN隧道技术的国密加密网关保障电力工控数据安全
欧洲2020年将用智能电表代替80%的电表从而进一步提高智能电网的能力