Arduino TCP Server

loker95
Offline
Зарегистрирован: 11.02.2017

Добрый день, Есть tcp сервер на arduino клиент подключается делает запрос, сервер отвечает, но отправляет ответ 3 раза. В чем может быть проблема?

EthernetClient client = server.available();
  if (client) {
    if (!alreadyConnected) {
      client.flush();
      Serial.println("We have a new client");
      alreadyConnected = true;
    }
    if (client.available() > 0) {
      char thisChar = client.read();
      //server.write("hello");
      Serial.write(thisChar);
      sensors.requestTemperatures();
      delay(10);
      Serial.print("T0=");
      Serial.println(sensors.getTempCByIndex(0));
      server.print(sensors.getTempCByIndex(0));
    }
  }

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Запрос типа "d<CR><LF>"? 

loker95
Offline
Зарегистрирован: 11.02.2017

sadman41 пишет:

Запрос типа "d<CR><LF>"? 

как? не понял?, в роле клиента у меня SocketTest v3, а сервер ардуино

sadman41
Offline
Зарегистрирован: 19.10.2016

Так разберитесь какой запрос приходит, посчитайте в нём количество байт.

loker95
Offline
Зарегистрирован: 11.02.2017

sadman41 пишет:

Так разберитесь какой запрос приходит, посчитайте в нём количество байт.

клиент отправляет "1" (байт)

sadman41
Offline
Зарегистрирован: 19.10.2016
Serial.write(thisChar);

заменить на

Serial.print("Req: 0x"); Serial.println((byte)thisChar, HEX);

и повторить прогон.

loker95
Offline
Зарегистрирован: 11.02.2017

sadman41 пишет:

Serial.write(thisChar);

заменить на

Serial.print("Req: 0x"); Serial.println((byte)thisChar, HEX);

и повторить прогон.

за "1" еще какой-то байты приходит Req: 0xD Req: 0xA

loker95
Offline
Зарегистрирован: 11.02.2017

а как можно от этого избавиться?

sadman41
Offline
Зарегистрирован: 19.10.2016

loker95 пишет:

а как можно от этого избавиться?

Это вопрос не к ардуине (она всё честно делает), а к "SocketTest v3".

Ну, и всегда можно игнорировать эти символы, либо взять пример Ethernet -> WebServer, там нарисовано, как правильно обрабатывать запросы c CRLF (\r\n).

loker95
Offline
Зарегистрирован: 11.02.2017

sadman41 пишет:

Это вопрос не к ардуине (она всё честно делает), а к "SocketTest v3".

Ну, и всегда можно игнорировать эти символы, либо взять пример Ethernet -> WebServer, там нарисовано, как правильно обрабатывать запросы c CRLF (\r\n).

спасибо за совет. Решил проблему. В делфи создал сокет ПО там все ништяк

b707
Offline
Зарегистрирован: 26.05.2017

loker95 пишет:

спасибо за совет. Решил проблему. В делфи создал сокет ПО там все ништяк

не решили, а только отвернулись от проблемы.

У вас код сервера с принципиальной ошибкой - он каждый приходящий символ обрабатывает как новый запрос. То есть этот код будет правильно работать только если длина запроса 1 байт. А это, прямо скажем, не слишком удобно

loker95
Offline
Зарегистрирован: 11.02.2017

b707 пишет:

не решили, а только отвернулись от проблемы.

У вас код сервера с принципиальной ошибкой - он каждый приходящий символ обрабатывает как новый запрос. То есть этот код будет правильно работать только если длина запроса 1 байт. А это, прямо скажем, не слишком удобно

есть другой вариант? можно ссылку или файл

b707
Offline
Зарегистрирован: 26.05.2017

loker95 пишет:

есть другой вариант?

конечно есть - не подхватываться обрабатывать каждый полученный символ, а сначала собрать их в строку и дождаться конца запроса