极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 27032|回复: 9

Arduino官方范例communication之ReadASCIIString

[复制链接]
发表于 2013-8-4 22:39:26 | 显示全部楼层 |阅读模式
/*
翻译:tom
时间:2013年08月04日
IDE版本号:1.01
发表地址:www.geek-workshop.com
翻译说明: 根据arduino自带的范例进行翻译,可能根据实际的需要略作修改



*/
http://arduino.cc/en/Tutorial/ReadASCIIString
Examples > Communication
Read ASCII String
这个草图中使用了Serial.parseInt()函数定位数值,用非文本数字字符。通常人们用一个隔号表明不同的信息部分。这个格式通常适用于逗号分隔数值),但是其它的字符如一个空格或是句号同时有效。这个数值被解释成整型数值和作为RGB LED的颜色。你将可以使用串口发送字符串“5,220,70”到Arduino改变LED灯。

硬件需要:
:Arduino
: 面包板
: 连接线
:普通共阳极RGB LED
: 三个220欧姆 电阻

图片制作使用Fritzing.更多的电路范例,请看Fritzing prjoect page;

你将需要5根线连接上述电路。连接一根红线到面包板上的竖直行。连接另一端end 至 5V端口到你的Arduino.

将RGB灯放置在你的面包板上。核对你的RGB LED 数据表的脚接到正确的端口上。接上电源,将它连接在RGB的阳极上,你将得到一个普通的共阳的LED。

用剩余的电线,连接(RGB)红色阴极至数字端口3,连接(RGB)绿色阴极至数字端口5,连接(RGB)蓝色阴极至数字端口7。

RGB LED使用一个普通的阳极共享为一个阳极。轮替打开照亮LED,你需要将针脚的电平置为低,创建不同的电压通过二极管。这通过analogWrite()发送255将LED关闭,与此同时0 将它达到最亮。在以下的代码,你将非正式的使用一点数学,所以你能发送数值达到你预期的亮度。本来,代替使用analogWrite(pin,brightness),你将呼叫analogWrite(pin,255-brightness);

Code
你将首先设置一些全局变量将要为RGB连接的引脚。这将更容易区分,哪个是红色,绿色,蓝色,在主程序之中。
const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;

在你的setup(),开始串口输出设置为9600。
同样在setup()中,你想配置哪些引脚作为输出模式。
pinMode(redPin, OUTPUT);\\ pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);

在loop()程序段之中,检查那里有没有串口的缓存数据。通过while()声明的,它将运行如果那里有信息等待被读。
while (Serial.available() > 0) {
下一步,声明一些本地变量存储串口信息。这将是LED的亮度值。
使用Serial.parseInt()分离数据用逗号,读取信息到你的变量。

int red = Serial.parseInt();\\ int green = Serial.parseInt();
int blue = Serial.parseInt();

一旦你已经读取数据到你的变量,继续检查新的一行字符:
if (Serial.read() == '\n') {
使用constrain(),你能保持数值在一个可接受的PWM控制器范围。这个方法,如果数值超过了PWM能够发送的范围,它将限制在一个有效的数字。用255减去这个值,你将以格式化的数值使用一个共阳LED。如上说明,这些发光LED将照亮当那里存在一个电压差在阳极与连接到Arduino的引脚之间。

red = 255 - constrain(red, 0, 255);
green = 255 - constrain(green, 0, 255);
blue = 255 - constrain(blue, 0, 255);

现在你已经格式化了数值为了PWM,使用analogWrite()函数改变LED的颜色。因为你在上一步中用255减去了数值:

analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);

发送每一个LED的数值在串口监视器,以十六进制形式输出一个字符串:
Serial.print(red, HEX);
Serial.print(green, HEX);
Serial.println(blue, HEX);

最后,用}字符封闭那些字段比如声明,while ,main loop函数:

一旦你调试好了Arduino程序,打开你的串口监视器。核实你已经选择发送一行新字符当正在发送一个消息。键入数字0至255之间的数值以下面的格式:红,绿,蓝。
一旦你已经发送了数值到Arduino,连接上的LED将改变到你指定的颜色,和你将接收十六进制值在串口监视器。
/*
  Reading a serial ASCII-encoded string.

This sketch demonstrates the Serial parseInt() function.
It looks for an ASCII string of comma-separated values.
It parses them into ints, and uses those to fade an RGB LED.

Circuit: Common-anode RGB LED wired like so:
* Red cathode: digital pin 3
* Green cathode: digital pin 5
* blue cathode: digital pin 6
* anode: +5V

created 13 Apr 2012
by Tom Igoe

This example code is in the public domain.
*/

// 定义RGB的针脚:
const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;

void setup() {
  // 初始化
  Serial.begin(9600);
  //设置RGB LED输出模式
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);

}

void loop() {
//如果那里串口活动,读取它

  while (Serial.available() > 0) {

    //查找它的值在串口输入值中
int red = Serial.parseInt();
    // 继续这样做
    int green = Serial.parseInt();
    //继续这样做
    int blue = Serial.parseInt();

//查找新的一行。
//在你的一行结束之后
       if (Serial.read() == '\n') {
     //将数值限制在0-255这个范围之内 并使之反转
//如果你用的一个共阳RGB,可以使”Constrain(color,0,255);”   
  red = 255 - constrain(red, 0, 255);
      green = 255 - constrain(green, 0, 255);
      blue = 255 - constrain(blue, 0, 255);

      // fade the red, green, and blue legs of the LED:
      analogWrite(redPin, red);
      analogWrite(greenPin, green);
      analogWrite(bluePin, blue);

     //打印那三个数值以十六进制在一个字符串
      Serial.print(red, HEX);
      Serial.print(green, HEX);
      Serial.println(blue, HEX);
    }
  }
}

后记:串口输入最好输入三个数字 比如 100  0 150 之类,如果乱输入字符,很可能看不到效果哦。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-8-6 13:11:03 | 显示全部楼层
@弘毅 这个不是应该放在wiki么?
回复 支持 反对

使用道具 举报

发表于 2015-1-24 14:39:59 | 显示全部楼层
我在学这个例子的时候,发送字符后没有反应,彩色的LED灯也一直亮着没变过,请问是什么原因呢?
回复 支持 反对

使用道具 举报

发表于 2015-3-8 21:24:58 | 显示全部楼层
容易出错的是 这句   if (Serial.read() == '\n')

我改成   if (Serial.read() == ',') 调试正常
不知道\n是哪个按键
回复 支持 反对

使用道具 举报

发表于 2015-3-9 09:15:24 | 显示全部楼层
li23108 发表于 2015-3-8 21:24
容易出错的是 这句   if (Serial.read() == '\n')

我改成   if (Serial.read() == ',') 调试正常

\n 是回车   
回复 支持 反对

使用道具 举报

发表于 2015-3-10 23:01:43 | 显示全部楼层
mylemonjuice 发表于 2015-3-9 09:15
\n 是回车

自带的串口工具输入回车内容就发出去了,用什么方法输入\n呢
回复 支持 反对

使用道具 举报

发表于 2015-11-9 13:14:52 | 显示全部楼层
果然改成“,”就好了,之前在串口助手里面加了回车也不行呢?难道发的是/r/n?
回复 支持 反对

使用道具 举报

发表于 2015-12-30 13:21:42 | 显示全部楼层
不错这个示例验证好了。以后可以使用。
回复 支持 反对

使用道具 举报

发表于 2015-12-30 13:42:16 | 显示全部楼层
容易出错的是 这句   if (Serial.read() == '\n')

我改成   if (Serial.read() == ',') 调试正常
不知道\n是哪个按键

这是正解。验证成功
回复 支持 反对

使用道具 举报

发表于 2016-6-28 16:23:40 | 显示全部楼层
我在digital pin 3,5,6上分别接了一个LED灯,发现如果在串口输入3 个数字,只有digital pin 6上的LED有反应,它的亮度对应的是输入的第二个数字。请教各位这是什么情况?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 23:09 , Processed in 0.062902 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表