2017-08-17 4 views
3

J'utilise un Arduino UNO pour un projet, mais je ne sais pas comment réaliser ce que je veux. Je suis aussi un débutant donc je ne sais parfois pas comment utiliser certaines fonctions pour faire ce que je veux.Envoi de plusieurs valeurs via le port série

Je veux fondamentalement envoyer 3 valeurs à travers le moniteur série tout à la fois.

La première valeur est une chaîne qui pointe vers un opérateur (A, S, M, D, P), puis je souhaite prendre deux autres valeurs. Par exemple, si je saisis 'A012556, il faut ajouter 12 et 556, ce qui me donnera 568.

Actuellement, je fais exactement cela, mais cela demande chaque entrée séparément. Par exemple, il demandera l'opérateur (je ne peux entrer les entrées que parce que je ne peux pas l'obtenir pour prendre la chaîne/caractères) d'abord, où je vais entrer 1 (devrait être A pour l'addition), puis il demande le premier nombre, puis le deuxième nombre, puis les ajoute tous les deux ensemble et sort le résultat. Cela fonctionne bien, mais ce n'est pas ce que j'essaie d'accomplir. Ci-dessus est dans la fonction de boucle actuellement, et il pointe vers la fonction ci-dessous. C'est la même chose pour soustraire/multiplier/diviser/etc.

void addition() { 

    Serial.println ("A"); 
    Serial.println ("Please enter first number in format nnn: "); 
    firstNumber = dataInput(); // Asks the user to input the first set of numbers 

    /* Message must be in format cnnnnnn 
    therefore first number must be greater than or equal to -99 and less than or equal to 999*/ 
    if (firstNumber >= -99 && firstNumber <= 999) { 
    Serial.println (firstNumber); // Prints the first set of numbers for the user to view 
    } 
    else { 
    /* If the data input does not match the format cnnnnnn then this error message will display 
     if the input is invalid the red LED will also turn on */ 
    digitalWrite(LED_RED, HIGH); 
    Serial.println ("--------------- ERROR ---------------"); 
    } 

    Serial.println ("Please enter second number in format nnn: "); 
    secondNumber = dataInput(); // Asks the user to input the second set of numbers 

    /* Message must be in format cnnnnnn 
    therefore second number must be greater than or equal to -99 and less than or equal to 999*/ 
    if (secondNumber >= -99 && secondNumber <= 999) { 
    // The LED will turn off if it was previously on because this is a valid input 
    digitalWrite(LED_RED, LOW); 
    Serial.println (secondNumber); // Prints the second set of numbers for the user to view 
    } 
    else { 
    digitalWrite(LED_RED, HIGH); 
    Serial.println ("--------------- ERROR ---------------"); 
    } 

    /* Give time for the red error LED to stay on 
    for the user to notice he/she has made an invalid input */ 
    delay(500); 
    digitalWrite(LED_RED, LOW); 

    // As this case is for addition, it will add the first and second numbers 
    value = (firstNumber + secondNumber); 

    Serial.print("Value: "); 
    // Prints the value of the two sets of numbers so that the user can see the value of their message 
    Serial.println(value); 
} 

Par conséquent, est-il possible de le faire? Ai-je besoin de quelque chose comme une sous-chaîne?

Merci d'avance, tout conseil serait apprécié.

Répondre

1

Oui, une sous-chaîne est ce dont vous avez besoin.

Heureusement, String fournit une fonction de sous-chaîne.

https://www.arduino.cc/en/Reference/StringSubstring

Code Vous pourriez regarder un peu comme ceci:

// expecting operation in for "oxxxyyy" where o is the operator, xxx, yyy operands. 

    bool ParseOperation(String& strInput, char& op, int& x, int& y) 
    { 
     if (strInput.length() != 7) 
      return false; 

     op = strInput[0]; 
     x = atoi(strInput.substring(1, 4).c_str()); 
     y = atoi(strInput.substring(4).c_str()); 
     return true; 
    } 

    // call as: 

    void loop() 
    { 
     String str; 
     char op; 
     int r, x, y; 

     // read user input into str... 

     if (ParseOperation(str, op, x, y)) 
     { 
      switch(op) 
      { 
      case 'A': case 'a': 
       op = '+'; 
       r = x + y; 
       break; 

      // etc... 

      default: 
       // print some error message... 
       break; 
      } 
      // print x op y = r 
     } 
     else 
     { 
      // print error message... 
     } 
    } 
1
#include <string.h> 
#include <SoftwareSerial.h> 

#define RX_TIMEOUT = 5000; // wait until 5 second 

void initSerial() { 
    Serial.begin(9600); 
    while (!Serial) { 
    ; // wait for serial port to connect 
    } 
} 

int hex2int(char *hexStr) { 
    int v = 0; 
    while (*hexStr) { 
     char c = *hexStr++; 

     if (c >= '0' && c <= '9') c = c - '0'; 
     else if (c >= 'a' && c <='f') c = c - 'a' + 10; 
     else if (c >= 'A' && c <='F') c = c - 'A' + 10;  

     v = (v << 4) | (c & 0xF); 
    } 
    return v; 
} 

int main(){ 
    char data[128]; 

    initSerial(); 

    while (1) { 
      // operator A 
      // value1 ranges = 0x0000 - 0xFFFF (hex 2 bytes); 
      // value2 ranges = 0x0000 - 0xFFFF (hex 2 bytes); 
      // 
      // value1 = 10 (decimal) = 00 0A (hex 2 bytes) 
      // value2 = 20 (decimal) = 00 14 (hex 2 bytes) 
      // A 00 0A 00 14 
      Serial.println ("Enter A000A0014"); 

      unsigned long startTime = millis(); 
      int i = 0; 
      do { 
      int length = Serial.available(); 
      if(length > 0) { 
       if(i >= 128) { 
        break; 
       } 
       data[i++] = Serial.read(); 
      } 
      } while (millis() - startTime < RX_TIMEOUT);    
      data[i] = '\0'; 

      if(data[0]== '\0') { 
      Serial.println ("Time out.., try again!"); 
      continue; 
      } 

      char c1[2], c2[2]; 
      int v1, v2, v3; 

      memcpy(c1, &data[1], 2); // data[1], data[2] 
      v1 = hex2int(c1); 

      memcpy(c2, &data[3], 2); // data[3], data[4] 
      v2 = hex2int(c2); 

      switch(data[0]){ 
      case 'A':     
       v3 = v1 + v2; 
       Serial.write(v3); 
       break; 

      case 'S':     
       v3 = v1 - v2; 
       Serial.write(v3); 
       break; 

      case 'M': 
       v3 = v1 * v2; 
       Serial.write(v3); 
       break; 

      case 'D': 
       v3 = v1/v2; 
       Serial.write(v3); 
       break; 

      case 'P': 
       // todo 
       break; 

      default: 
       // else 
       break; 
      } 
    } 
    return 0; 
}