极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13911|回复: 3

串口控制RGB LED 调光

[复制链接]
发表于 2018-6-25 16:58:17 | 显示全部楼层 |阅读模式
效果是在串口输入数据如B123 可以令RGB LED 按照信息调节颜色

上传编译没问题但输入数据后灯没有亮
本人用的是Arduino LEONARDO

请大神们有空帮忙看看哪里出错了

上网也搜了很多论坛但还是没找到解决方法。



[kenrobot_code]int i;
String inputString = "";
char LED = ' ';
boolean stringComplete = false;

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
    if(stringComplete)
  {
    if(LED == 'A'){
     analogWrite(9,i);
    }
    else if(LED == 'B'){
     analogWrite(10,i);
    }
    else if(LED == 'C'){
      analogWrite(11,i);
    }
    stringComplete = false;
    inputString = "";
    LED =' ';
  }
}

void serialEvent(){
    while(Serial.available()){
    char inChar = Serial.read();
    if (isDigit(inChar)){
      inputString += inChar;
    }
    else if(inChar == '\n'){
      stringComplete = true;
      i = inputString.toInt();
    }
    else LED = inChar;
}
}[/kenrobot_code]
回复

使用道具 举报

发表于 2018-6-25 18:40:29 | 显示全部楼层
本帖最后由 kirbyklein 于 2018-6-25 18:43 编辑

你好,你的serialEvent()里面应该这么写
  1. if (isDigit(inChar)){
  2.       inputString += inChar;
  3.     }
  4.     else if(inChar == '\n' || inChar == '\t'){
  5.         if(inChar == '\t');  // do nothing
  6.         else{
  7.                 stringComplete = true;
  8.                       i = inputString.toInt();
  9.         }
  10.       
  11.     }
  12.     else LED = inChar;
复制代码

因为串口发送如果你选了LF+CR,这里有回车和换行两个char,所以按照你的条件的话,虽然'\n'你检测到了,而最后那个'\t'会到最后一个else从而执行了LED = ‘\t’,所以你的loop里面LED变量永远是'\t'而不是你预期的那个‘B’
回复 支持 反对

使用道具 举报

发表于 2018-6-26 09:31:55 | 显示全部楼层
本帖最后由 Super169 于 2018-6-26 09:33 编辑

如樓上說, LED 將會是  '\n' 之前的一個 byte, 那要看傳過來的協定, '\n' 之前會否有其他東西, 比如結尾為 '\r\n' 的, 就會出錯了.  簡單的做法, 只針對自己需要的 char 才放進 LED 會比較好.  你的情況, 有多個不同的值, 用 switch (inChar) 就可以了.

其次, 在 interrupt 會更新的 single byte variable, 應該加上 volatile, 表示每次都要重新讀取.
例如:  
volatile char LED = ' ';
雖然你這個程式中, 可能不介意使用了未更新的值, 但這是一個好習慣.
對你將來寫 ISR 會有幫助的.

此外, 你的情況, 是否有需要用 serialEvent, 由於我沒用過 Leonardo, 因為它的 serial 有點不同, 不太肯定.  
一般情況下, 除非你有很大量的數據要接收, 或有什麼急於特別處理, 否則直接在 loop 之內讀取 serial 的數據就可以了.
回复 支持 反对

使用道具 举报

发表于 2018-6-28 22:59:20 | 显示全部楼层
Serial.begin(9600  这句有问题
这个板子 serial 后面加个1
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-28 20:02 , Processed in 0.045729 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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