Arduino学习笔记之Arduino的数字输出&串口输入

来源:互联网 发布:上海网站建设优化 编辑:程序博客网 时间:2024/04/30 19:43

    Arduino的数字I/O被分成两个部分,其中每个部分都包含有6个可用的I/O管脚,即管脚2 到管脚7和管脚8到管脚13。除了管脚13上接了一个1K的电阻之外,其他各个管脚都直接连接到ATmega上。我们可以利用一个6位的数字跑马灯,来对 Arduino数字I/O的输出功能进行验证,以下是相应的原理图:


电路中在每个I/O管脚上加的那个1K电阻被称为限流电阻,由于发光二极管在电路中没有等效电阻值,使用限流电阻可以使元件上通过的电流不至于过大,能够起到保护的作用。

该工程对应的代码为:

int BASE = 2;
int NUM = 6;
int index = 0;

void setup()
{
for (int i = BASE; i < BASE + NUM; i ++) {
    pinMode(i, OUTPUT);
}
}

void loop()
{
for (int i = BASE; i < BASE + NUM; i ++) {
    digitalWrite(i, LOW);
}
digitalWrite(BASE + index, HIGH);
index = (index + 1) % NUM;
delay(100);
}
下载并运行该工程,连接在Arduino数字I/O管脚2到管脚7上的发光二极管会依次点亮0.1秒,然后再熄灭:


这个实验可以用来验证数字I/O输出的正确性。Arduino上一共有十二个数字I/O管脚,我们可以用同样的办法验证其他六个管脚的正确性,而这只需要对上述工程的第一行做相应的修改就可以了:

int BASE = 8;

 好消息!飞凡嵌入式成立的飞凡创客联盟火热招募中!!只有您有创业的激情,只要您有创业的梦想!都可以参与进来,我们给您提供一个展示自我的平台,在这里您会交到更多的朋友,了解更多的未知领域。激情点燃梦想,青春构筑未来!飞凡创客联盟QQ:456320580火热招募中!!

    串行通信是在实现在PC机与微控制器进行交互的最简单的办法。之前的PC机上一般都配有标准的 RS-232或者RS-422接口来实现串行通信,但现在这种情况已经发生了一些改变,大家更倾向于使用USB这样一种更快速但同时也更加复杂的方式来实现串行通信。尽管在有些计算机上现在已经找不到RS-232或者RS-422接口了,但我们仍可以通过USB/串口或者PCMCIA/串口这样的转换器, 在这些设备上得到传统的串口。

通过串口连接的Arduino在交互式设计中能够为PC机提供一种全新的交互方式,比如用PC机控制一些之前看来非常复杂的事情,像声音和视频等。很多场合中都要求Arduino能够通过串口接收来自于PC机的命令,并完成相应的功能,这可以通过Arduino语言中提供的 Serial.read()函数来实现。

在这一实验中我们同样不需要任何额外的电路,而只需要用串口线将Arduino和PC机连起来就可以了,相应的Arduino工程代码为:

int ledPin = 13;
int val; 

void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);


void loop() {
val = Serial.read();
if (-1 != val) {
    if ('H' == val) {
      digitalWrite(ledPin, HIGH);
      delay(500);
      digitalWrite(ledPin, LOW);
    }
}
}


把工程下载到Arduino模块中之后,在Arduino集成开发环境中打开串口监视器并将波特率设置为9600,然后向Arduino模块发送字符H,如下图所示:


该工程运行起来之后会不断调用Serial.read()函数从串口获得数据。Arduino语言提供的这个函数是不阻塞的,也就是说不论串口上是否真的有数据到达,该函数都会立即返回。Serial.read()函数每次只读取一个字节的数据,当串口上有数据到达的时候,该函数的返回值为到达的数 据中第一个字符的ASCII码;当串口上没有数据到达的时候,该函数的返回值则为-1。

Arduino语言的参考手册中没 有对Serial.read()函数做过多的说明,我的一个疑问是如果PC机一次发送的数据太多,Arduino是否提供相应的串口缓存功能来保证数据不会丢失?Arduino语言中提供的另外一个函数Serial.available()或许能够帮助我们用实验来进行验证:

int ledPin = 13;
int val; 

void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);


void loop() {
val = Serial.read();
if (-1 != val) {
    if ('H' == val) {
      digitalWrite(ledPin, HIGH);
      delay(500);
      digitalWrite(ledPin, LOW); 

Serial.print("Available: ");
      Serial.println(Serial.available(), DEC);
    }
}
}


函数Serial.available()的功能是返回串口缓冲区中当前剩余的字符个数,按照Arduino提供的该函数的说明,串口缓冲区中最多能缓冲128个字节。我们可以一次给Arduino模块发送多个字符,来验证这一功能:


在这一实验中,每当Arduino成功收到一个字符H,连接在数字I/O端口管脚13上的发光二极管就会闪烁一次:



0 0
原创粉丝点击