Arduino成长日记5 - 串口通信

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_36955622/article/details/91048622

串口作为Arduino最简单的通信方式,可以实现与计算机通信,或与其他带串口功能的设备进行数据交流,而且在编程方面充当主要的调试手段,想必大伙儿都不会陌生了吧。
Arduino的串口知识相对来说比较简单,在UNO板上的体现为USB口,当通过USB线连接到计算机时,计算机会识别这个串口设备(UNO),并为其创建一个端口号,利用该端口号,Arduino UNO便能跟计算机实现数据交流,其中就包括了程序上传。


串口函数说明
1、Serial.begin()

描述:将串行数据传输速率设置为 bit/s(波特率) 。与计算机进行通信时,可以使用这些波特率:300、1200、2400、4800、9600、14400、19200、28800、38400、57600或115200。当然,也可以指定其他波特率,例如,针脚0、1和一个组件进行通信,它需要一个特定的波特率。

注意
  • 波特率是衡量通信速度的参数,它表示每秒钟传送的bit的个数。
  • Arduino UNO板默认的串口针脚为 针脚0(RX)、针脚1(TX)。
  • 在两个设备进行串口通信的时候,两头的串口波特率需要统一,例如,设备1的串口波特率为9600,设备2的串口波特率也必须为9600,这才能保证数据的正确收发,否则可能出现接收到乱码的情况。

语法:Serial.begin(speed)。
参数:speed,bit/s(波特率),long。

具体程序实例如下:

void setup()
{
	//设置串口波特率为9600
	Serial.begin(9600);
}

void loop() 
{}

串口波特率一般在setup函数中做初始化设置。

2、int Serial.available()

描述:从串口缓冲区读取有效的字节数(字符),这是已经传输到并存储在串行接收缓冲区(能够存储64个字节)的数据。available继承了Stream类。
语法:Serial.available()。
返回:可读取的字节数。

具体程序实例如下:

void setup()
{
	//设置串口波特率为9600
	Serial.begin(9600);
}

void loop()
{
	//如果串口缓冲区有数据
	if(Serial.available() > 0)
	{
		//读取串口数据
		...
	}
}
3、int Serial.read()

描述:读取串口缓冲区的数据,每次读取一个byte(字节)。
语法:Serial.read()。
返回:在串口缓冲区待读取的第一个字节。

具体程序实例如下:

//新建变量,用于存放读取的串行数据
int incomingByte = 0;		

void setup()
{
	//设置串口波特率为9600
	Serial.begin(9600);
}

void loop()
{
	//如果串口缓冲区有数据
	if(Serial.available() > 0)
	{
		//读取串口数据
		incomingByte = Serial.read();
	}
}
4、Serial.print()

描述:以ASCII文本形式打印数据到串口输出,此命令可以采取多种形式。
每个数字的打印输出使用的是ASCII字符。浮点型同样打印输出的是ASCII原符,保留小数点的后两位;Bytes型打印输出单个字符;字符和字符串原样打印输出。
Serial.print()打印输出的数据不换行。

有如下实例供参考:

  1. Serial.print(78) 输出为 “78”。
  2. Serial.print(1.23456) 输出为 “1.23”。
  3. Serial.print(“N”) 输出为 “N”。
  4. Serial.print(“Hello world.”) 输出为 “Hello world.”。
  • 也可以自己定义输出数据的进制,可以为:
  1. BIN (二进制,或以2为基数)。
  2. OCT(八进制,或以8为基数)。
  3. DEC(十进制,或以10为基数)。
  4. HEX(十六进制,或以16为基数)。
  5. Serial.print(78,BIN) 输出为 “1001110”。
  6. Serial.print(78,OCT) 输出为 “116”。
  7. Serial.print(78,DEC) 输出为 “78”。
  8. Serial.print(78,HEX) 输出为 “4E”。
  • 面对与浮点型数字,可以指定输出的保留的小数点后数字个数:
  1. Serial.print(1.23456,0) 输出为 “1”。
  2. Serial.print(1.23456,0) 输出为 “1.23”。
  3. Serial.print(1.23456,0) 输出为 “1.2346”。

语法:Serial.print(val) 或 Serial.print(val,格式)。
参数:val,打印输出的值,可以为所有数据类型;格式,指定进制(整型数据类型)或 小数位数(浮点类型)。
返回:字节(byte),print()将返回写入的字节数,但是否使用(或读出)是可以设定的。

具体程序实例如下:

void setup()
{
	//设置串口波特率为9600
	Serial.begin(9600);
}

void loop()
{
	//打印ASCII码表的一部分,修改它的格式得到需要的内容
	//打印多种格式
	for(int x = 0; x < 64; x++)
	{
		Serial.print(x);					//以十进制格式将 x 打印输出,与 “DEX” 相同
		Serial.print("\t");				//横向跳格
		Serial.print(x,DEX);			//以十进制格式将 x 打印输出
		Serial.print("\t");				//横向跳格
		Serial.print(x,HEX);			//以十六进制格式将 x 打印输出
		Serial.print("\t");				//横向跳格
		Serial.print(x,OCT);			//以八进制格式将 x 打印输出
		Serial.print("\t");				//横向跳格
		Serial.print(x,BIN);			//以二进制格式将 x 打印输出
		Serial.print("\t");				//横向跳格
	
		delay(200);						//延时200ms
		Serial.println(" ");			//打印一个空字符,并自动换行
	}
}
5、Serial.println()

描述:打印数据到串行端口,输出人们可识别的ASCII码文本并回车及换行,此命令采用的形式与Serial.print()相同,此处省略。
语法:Serial.println(val) 或 Serial.println(val,格式)。
参数:val,打印的内容,可以为所有数据类型;格式,指定进制(整型数据类型) 或 小数位数 (浮点类型)。
返回:字节(byte),println()将返回写入的字节数,但可以选择是否使用。

具体程序实例如下:

int analogValue = 0;			//存放模拟输入值

void setup()
{
	//设置串口波特率为9600
	Serial.begin(9600);
}

void loop()
{
	analogValue = analogRead(0);	//读取引脚0的模拟输入
	
	Serial.println(0);				//打印ASCII编码的十进制并换行
	Serial.println(0,DEC);			//打印ASCII编码的十进制并换行
	Serial.println(0,HEX);			//打印ASCII编码的十六进制并换行
	Serial.println(0,OCT);			//打印ASCII编码的八进制并换行
	Serial.println(0,BIN);			//打印ASCII编码的二进制并换行

	delay(20);						//延时20ms
}

Arduino的串口通信会使用到 Stream 这个类,Stream 类是二进制数据或者字符串数据流传输的基础类,不能被直接调用,但可以被继承。许多库包含了 Stream 类,例如 Serial;Wire;Enternet Client;Enternet Setver;SD等。对于Stream 类只需要有个了解即可,简单介绍一下Stream类的函数 ~

  • Stream类

Stream 类 包含下列函数:

available()
read()
flush()
find()
findUntil()
peek()
readBytes()
readBytesUntil()
readString()
readStringUntil()
parseInt()
parseFloat()
setTimeout()

Stream 的这些函数 都会被 Serial 库继承。

available()

说明(Description):
  函数 available() 获取数据流中接收到的字节数
返回值(Returns):
  返回值是存储在缓冲区的字节数, int 类型

read()

说明(Description):
  函数 read() 获取数据流中第一个字节数据,获取数据后会清除当前字节数据,与peek()函数有区别
返回值(Returns):
  返回值是 读取数据字符的第一个字节(8bit)

flush()

说明(Description):
  函数 flush() 清除数据流所有未向外发送的数据
返回值(Returns):
  bool 类型

find()

说明(Description):
  函数 find() 从数据流中查找目标字符串,找到目标字符串后返回值 = true,超时则返回值 = false
返回值(Returns):
  bool 类型

findUntil()

说明(Description):
  函数 findUntil() 从数据流中读取目标字符串或者终止目标字符串,找到目标字符串后返回值 = true,超时则返回值 = false
语法(Syntax):
  stream.findUntil(target, terminal)
target:要搜索的字符串
terminal:终止目标字符串
返回值(Returns):
  bool 类型

peek()

说明(Description):
  函数 peek() 从数据流中读取当前的一个字节,不会清除数据流中当前字节数据,与 read() 函数有区别。
返回值(Returns):
  当前缓存区数据流的第一个字节数据,如果缓存区无数据时返回 -1

readBytes()

说明(Description):
  函数 readBytes() 从数据流中读取确定字节的数据到缓存区,读取确定长度数据或超时时终止
语法(Syntax):
stream.readBytes(buffer, length)
stream:从 Stream 类 继承的实例
buffer:存放数据的缓存区(可以是 char[] 或 byte[] 这样的数组)
length:存放的字节数
返回值(Returns):
  已经存放在缓存区中的字节数

readBytesUntil()

说明(Description):
  函数 readBytesUntil() 从数据流中读取确定字节的数据到指定缓存地址,读取确定长度数据、或读取到终止字符、或超时时终止
和 readBytes() 相比多了终止字符串
语法(Syntax):
stream.readBytesUntil(character, buffer, length)
stream:从 Stream 类 继承的实例
character:终止字符(char 类型)
buffer:存放数据的指定缓存地址(可以是 char[] 或 byte[] 这样的数组)
length:存放的字节数(int 类型)
返回值(Returns):
  已经存放在缓存区中的字节数

readString()

说明(Description):
  函数 readString() 将字符从数据流中读入字符串中,超时时该函数终止
返回值(Returns):
  读取到的字符串(string)

readStringUntil()

说明(Description):
  函数 readString() 将字符从数据流中读入字符串中,遇到终止字符或超时时该函数终止
语法(Syntax):
stream.readString(terminator)
terminator:终止字符
返回值(Returns):
  读取到的字符串(string)

parseInt()

说明(Description):
  函数 parseInt() 从数据流中读取第一个有效(长)整型数,跳过非整数(或减号)的字符。
语法(Syntax):
stream.parseInt(list)
stream.parseInt(’‘list’, char skipchar’)
返回值(Returns):
  长整型(long)

parseFloat()

说明(Description):
  函数 parseInt() 从数据流中读取第一个有效浮点数,跳过非数字(或减号)的初始字符,parseFloat()由非浮点数的第一个字符结束。
语法(Syntax):
stream.parseFloat(list)
list:检查的数据流
返回值(Returns):
  浮点数(float)

setTimeout()

说明(Description):
  函数 setTimeout() 设置等待数据流通讯超时时间,毫秒为单位
语法(Syntax):
stream.setTimeout(time)
time:毫秒为单位的时间,长整型(long)

  • Serial类

Serial 类 用于对串口数据流的读写。

Serial 继承 Stream 类,同时增加了几个新的函数,所有方法如下:
if (Serial)  
available()
availableForWrite()
begin()
end()
find()
findUntil()
flush()
parseFloat()
parseInt()
peek()
print()
println()
read()
readBytes()
readBytesUntil()
readString()
readStringUntil()
setTimeout()
write()
serialEvent()

end()

说明(Description):
  函数 end() 禁用串口。禁用串口后,原串口所占用引脚被当做一般输入输出使用。
语法(Syntax):
  Serial.end()
返回值(Returns):
  nothing 无

write()

说明(Description):
  函数 write() 将数据流通过串口以 二进制数据的形式发出,与 print() 函数是有区别的
语法(Syntax):
Serial.write(val)
Serial.write(str)
Serial.write(buf, len)

val:单个字节的值
str:一连串字节的字符串
buf:定义的数组
len:指定的数组长度
返回值(Returns):
  返回 write() 函数通过写入串口的字节数

serialEvent()

说明(Description):
  函数 serialEvent() 为串口中断事件函数,当串口有数据时被调用。可使用 Serial.read() 函数捕捉数据。
语法(Syntax):
  void serialEvent(){
    //statements 任何有效的语句
   }


通过上面阶梯性的串口函数介绍,想必大伙也基本掌握了Arduino串口的基本用法。
具体程序实例如下:

/*************************************
*      		串口数据接收打印
*************************************/
int incomingByte = 0;		

void setup()
{
	//设置串口波特率为9600
	Serial.begin(9600);
}

void loop()
{
	//如果串口缓冲区有数据
	if(Serial.available() > 0)
	{
		//读取串口数据,打印缓冲区数据流
		incomingByte = Serial.read();
		Serial.print(incomingByte);
	}
	
	//打印完所有数据流,打印空格并换行
	Serial.println(" ");
}

或是更简洁的

/*************************************
*      		串口数据接收打印
*************************************/
void setup()
{
	//设置串口波特率为9600
	Serial.begin(9600);
}

void loop()
{
	//如果串口缓冲区有数据
	if(Serial.available() > 0)
	{
		//打印缓冲区数据流
		Serial.print(Serial.read());
	}
	
	//打印完所有数据流,打印空格并换行
	Serial.println(" ");
}

注意

串口数据的发送主要以print()函数和println函数为主,另外write函数也是串口发送函数,与print和println不同的是write函数将数据流以二进制的形式发送出去。

串口接收字符串

接收串口传过来的字符串,并进行字符串比较,相当于指令识别。
具体编程实例如下:

//新建字符串变量
String order = "";

void setup()
{
	//设置串口波特率115200
	Serial.begin(115200);
}

void loop()
{
	while(Serial.available() > 0)
	{
		//将读取的字符赋值到字符串
		order += (char)(Serial.read());
		//为每个字符读取添加2ms延时,避免丢包
		delay(2);
	}
	//compareTo函数进行字符串比较,字符串相同时返回0
	if(!order.compareTo("open"))
	{
		//do something
		...
		//执行完操作后字符串清零
		order = "";
	}
}

猜你喜欢

转载自blog.csdn.net/qq_36955622/article/details/91048622
今日推荐