2012-01-26 27 views
2

程序監聽來自串行端口的消息的形式或者其中第一個字符(A或d)指模擬或數字的,第2個字符 - 銷,所述第三字符 - 1/0或從0到255中的標記物和<>顯示的開始和數據包的結束。Arduino的決策從串行端口接收

例如,如果接收到分組,則光被digitalWrite(13,1) 接通但沒有任何反應。例如,當我通過串行監視器發送時,燈應該閃爍,但不亮。與模擬輸出相同。

bool started = false; 
bool ended = false; 
char inData[5]; 
byte index; 


void setup() 
{ 
    Serial.begin(9600); 
} 

void loop() 
{ 
    while (Serial.available() > 0) 
    { 
    char inChar = Serial.read(); 


    if (inChar == '<') 
    { 
     index = 0; 
     started = true; 
     ended = false; 
    } 

    else if (inChar == '>') 
    { 
     ended = true; 
     break; 
    } 

    else 
    { 
     if (index <= 4) 
     { 
     inData[index] = inChar; 
     index++; 
     } 
    } 



    if (started && ended) 
    { 
     if (inData[0] == 'A') 
     { 
     pinMode(inData[2],OUTPUT); 
     analogWrite(inData[2],inData[4]); 
     } 


     else if (inData[0] == 'D') 
     { 
     if (inData[4] == 1) 
     { 
      pinMode(inData[2],OUTPUT); 
      digitalWrite(inData[2],HIGH); 
     } 

     else if (inData[4] == 0) 
     { 
      pinMode(inData[2],OUTPUT); 
      digitalWrite(inData[2],LOW); 
     } 
     } 
     started = false; 
     ended = false; 
     index = 0; 
    } 

    } 


Serial.println("Sending"); 



} 
+0

消息看起來像這樣 user1165574

回答

4

下面的代碼可以讓你用一個例子串聯繫列執行的方法:

<power,led> 

一旦處理這個字符串,它會執行下面的方法:

sendCommand(cmd, val); 

參見下面用於例如鄰f怎樣接通接通PIN LED 11

#include <avr/pgmspace.h> 

int IRledPin = 11; 

#define SOP '<' 
#define EOP '>' 

bool started = false; 
bool ended = false; 

char inData[80]; 
byte index; 

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

void loop() { 
    // Read all serial data available, as fast as possible 
    while (Serial.available() > 0) { 
    char inChar = Serial.read(); 

    if (inChar == SOP) { 
     index = 0; 
     inData[index] = '\0'; 
     started = true; 
     ended = false; 
    } else if (inChar == EOP) { 
     ended = true; 
     break; 
    } else { 
     if (index < 79) { 
     inData[index] = inChar; 
     index++; 
     inData[index] = '\0'; 
     } 
    } 
    } 

    // We are here either because all pending serial 
    // data has been read OR because an end of 
    // packet marker arrived. Which is it? 
    if (started && ended) { 
    // The end of packet marker arrived. Process the packet 
    char *cmd = strtok(inData, ","); 

    if (cmd) { 
     char *val = strtok(NULL, ","); 
     if (val) { 
      sendCommand(cmd, val); 
     } 
    } 

    // Reset for the next packet 
    started = false; 
    ended = false; 
    index = 0; 
    inData[index] = '\0'; 
    } 
} 

void sendCommand(char *command, char *value) { 
    if (strcmp(command,"power") == 0) { 
    power(value); 
    } 
} 

void power(char* value) { 
    if (strcmp(value, "led") == 0) { 
    digitalWrite(IRledPin, HIGH); 
    } 
} 
+1

完美的解決方案 – Fredrik

1

如果第2個字符是針,那麼你要inData[1]爲您的PIN碼,而不是inData[2]

+0

[0]爲d,[1]是逗號,[2]是0 – user1165574

+0

你沒有指定您正在使用逗號。 – Tim

+0

對不起。消息看起來像這樣 user1165574

1
  • 你爲什麼要從inData[0]inData[2]?第二個人物不會在inData[1]

  • 你是pinMode設置的inData[2]實際值。這意味着開啓銷13,你需要發送一個回車符('\r')。

+0

什麼在逗號,例如, user1165574

-1

代碼不會在下面運行,但它應該可以幫助您理清問題。

什麼它試圖做的是INDATA分成令牌[]數組。

它然後轉向ASCII數據與的atoi()語句整數。

希望它有幫助。

得到了分離裝置從Segmentation Fault when using strtok_r

bool started = false; 
bool ended = false; 
char inData[5]; 
byte index; 


void setup() 
{ 
    Serial.begin(9600); 
} 

void loop() 
{ 
    while (Serial.available() > 0) 
    { 
    char inChar = Serial.read(); 


    if (inChar == '<') 
    { 
     index = 0; 
     started = true; 
     ended = false; 
    } 

    else if (inChar == '>') 
    { 
     ended = true; 
     break; 
    } 

    else 
    { 
     inData[index] = inChar; 
     index++; 
    } 


    if (started && ended) 
    { 

// https://stackoverflow.com/questions/2227198/segmentation-fault-when-using-strtok-r 
// Splint up input data 
    char *p = inData; 
    char *tokens[50]; 
    int i = 0; 

    while (i < 50) { 
     tokens[i] = strtok_r(p, ",", &p); 
     if (tokens[i] == NULL) { 
     break; 
     } 
     i++; 
    } 

    if (tokens[0] == '<A') 
     { 
     pinMode(tokens[1],OUTPUT); 
     analogWrite(tokens[2],tokens[3]); 
     } 


     else if (token[0] == '<D') 
     { 
     if (atoi(token[3]) == 1) 
     { 
      pinMode(atoi(token[1]),OUTPUT); 
      digitalWrite(atoi(token[1]),HIGH); 
     } 

     else if (atoi(tokens[3]) == 0) 
     { 
      pinMode(atoi(tokens[1]),OUTPUT); 
      digitalWrite(atoi(tokens[1]),LOW); 
     } 
     } 
     started = false; 
     ended = false; 
     index = 0; 
    } 

    } 
+0

我得到消息「ISO C++禁止指針和整數之間的比較」約行「如果(令牌[0] ==‘A’) – user1165574

+0

我認爲這是錯誤的: 如果(token [0] =='