AVR单片机的串行通信口(RXD和TXD)除了接在USB到串行数据的转换芯片上之外,还作为Arduino的0号和1号引脚,在板上有明确的标识,如图1-55所示。
本节实例采用两条杜邦线将两块Arduino板的通信口交叉连起来,其中一块Arduino每隔1s发送一个值为0x55的字节,另一块Arduino收到该字节后控制13号引脚的LED转换状态。
图1-55 Arduino板上的串行通信口
1.硬件连接
本实验的硬件连接非常简单,直接将一块开发板的TX0连接另一块板的TX1,而TX1连接另一块板的TX0,如图1-56所示。
图1-56 串口通信实例电路
2.程序代码
由于实例用到了两块Arduino,因此程序设计分为发送端和接收端两部分,先来看看发送端的程序,实例要求发送端每隔1s发送一个值为0x55的字节。
/****************************************************
串行通信实例程序--发送端
每隔1s发送一个值为0x55的字节
初始化部分estup()函数
******************************************************/
void setup()
{
//设置串口波特率为9600bps
Serial.begin(9600);
}
/*****************************************************
执行部分——(loop)函数
*****************************************************/
void loop()
{
//延时1s,bdlay函数
delay(1000);
//输出0x55)
serial.print(0x55,BYTE);
}
接收端程序的任务是收到0x55后转换13号引脚的状态,代码如下:
This example code is in the public domain.
******************************************************/
int ledflag; //LED状态
/******************************************************
初始化部分estup()函数
******************************************************/
void setup()
{
//设置串口波特率为9600bps
Serial.begin(9600);
//设置13号引脚为输出
Pinmode(13,OUTPUT);
}
/*****************************************************
执行部分——(loop)函数
*****************************************************/
void loop()
{
byte rxdata;
if(serial.availablew())
{
//获取收到的数据
RXDate=Serial,read();
//判断收到的数据是否是0x55
if(RXData==0x55)
{
if(ledflag==0)//判断LED状态
{
ledflag=1;
digitalwrite(13,HIGH);
}
else
{
ledflag=0;
digitalwrite(13,LOW);
}
}
}
}
读者在开始学习Arduino串口通信时,可以用计算机与 Arduino 进行通信,原理上是一样的。在Arduino开发环境下带有Serial Monitor(串口监视窗)功能 。可方便地进行串口通信调试,界面如图1-57所示。
图1-57 Serial Monitor(串口监视窗)界面