Arduino中串口通信是通过HardwareSerial类来实现的,在HardwareSerial.h中定义了一个HardwareSerial类的对象Serial,直接使用类的成员函数就可以简单地实现串口通信。
1.Serial.begin()
Serial.begin函数用设置串口的波特率,波特率是指每秒传输的比特数,除以8可得到每秒传输的字节数。一般的波特率有9 600、19 200、57 600、115 200等。
2.Serial.available()
Serial.available函数用来判断串口是否收到数据,该函数返回值为int型,不带参数。
3.Serial.print()
Serial.print函数用于从串口输出数据,数据可以是变量,也可以是字符串。
4.Serial.read()
Serial.read函数的功能与Serial.print函数类似,都是从串口输出数据,只是Serial.printIn函数多了回车换行功能。
5.程序举例
下面以一个串口调光器的程序为例介绍。
HardwareSerial类几个较常用的公有成员函数,程序清单如下:
/*
Dimmer(调光器)
通算机发送数据控制LED灯的亮度,单字节数据发送,数据范围为0~255,使用具有PWM功能的9号引脚。
conat int ledpin=9;//the pun that the LED is attached to voif setup()
{
//设置串口波特率;
serial.begin(9600); //1
//设置LED控制引脚;
pinmode(ledpin,OUTPUT);
}
void loop()
{
byte brightness;
//查询串口是否收到数据;
if(serial,available()) //2
{
//获取数据
brightness=serial,read(); //3
//控制LED亮度
analogwrite(ledpin,brightness);
}
}
串口通信相关语句分析解释。
(1)Serial.begin(9600);
该语句的功能是设置串口通信波特率为9600bps,其函数原型如下:
void mareware serial::begin(long baud)
{
uint16-t baud-setting;
bool use -u2x;
//u2x mode is needed for baud rates higer than(CPU Hz/16)
if(bavd>F-CPU/16)
{
use-u2x=true;
}
else
{
//figure out if u2x mode would allow for a better commection
//calculate the percent difference bettween the baud-rate specified and
//the real baud rate for both U2x and non-U2x mode
uint 8-t nonu2x-baud -error=abs(9int)(255-
((F -CPU/(16*(((F-CPU/8/baud-1)/2)+1))+255)/baud));
uint8-t u2x baud error=abs((int)(255-
((F -CPU/(8*(((F-CPU/8/baud-1)/2)+1))+255)/baud));
//prefer non -U2x mode because it handles clock skew better
use-U2x=(nonu2x-baud-error>u2x-baud-error);
}
if(use-u2x)
{*-ucsra=1<<-u2x;
baud-setting=(F-CPU/4/baud-1)/2;
}
else
{
-ucara=0;
baud-setting=(F-CPU/8/baud-1)/2;
}
//assign the baud setting,a.l.a.ubbr(USART Baud rate register)
*-ubrrh=baud-setting>>8;
*-ubrr1=baud-setting;
sbi(*-ucsrb,-rxen);
sbi(*-ucsrb,-rxen);
sbi(*-ucsrb,-rxcie);
(2)if(Serial.available())
该语句用来判断Arduino串口是否收到数据,函数Serial.available()返回值为int型,不带参数。函数原型如下:
int hardwareserial::available(void)
{
return(rx buffer size+-rxbuffer->bead-rxbuffer->tail)%RX-BUFFER-SIZE;
}
(3)brightness=Serial.read()
该语句的功能是将串口数据读入变量brightness中,函数Serial.read()也不带参数,返回值为串口数据,int型。函数原型如下:
int hardwareserual::read(void)
{
//if the head isn’t ahead of the tail,we bon’t have any characters
if(-rx-buffer->head==-rx-buffer->tail)
{
return-1;
}
else
{
unsigned char c=-rx-buffer->buffer[-rx-buffer->tail];
-rx-buffer->tail=(-rx-buffer->tail+1)%RX-BUFFER-STZE;
return c;
}
}