串口控制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: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: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 的數據就可以了. Serial.begin(9600这句有问题
这个板子 serial 后面加个1
页:
[1]