SDS100/SDS200: A first pass at figuring out and documenting the sub-processor

Status
Not open for further replies.

rbn_rr

Member
Joined
Feb 7, 2015
Messages
41
I've been playing with the SDS100 Sub-Processor (via the USB1 MicroUSB port), and although I've not found a way to make toast or to solve mysteries outside the SDS100, I've learned just a bit about what's going on inside the SDS100. I mentioned in another thread several days ago that I'd post more after I've had a chance to experiment a bit more, to this thread is that "more" for now.

I've attached a PDF with brief information about each of the single-digit commands. I've started to look at the data streams returned by several lowercase commands, but other than some interesting and inconclusive realtime visualisations I don't have much insight into that data yet. Do you? Share!

I've also attached the results of the sieve I wrote to test out all character values from 00 -- FF (0-255). No surprises, no "hidden" non-printable ASCII commands unless the firmware has some sort of knock protocol -- responding to specific *second* characters after a specific *first* character is sent...or unless there are evil commands that "do something" but don't ACK.

The stuff to the right of the "found" lines is all the characters between the last "found" and the next "found" that didn't get a response from the SDS100.

I'm hoping those of you who are feeling a bit adventurous will play around with the sub-processor and help to dig deeper into what's going on inside the SDS100!

If there's sufficient interest, I'll post some code (Java via Processing, and/or Python w/PySerial) to help folks get started.

-rbn

Oh, by the way...I noticed the SDS100 audio would get pretty choppy when I was pulling data & plotting it realtime...not sure if this was RFI getting into the radio from a noisy MicroUSB cable with no ferrite in sight, or something else. I'm hoping that's what it was. and not anything internal to the radio.


Code:
sent '!' char value 33, got 58 bytes back.   "
sent '#' char value 35, got 19 bytes back.   
sent '$' char value 36, got 66 bytes back.   %&'
sent '(' char value 40, got 13 bytes back.   
sent ')' char value 41, got 13 bytes back.   
sent '*' char value 42, got 12 bytes back.   +,
sent '-' char value 45, got 384 bytes back.   
sent '.' char value 46, got 319 bytes back.   
sent '/' char value 47, got 13 bytes back.   0123456789:;<=>
sent '?' char value 63, got 55 bytes back.   
sent '@' char value 64, got 18 bytes back.   ABCDEFGHIJKL
sent 'M' char value 77, got 11 bytes back.   NOPQRST
sent 'U' char value 85, got 9 bytes back.   
sent 'V' char value 86, got 17 bytes back.   WXYZ[\]
sent '^' char value 94, got 12 bytes back.   _`abc
sent 'd' char value 100, got 2923 bytes back.   efg
sent 'h' char value 104, got 1156 bytes back.   ijk
sent 'l' char value 108, got 1092 bytes back.   
sent 'm' char value 109, got 1457 bytes back.   n
sent 'o' char value 111, got 1281 bytes back.   p
sent 'q' char value 113, got 694 bytes back.   
sent 'r' char value 114, got 6862 bytes back.   stuv
sent 'w' char value 119, got 707 bytes back.   xy
sent 'z' char value 122, got 932 bytes back.   {|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ*¡¢£¤¥¦§¨©ª«¬*®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
All Done!

Here's the code that generated the above list of valid/invalid command characters:
Code:
{
  println("Checking to see if the port is empty...");
  delay(1000);
  while(myPort.available()>0)      // There shouldn't be any crufty data in the buffer... but why not check anyway?
  {
    myPort.readChar();
    print(".");    // Show some activity while we slowly and inefficiently flush the buffer
  }
  println();

  for(int i = 0; i < 256; ++i)
  {
    char char_cmd = char(i);
    myPort.write(char_cmd);    // Send one character to the SDS100 Sub-Processor
    delay(500);                         // ...and wait half a second to avoid any USB/serial pokiness
    int chars_back = 0;
    while(myPort.available() > 0)  // We've got some data from the SDS100
    {
      myPort.readChar();              // ...so extract it (again, as inefficiently as possible!)
      ++chars_back;                     // ...and keep track of how much data we get
    }
    if(chars_back > 0)                 // If we got at least one byte of data in responce, the SDS100 liked this command
    {
      println();
      print("sent '" + char_cmd+"' char value "+i+", got "+chars_back+" bytes back.   ");
    }
    else print(char_cmd);     // Another non-command for the right-column trash heap :-)
  }
  println();
  println("All Done!");
}
 

Attachments

  • SDS100 Sub-Processor Diggin' (rbn_rr).pdf
    204.3 KB · Views: 140
Status
Not open for further replies.
Top