Advertisement
chemicalvamp

Serial Commanded Arduino

Jun 1st, 2020
1,303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.25 KB | None | 0 0
  1. #include <WString.h>
  2.  
  3. #define MSG_METHOD_SUCCESS 0                      //Code which is used when an operation terminated  successfully
  4. #define WRG_NO_SERIAL_DATA_AVAILABLE 250            //Code indicates that no new data is AVAILABLE at the serial input buffer
  5. #define ERR_SERIAL_IN_COMMAND_NOT_TERMINATED -1   //Code is used when a serial input commands' last char is not a '#'
  6.  
  7. const String StartTX = "\x02";
  8. const String ResumeTX = "$";
  9. const String EndTX = "\x03";
  10.  
  11. String self = "1A"; // Just a sort of mode select, or listener group perhaps.
  12.  
  13. char charBuf[12] = {0};
  14. char message1FromPC[4];
  15. char message2FromPC[4];
  16. char message3FromPC[4];
  17. //String messages[5] = {0};
  18. int integerFromPC = 0;
  19. float floatFromPC = 0.0;
  20.  
  21. void setup()
  22. {
  23.   pinMode(LED_BUILTIN, OUTPUT);
  24.   Serial.begin(115200);
  25. }
  26.  
  27. void loop()
  28. {
  29.   String command = "";  //Used to store the latest received command
  30.   int serialResult = 0; //return value for reading operation method on serial in put buffer
  31.   serialResult = readSerialInputCommand(&command);
  32.  
  33.   if(serialResult == MSG_METHOD_SUCCESS)
  34.   {
  35.     command.toCharArray(charBuf, 32);
  36.     parseData();
  37.     useParsedData();
  38.   }
  39.   if(self == "1A")
  40.   {
  41.     if(serialResult == WRG_NO_SERIAL_DATA_AVAILABLE)
  42.     {//If there is no data AVAILABLE at the serial port, let the LED blink
  43.       digitalWrite(LED_BUILTIN, HIGH);
  44.       delay(750);
  45.       digitalWrite(LED_BUILTIN, LOW);
  46.       delay(750);
  47.     }
  48.     else
  49.     {
  50.       if(serialResult == ERR_SERIAL_IN_COMMAND_NOT_TERMINATED)
  51.       {//If the command format was invalid, the led is turned off for two seconds
  52.         digitalWrite(LED_BUILTIN, LOW);
  53.         delay(2000);
  54.       }
  55.     }
  56.   }
  57.   else if (self == "1B");
  58.     digitalWrite(LED_BUILTIN, LOW);
  59. }
  60.  
  61. void parseData()
  62. {
  63.     char * strtokIndx; // this is used by strtok() as an index
  64.     strtokIndx = strtok(charBuf, " ");      // get the first part - the string
  65.     strcpy(message1FromPC, strtokIndx); // copy it to messageFromPC
  66.  
  67.     strtokIndx = strtok(NULL, " "); // this continues where the previous call left off
  68.     strcpy(message2FromPC, strtokIndx); // copy it to messageFromPC
  69.  
  70.     strtokIndx = strtok(NULL, "#");
  71.     strcpy(message3FromPC, strtokIndx); // copy it to messageFromPC
  72.     //floatFromPC = atof(strtokIndx);     // convert this part to a float
  73.     //integerFromPC = atoi(strtokIndx);     // convert this part to an integer
  74. }
  75. void useParsedData() //GO 111 222#
  76. {
  77.   Serial.println("Yes.");
  78.   Serial.println(message1FromPC);
  79.   Serial.println(message2FromPC);
  80.   Serial.println(message3FromPC);
  81.  
  82.   if (strcmp(message1FromPC,"GO")==0){
  83.     Serial.println("GO command.");
  84.     int moveX = message2FromPC;
  85.     int moveY = message3FromPC;
  86.     Serial.println(moveX+" "+moveY);
  87.   }
  88. }
  89.  
  90. int readSerialInputCommand(String *command)
  91. {
  92.   int operationStatus = MSG_METHOD_SUCCESS;                //Default return is MSG_METHOD_SUCCESS reading data from com buffer.
  93.  
  94.   if (Serial.available())                                  //check if serial data is available for reading
  95.   {
  96.      char serialInByte;                                    //temporary variable to hold the last serial input buffer character
  97.      do
  98.      {                                                     //Read serial input buffer data byte by byte
  99.        serialInByte = Serial.read();
  100.        *command = *command + serialInByte;                 //Add last read serial input buffer byte to *command pointer
  101.      } while(serialInByte != '#' && Serial.available());   //until '#' comes up or no serial data is available anymore
  102.      
  103.      if(serialInByte != '#')
  104.        operationStatus = ERR_SERIAL_IN_COMMAND_NOT_TERMINATED;
  105.   }
  106.   else
  107.     operationStatus = WRG_NO_SERIAL_DATA_AVAILABLE;
  108.   return operationStatus;
  109. }
  110.  
  111. void SendOutput(String Send1)
  112. {
  113.   Serial.print(StartTX);
  114.   Serial.print(Send1);
  115.   Serial.print(EndTX);
  116. }
  117. void SendOutput(String Send1, String Send2)
  118. {
  119.   Serial.print(StartTX);
  120.   Serial.print(Send1);
  121.   Serial.print(ResumeTX);
  122.   Serial.print(Send2);
  123.   Serial.print(EndTX);
  124. }
  125. void SendOutput(String Send1, String Send2, String Send3)
  126. {
  127.   Serial.print(StartTX);
  128.   Serial.print(Send1);
  129.   Serial.print(ResumeTX);
  130.   Serial.print(Send2);
  131.   Serial.print(ResumeTX);
  132.   Serial.print(Send3);
  133.   Serial.print(EndTX);
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement