串口波特率的设置:通常我们使用Serial.begin(speed)来完成串口的初始化,这种方式,只能配置串口的波特率。

使用Serial.begin(speed, config)可以配置数据位、校验位、停止位等。例如Serial.begin(9600,SERIAL_8E2)是将串口波特率设为9600,数据位8,偶校验,停止位2。

9600 串口波特率

SERIAL_8E2

8:8位

E:偶校验

2:停止位

config可用配置如下:

1: 少用 if (Serial)的用法:串口打开为真,串口关闭为假。比较囧的是,这个方法只适用于Leonardo和micro的 Serial,也就是说连接连接到电脑USB的那个模拟串口。例如以下程序,当你没有使用串口监视器打开串口时,程序就会一直循环运行while (!Serial) {;} ,当你打开串口监视器,程序会退出while循环,开始loop中的程序。

2: read和peek输入方式的差异    串口接收到的数据都会暂时存放在接收缓冲区中,使用read()与peek()都是从接收缓冲区中读取数据。不同的是: 使用read()读取数据后,会将该数据从接收缓冲区移除; 使用peek()读取时,不会移除接收缓冲区中的数据。

3: 串口读入int型数据  实际上是串口读入字符串,再转换为int型数据。 输出不同进制的文本  可以是用 Serial.print(val, format)的形式输出不同进制的文本 。 参数val 是需要输出的数据  参数format 是需要输出的进制形式,可以使用如下参数:   BIN(二进制)   DEC(十进制)   OCT(八进制)   HEX(十六进制)    例如,使用Serial.print(123,BIN),你可以在串口调试器上看到1111011   使用Serial.print(123,HEX),你可以在串口调试器上看到7B 。 4: 修改串口缓冲区大小: Arduino串口缓冲区默认为64字节,如果单次传输的数据较多可以将arduino-1.0.5r2\hardware\arduino\cores\arduino\HardwareSerial.cpp中的  #define SERIAL_BUFFER_SIZE 64 修改为 #define SERIAL_BUFFER_SIZE 128   这样就有128字节的缓冲区了  Arduino MEGA\Arduino DUE上其他串口用法: serial1\serial2\serial3和serial用法一样,比如serial3.begin(9600);

重要之处: 经典的Processing与Arduino通信实例: 使用Serial.available()检测:

import processing.serial.*;

Serial myPort;

void setup(){
myPort = new Serial(this,"/dev/ttyACM0", 115200); //Set Serial Port } void draw(){
if(myPort.available()>0){
String message = myPort.readString();
println(message);
}
}
//Arduino code
int data=12345;
void setup()
{
Serial.begin(115200);//rate
}
void loop()
{
Serial.print(data); //send data
delay(1000);
}
然后我们期待着每次获取“12345”并显示在屏幕上,但事与愿违,我们得到的情况是这样的: 12345
123
45
12345
12345
输出时的中断是怎样产生的呢?要探究这个问题的根源,需要重新审视
***串口通信的原理**。* ******************** 串口通讯就像一趟公共汽车,每个字节是一个在等车的人。他来到车站(发送数据),车还没有来,所以新来的人就一直等待(缓存)。当公共汽车来了的时候,将这些人一次接走(读取数据),当然车也是有容量的,只能载一定数量的人(缓存大小)。现在有一个旅行团(字符串/字符数组),一部分人走在前面刚刚赶上了车(被读取),而另一部分人没赶上,只能等待下一班车(下一次读取)。另一种情况是,两个旅行团都在车站等车,被同一班车接走了。这就是为什么我们读取的时候字符串会断成两节,或者并起来。 核心原因是:串口流通的数据都是bytes而没有字符串概念,所有发送数据都会按一个byte一个byte缓存,不论是否是连续字符串;而读取时会取走所有缓存bytes,不论它们是否是一个、半个还是多个字符串。 ** ---------- ** Arduino和Processing的数据收发速度是不一样的。如果用Arduino延时较长时间,Processing可能读取一个字符串或字符串的一部分。如果Arduino延时较短,Processing可能读取多个字符串,但不一定完整。在读取字符串的时候,无法确定上一个字符串是否被读取了,当前字符串是否缓存完毕,因为字符串都已经切成了bytes,连成一串。这个问题是串口通信本身造成的,一定会出现。 ** ---------- ** ---------- ---------- 一种解决方法是,通过在接收端缓存数据来解决这个问题。
为传输数据设置一个结束标记,如’\n’(换行符),就能在接收到的数据流中识别到一个字符串的结尾。当未遇到结束标记,就一直将串口数据保存在一个buffer变量中,继续接收。 Processing的SerialEvent事件类型就提供了这种方式,使用bufferUntil(ch)可以在遇到某个指定字符时才完成缓存。 ---------- ---------- 程序实例: //Processing Code
import processing.serial.*; Serial myPort; void setup(){
myPort = new Serial(this,"/dev/ttyACM0", 115200); //in fact, any rate is ok...
myPort.bufferUntil('\n'); //buffer until meet '\n', then call the event listener
} void draw(){ } //listen to the event. when buffer filled, run this method
void serialEvent(Serial p) {
String inString = p.readString();
print(inString);
} //then the buffer will reveive all the bytes
//Arduino Code
int data=12345;
void setup()
{
Serial.begin(115200);//rate
}
void loop()
{
Serial.println(data); //send data, end up with '\n'
delay(1000);
}
当然,这种方法也可以用在普通的串口通信中,不必使用SerialEvent。接收的数据不直接使用,而是作为缓存。若未遇到结束标记,就继续读取下一次。当遇到结束标记,即完成缓存。 ---------- ---------- ---------- 程序实例: //Processing Code
import processing.serial.*; String message;
String temp;
Serial myPort; void setup(){
myPort = new Serial(this,"/dev/ttyACM0", 115200); //Set Serial Port
} void draw(){
if(myPort.available()>0){
temp = myPort.readString(); //temp for read bytes
for(int i = 0; i < temp.length(); i++){
//if meet the end mark
if(temp.charAt(i) == '\n'){
println(message);
message = ""; //clean string
}
else
message += temp.charAt(i); //store byte
}
}
}
//Arduino Code
int data=12345;
void setup()
{
Serial.begin(115200);//rate
}
void loop()
{
Serial.println(data); //send data, end up with '\n'
delay(1000);
}

Serial.begin的更多相关文章

  1. Eclipse编译Arduino程序不能使用串口函数Serial.begin解决办法

    在Arduino官方的编译器当中Serial.begin(9600);初始化语句是可以直接使用的,而到Eclipse当中,同样的语句却不能用了.会出现下面的问题: 显然,这是Eclipse没有找到Se ...

  2. Arduino 串口篇 Arduino发送十六进制 send HEX via serial port RS232-to-USB to PC

    发送十六进制比较直观,可以在上位机中直接获取十六进制的数据,然后在在上位机上将十六进制HEX转换成BIN(二进制)或者DEC(十进制)就十分简单有效了. 下面是在Arduino上怎么演示直接发送16进 ...

  3. 进阶之路(基础篇) - 019 Serial串口函数说明

    本文总结了Arduino常用串口操作函数,函数说明部分来源于Arduino 官网串口使用指南,示例与实验部分为自编.本文是对Arduino串口操作函数的较全面总结,可作为工具贴查找使用. 函数:if( ...

  4. Arduino Serial库的使用

    1 Serial.begin() 2 Serial.end() 3 Serial.available() 4 Serial.read() 5 Serial.peek() 6 Serial.flush( ...

  5. Arduino-串口函数Serial

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

  6. Arduino 串口通讯参考笔记 - Serial 类库及相关函数介绍

    声明: 本ID发布的所有文章及随笔均为原创,可随意转载,单转载文章必须注明作者 aiyauto 及包含原文出处地址 http://www.cnblogs.com/aiyauto/p/7071712.h ...

  7. ESP-8266 串口通信(Serial)

    ESP8266的串口通信与传统的Arduino设备完全一样.除了硬件FIFO(128字节用于TX和RX)之外,硬件串口还有额外的 256字节的TX和RX缓存.发送和接收全都由中断驱动.当FIFO/缓存 ...

  8. 一百元的智能家居——Asp.Net Mvc Api+讯飞语音+Android+Arduino

    大半夜的,先说些废话提提神 如今智能家居已经不再停留在概念阶段,高大上的科技公司都已经推出了自己的部分或全套的智能家居解决方案,不过就目前的现状而言,大多还停留在展厅阶段,还没有广泛的推广起来,有人说 ...

  9. Arduino 1602液晶屏实验和程序

    在Arduino IDE中, 项目->加载库->管理库中搜索LiquidCrystal,然后安装即可 1.接线图 2.引脚图 3.最简单程序 #include <LiquidCrys ...

随机推荐

  1. iOS开发知识梳理博文集

    前言 做iOS开发有3年了,从当初的小白到现在,断断续续看过很多资料,之前也写过一些博文来记录,但是感觉知识点都比较凌乱.所以最近准备抽时间把iOS开发的相关知识进行一个梳理,主要分为OC基础.UI控 ...

  2. 遇到doxygen生成的chm文档目录如果有中文是乱码?

    原因不在于doxygen,它没有问题,问题出在微软的HTML Help Workshop的hhc.exe不支持utf8.所以要解决这个问题,需要做两个额外的步骤: 1.将html/index.hhp中 ...

  3. 【HttpRunner v3.x】笔记 ——4. 测试用例-结构解析

    一.官方首推pytest格式 上篇文章我们知道了,httprunner可以支持三种格式的用例,分别是pytest.yaml和json.yaml和json是以前的版本所使用的用例格式,但是在3.x版本上 ...

  4. 故障:fork failed:Resource Temporarily Unavailable解决方案

    故障:fork failed:Resource Temporarily Unavailable解决方案 AIX在一次crontab bkapp.txt导入N多定时任务时候,该用户无法执行任何命令,再s ...

  5. Codeforces1250C Trip to Saint Petersburg 线段树

    题意 有个人要去圣彼得堡旅游,在圣彼得堡每天要花\(k\)块钱,然后在圣彼得堡有\(n\)个兼职工作\(l_i,r_i,p_i\),如果这个人在\(l_i\)到\(r_i\)这个时间段都在圣彼得堡,那 ...

  6. Codeforces1249E By Elevator or Stairs?

    题意 给定整数c和数组a,b,\(a_i\)表示通过爬楼梯的方法从第\(i\)层到\(i+1\)层需要的时间,\(b_i\)表示通过坐电梯的方法从第\(i\)层到\(i+1\)层需要的时间,坐电梯前需 ...

  7. 求支付表中按id累积和最接近100的那条记录

    此例源自美团的一道SQL面试题 支付表结构: create table hy_payment( id number(4,0) primary key, pay number(3,0) not null ...

  8. leetcode刷题-74搜索二维矩阵

    题目 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列.每行的第一个整数大于前一行的最后一个整数.示例 1: 输入:matrix ...

  9. pwnable——flag

    分析 此题为reverse题目,首先放入ida查看: 程序函数太少,应该加过壳 在hex view中发现程序通过upx加壳,利用upx -d 指令解压得到程序,重新放入ida查看 程序非常简单,读取f ...

  10. 从架构到部署,全面了解K3s

    Kubernetes无处不在--开发者的笔记本.树莓派.云.数据中心.混合云甚至多云上都有Kubernetes.它已然成为现代基础设施的基础,抽象了底层的计算.存储和网络服务.Kubernetes隐藏 ...