博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Arduino-串口函数Serial
阅读量:6094 次
发布时间:2019-06-20

本文共 3129 字,大约阅读时间需要 10 分钟。

 串口是Arduino与其它设备进行通信的接口,我们需要很好的掌握它的使用。Arduino串口使用相关的函数共有10个(随着版本的升级,新版本加入了更多,具体请参见官网:)。

  

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(9600);  Serial1.begin(9600);  Serial3.begin(9600);  Serial3.print(256);  if (Serial1.available()>0) {    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(9600);}void loop(){  Serial.write(45); // 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(9600);  Serial3.begin(9600);  Serial1.begin(9600);}void loop(){   unsigned char data[2] ={
11,0}; Serial3.write(data,2); if(Serial1.available()>0) Serial.println(Serial1.read()); Serial.println(Serial1.read());}

 

回到开头的问题,如何从一个单片机的串口发送数据到Arduino上,然后用Arduino显示呢?

我们可以先用单片机的print函数把数据打印到串口,然后用Serial1.readBytes(Serial的加强版,具体看官方参考手册)把数据从串口读取回来(以ASCII码的形式),然后把ASCII码转换成字符,然后发送.

unsigned int send_data =1234;char rx_data[4];void setup(){  Serial.begin(9600);  Serial3.begin(9600);  Serial1.begin(9600);}void loop(){   Serial3.print( send_data);   if(Serial1.available()>0)   {            Serial1.readBytes(rx_data,4);            for(char i=0;i<4;i++)            {                    Serial.print(char(rx_data));            }            Serial.print("\n");    }    delay(500);}

 

转载于:https://www.cnblogs.com/gaosheng-221/p/6641060.html

你可能感兴趣的文章
【原创】一文彻底搞懂安卓WebView白名单校验
查看>>
写给对前途迷茫的朋友:五句话定会改变你的人生
查看>>
并行程序设计学习心得1——并行计算机存储
查看>>
mysql练习题40道
查看>>
JAVA入门到精通-第86讲-半双工/全双工
查看>>
bulk
查看>>
js document.activeElement 获得焦点的元素
查看>>
abb画学号
查看>>
C++ 迭代器运算
查看>>
【支持iOS11】UITableView左滑删除自定义 - 实现多选项并使用自定义图片
查看>>
day6-if,while,for的快速掌握
查看>>
JavaWeb学习笔记(十四)--JSP语法
查看>>
【算法笔记】多线程斐波那契数列
查看>>
Ajax使用进阶
查看>>
Jquery元素选取、常用方法
查看>>
C语言下的错误处理的问题
查看>>
Java中解析XML的方法
查看>>
条目六《当心C++编译器中最烦人的分析机制》
查看>>
servlet的简单定义
查看>>
laravel sql复杂语句,原生写法----连表分组
查看>>