nikoava 发表于 2018-6-25 16:58:17

串口控制RGB LED 调光

效果是在串口输入数据如B123 可以令RGB LED 按照信息调节颜色

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

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

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



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;
}
}

kirbyklein 发表于 2018-6-25 18:40:29

本帖最后由 kirbyklein 于 2018-6-25 18:43 编辑

你好,你的serialEvent()里面应该这么写
if (isDigit(inChar)){
      inputString += inChar;
    }
    else if(inChar == '\n' || inChar == '\t'){
        if(inChar == '\t');// do nothing
        else{
                stringComplete = true;
                      i = inputString.toInt();
        }
      
    }
    else LED = inChar;
因为串口发送如果你选了LF+CR,这里有回车和换行两个char,所以按照你的条件的话,虽然'\n'你检测到了,而最后那个'\t'会到最后一个else从而执行了LED = ‘\t’,所以你的loop里面LED变量永远是'\t'而不是你预期的那个‘B’

Super169 发表于 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 的數據就可以了.

569620972 发表于 2018-6-28 22:59:20

Serial.begin(9600这句有问题
这个板子 serial 后面加个1
页: [1]
查看完整版本: 串口控制RGB LED 调光