   } else if (settings.mode == 'T') {
     // Read up to the full length of text, or until a null terminator.
     // Less error handling here; we don't really care what we get.
-    byte bytesRead = Serial.readBytesUntil('\0', text, sizeof(text));
+    byte bytesRead = STREAM.readBytesUntil('\0', text, sizeof(text));
     if (bytesRead) {
       if (bytesRead < sizeof(text)) {
         for (byte i = bytesRead; i < sizeof(text); i++) {

  }

  SavedSettings previous = settings;
  if (!Serial.readBytes((byte*)&settings, min(sizeof(settings), len))) {
    Serial.println(F("failed to read len bytes"));
    settings = previous;
    return;
  }


void sendSeparately(byte* buf, int len) {
  // Flush any existing sending,
  STREAM.flush();
  // wait a while for that to go through,
  delay(100);
  // and send what should be a new blob.
  STREAM.write(buf, len);
}

void flushSerialIn() {
  while (STREAM.available() > 0) {
    STREAM.read();
  }
}

void checkSerial() {
  // No serial to consume; stop.
  if (!STREAM.available()) {
    return;
  }
  if (!STREAM.find("!")) {
#if DEBUG    
    Serial.println(F("no !"));
#endif
    flushSerialIn();
    return;
  }
  //Serial.println("found !");
  byte len;
  if (!STREAM.readBytes(&len, 1)) {
#if DEBUG
    Serial.println(F("no len"));
#endif
    flushSerialIn();
  }
  if (!len) {
    // Special case: no length means primary is asking a question.
    byte question;
    if (!STREAM.readBytes(&question, 1)) {
#if DEBUG
      Serial.println(F("no question"));
#endif
      flushSerialIn();
    } else {
      if (question == 'D') {
        // Send dimensions.
