购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.6.6 串口通信函数

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;

}

} 4DzujZl+ZFWjNxVgPVHVJsO7UtX5OK39ZvLmMsFBs226N5i/VaVIV5QUu5GKjNpz

点击中间区域
呼出菜单
上一章
目录
下一章
×