本篇主要讲解一下Arduino的串口及其编程方法。
串口是Arduino与其他设备进行通信的接口,需要用到“Serial”系列函数。
一共有以下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) //读取固定长度的二进制流
先看例子吧
1 2 3 4 5 6 7 | void setup() { Serial.begin(9600); } void loop() { Serial.println("BeiTown"); } |
这里的bengin方法为初始化并设置串口波特率,波特率表示每秒传输的bit各数,需要和通信设备同步。通常9600已经足够。
println方法类似于c语言中的printf,即输出字符串。
接下来烧入板子,打开IDE右上角的 串口监视器(Serial Monitor)
按一下板子上的reset按钮,刷新下板载系统,即可看到如图显示
表示此时已经收到的Arduino串口信息。
再看一个例子,这里直接用官方案例好了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | int incomingByte = 0; // for incoming serial data void setup() { Serial.begin(9600); // opens serial port, sets data rate to 9600 bps } void loop() { // send data only when you receive data: if (Serial.available() > 0) { // read the incoming byte: incomingByte = Serial.read(); // say what you got: Serial.print("I received: "); Serial.println(incomingByte, DEC); } } |
这个例子类似一个echo服务器,输入什么就打印什么,read方法获取其他设备向arduino的写入数据,available表示缓冲区数据量,这里的处理方法是如果缓冲区没有数据,则不读取也不调用println方法。
效果如图:
Serial.println(incomingByte, DEC);打印接到数据十进制表示的ascii码。
以上是一些使用次数较多的方法,剩下一些这里做一个简单讲解
peek():功能类似于read(),但是我们知道当调用一次read()后,缓冲区的数据流会被读取并删除read过的数据,也就是available值会减少,但peek()不会出现类似情况,其功能类似于检测缓冲区的头部数据,反复调用peek()返回的值是一样的。用得好的话可以精简很多代码。
write():写入二进制数据到串行端口。这个数据是作为一个字节或字节序列发送的。如果发送字符串则需要用到print方法。
最后注意一下:当烧程序入板卡的时候,在完成前即L、TX、RX灯闪烁前,断开数据线很可能损坏硬件。同时测试前养成按一次reset键复位的习惯,这里特别注意,在打开串口监视器后,需要reset一次,否则无法看到效果。
Serial的更多用法随着机器人开发的深入,我们会陆续讲解。本篇到此,谢谢关注。
BeiTown
2013.03.26