Arduino печатает что-то, что я не говорю, чтобы напечатать - PullRequest
0 голосов
/ 14 октября 2019

Я написал (плохо, так как это один из моих первых проектов arduino) программу, которая прослушивает порт TCP и, если получает определенные байты, отвечает.

Это работает, однако я печатаю«Живой» на последовательном мониторе, когда это произойдет. Проблема в том, что он печатает ALIVE, а затем печатает значение переменных char, которые я сравниваю.

byte responseBytes[8];

char* alive = "ABCD000000000112";
char* clientAlive = "ABCD000000000113";    
void loop() 
    {
      // if there are incoming bytes available
      // from the server, read them and print them:
      if (client.available()) {
          for (byte n = 0; n < 8; n++) {
            responseBytes[n] = client.read();
          }


          char* response = "";
          array_to_string(responseBytes, 8, response);

          if (strcasecmp(response, alive) == 0){
            Serial.println("ALIVE"); //<-- This prints ALIVE and ABCD000000000112
            client.write(clientAlive); //<-- This was added after the issue occured, it is not the issue.
          }

          for (byte n = 0; n < 8; n++) {
            responseBytes[n] = 0;
          }

      }
    }

    void array_to_string(byte array[], unsigned int len, char buffer[])
    {
        for (unsigned int i = 0; i < len; i++)
        {
            byte nib1 = (array[i] >> 4) & 0x0F;
            byte nib2 = (array[i] >> 0) & 0x0F;
            buffer[i*2+0] = nib1  < 0xA ? '0' + nib1  : 'A' + nib1  - 0xA;
            buffer[i*2+1] = nib2  < 0xA ? '0' + nib2  : 'A' + nib2  - 0xA;
        }
        buffer[len*2] = '\0';
    }

Удаление

Serial.println("ALIVE");

останавливает печать чего-либо. Не просто ЖИВЫЙ

Я в недоумении от того, что здесь происходит, черт возьми.

Выход последовательного монитора, если он актуален

ALIVE
ABCD000000000112ALIVE
ABCD000000000112ALIVE
ABCD000000000112

1 Ответ

0 голосов
/ 14 октября 2019

Вы переполняете вашу переменную response. Инициализируя его пустой строкой, вы выделяете только один байт памяти. Вы передаете его в array_to_string() и в нем хранится len*2+1 байтов в этом массиве из одного байта.

В этот момент вы записали данные за пределы конца массива, результаты которых непредсказуемы и не определены.

Вам нужно убедиться, что response достаточно большой, чтобы в нем содержалась строимая вами строка.

Поскольку вы знаете, что ответ составляет 8 байтов, это будет работать лучше:

#define RESPONSE_LENGTH 8

char response[RESPONSE_LENGTH*2+1];
array_to_string(responseBytes, RESPONSE_LENGTH, response);

Если вы измените переменные alive или clientAlive в другом месте вашего кода, они также могут оказаться уязвимыми для переполнения.

...