Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Troubleshooting
  3. Close but no cigar . . .

Close but no cigar . . .

Scheduled Pinned Locked Moved Troubleshooting
8 Posts 2 Posters 3.0k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • B Offline
    B Offline
    Baran
    wrote on last edited by
    #1

    Greetings,

    I have made a variation of the Serial Gateway and I have inserted the following in the void serial.Event Loop:

    void serialEvent() {
    while (Serial.available()) {

     //  look for the next valid integer in the incoming serial stream - this is  the node:
    int node = Serial.parseInt(); 
    // do it again, but throw it away:
    int w = Serial.parseInt(); 
    // do it again, but throw it away:
    int x = Serial.parseInt(); 
    // do it again, but throw it away:    
    int y = Serial.parseInt(); 
    // do it again, this is the Payload:
    int z = Serial.parseInt(); 
    // do it again, this is the current reading:
    int current = Serial.parseInt();
    
      // print the node and payload
      Serial.print("    The Node is :");
      Serial.print(node);
      Serial.print("    The Command is :");
      Serial.print(z);
      Serial.print("    The Payload is :");
      Serial.println(current);
    }   
    

    }

    I am certain that someone with programming knowledge will immediately see my problem. My payload can be up to four digits long, yet the above process seems to only grab the last byte of the 1 to 4-digit (depending on the analog value) number that is the payload. Can someone show me how to tweak the last Serial.parseInt() statement into something that captures the entire payload? I also see how the same thing will occur when I have more than 10 nodes (0-9).

    Appreciatively - Baran

    1 Reply Last reply
    0
    • BulldogLowellB Offline
      BulldogLowellB Offline
      BulldogLowell
      Contest Winner
      wrote on last edited by
      #2

      so, are you trying to blow up the existing MySensors parsing and create a whole new method?

      if so have a look at the parseAndSend( ) function in MyGateway.h. You may be able to just handle the message the way your want, or just use the parsing in the function and decide on another way to handle the payload you are sending based on modifying the code that handles that position.

      void MyGateway::parseAndSend(char *commandBuffer) {
        boolean ok = false;
        char *str, *p, *value=NULL;
        uint8_t bvalue[MAX_PAYLOAD];
        uint8_t blen = 0;
        int i = 0;
        uint16_t destination = 0;
        uint8_t sensor = 0;
        uint8_t command = 0;
        uint8_t type = 0;
        uint8_t ack = 0;
      
        // Extract command data coming on serial line
        for (str = strtok_r(commandBuffer, ";", &p);       // split using semicolon
        		str && i < 6;         // loop while str is not null an max 5 times
        		str = strtok_r(NULL, ";", &p)               // get subsequent tokens
      				) {
      	switch (i) {
      	  case 0: // Radioid (destination)
      	 	destination = atoi(str);
      		break;
      	  case 1: // Childid
      		sensor = atoi(str);
      		break;
      	  case 2: // Message type
      		command = atoi(str);
      		break;
      	  case 3: // Should we request ack from destination?
      		ack = atoi(str);
      		break;
      	  case 4: // Data type
      		type = atoi(str);
      		break;
      	  case 5: // Variable value
      		if (command == C_STREAM) {
      			blen = 0;
      			uint8_t val;
      			while (*str) {
      				val = h2i(*str++) << 4;
      				val += h2i(*str++);
      				bvalue[blen] = val;
      				blen++;
      			}
      		} else {
      			value = str;
      			// Remove ending carriage return character (if it exists)
      			uint8_t lastCharacter = strlen(value)-1;
      			if (value[lastCharacter] == '\r')
      				value[lastCharacter] = 0;
      		}
      		break;
      	  }
      	  i++;
        }
      
      1 Reply Last reply
      0
      • B Offline
        B Offline
        Baran
        wrote on last edited by
        #3

        I would really rather not re-invent this wheel . . . I just might get run over. If there is a better (read: already known) method for isolating the node ID and the payload, I would really appreciate it if you could point me in th right direction. If you know where such an example may be found, I would love to see it. I said, when I hit node 11, I am going to experience this problem at th beginning, as well as the end of the string of data.

        Thanks Again - Baran

        1 Reply Last reply
        0
        • B Offline
          B Offline
          Baran
          wrote on last edited by
          #4

          Hi Again Bulldog,

          For whatever reason, your code example did not show before I wrote that last post. Thank you for the clarity that you have brought, as well as your patience. This example, along with the radically different approach that you suggested in Troubleshooting, gives me plenty to chew on.

          Respectfully - Baran

          1 Reply Last reply
          0
          • B Offline
            B Offline
            Baran
            wrote on last edited by
            #5

            Hi Bulldog,

            I hope you see this post. I like the way that you incorporated the switch statement into this example but I cannot quite get it to compile. I have included myGateway and mySensor libraries but I still have an error compiling and the error code (in red) looks like this:

            MySensors\MyGateway.cpp.o: In function MyGateway::parseAndSend(char*)': C:\Users\Baran\Documents\Arduino\libraries\MySensors/MyGateway.cpp:128: multiple definition of MyGateway::parseAndSend(char*)'
            sketch_may20a.cpp.o:C:\Program Files (x86)\Arduino/sketch_may20a.ino:6: first defined here
            core.a(main.cpp.o): In function main': C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/main.cpp:40: undefined reference to setup'
            C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/main.cpp:43: undefined reference to `loop'

            • list item

            If this makes any sense to you (or anyone) and you can tell me what I am forgetting in order to successfully compile (not necessarily run) this portion of code (given by Bulldog above), please enlighten me.

            Respectfully - Baran

            1 Reply Last reply
            0
            • BulldogLowellB Offline
              BulldogLowellB Offline
              BulldogLowell
              Contest Winner
              wrote on last edited by
              #6

              The function exists already in the libraries used by MySensors.

              Post your entire sketch and let's have a look.

              1 Reply Last reply
              0
              • B Offline
                B Offline
                Baran
                wrote on last edited by
                #7

                Good Day Bulldog,

                The code I used is the example you gave two days ago. Perhaps it needs some supporting code to actually operate but I was unable to even get it to compile. I have all the basic libraries in place so I am at a lose as to why I cannot compile the code you submitted. Any suggestions?

                Respectfully - Baran

                BulldogLowellB 1 Reply Last reply
                0
                • B Baran

                  Good Day Bulldog,

                  The code I used is the example you gave two days ago. Perhaps it needs some supporting code to actually operate but I was unable to even get it to compile. I have all the basic libraries in place so I am at a lose as to why I cannot compile the code you submitted. Any suggestions?

                  Respectfully - Baran

                  BulldogLowellB Offline
                  BulldogLowellB Offline
                  BulldogLowell
                  Contest Winner
                  wrote on last edited by
                  #8

                  @Baran

                  because the function exists in the MySensors library, you are likely having a conflict with the names.

                  Post your entire sketch, then we can comment. I posted a function, not an entire sketch.

                  1 Reply Last reply
                  0
                  Reply
                  • Reply as topic
                  Log in to reply
                  • Oldest to Newest
                  • Newest to Oldest
                  • Most Votes


                  13

                  Online

                  11.7k

                  Users

                  11.2k

                  Topics

                  113.1k

                  Posts


                  Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                  • Login

                  • Don't have an account? Register

                  • Login or register to search.
                  • First post
                    Last post
                  0
                  • MySensors
                  • OpenHardware.io
                  • Categories
                  • Recent
                  • Tags
                  • Popular