преобразование типов данных

derwesh
Offline
Зарегистрирован: 21.02.2017

Здравствуйте. Помогите пожалуйста разобраться с преобразованием/приведением типов данных. Это я так думаю, что проблема в этом.

Итак: Arduino nano в связке с ENC28J60. В домашней сети есть сервер с IP 192.168.1.100. Для передачи данных на сервер используется GET запрос к файлу post.php.

Фунция отправки данных:

byte netsend(String mes) {
    String ref="post.php?ID=";
    ref = ref + DeviceNumb+mes;
    Serial.print("STR_REQUEST = ");
    Serial.println(ref);
    Serial.print("STR_LENGTH = ");
    Serial.println(ref.length());
    char refC[ref.length() + 1];
    ref.toCharArray(refC,sizeof(refC));
    refC[ref.length()]= 0;
    Serial.print("CR_REQUEST = ");
    Serial.println((const char*)refC);
    ether.browseUrl(PSTR("/"), (const char*)refC, website, my_callback);

    uint16_t proc = ether.packetLoop(ether.packetReceive());
    while (proc>0){
    proc = ether.packetLoop(ether.packetReceive());}

    return 0;
}

Отправляется в функцию строка типа "&RTM=A28L&VAL=281.00&ST=1".

В функцию библиотеки ether.browseUrl должно посылатся  во втором параметре "post.php?post.php?ID=3&RTM=A28L&VAL=280.00&ST=1".

Сама функция обьявлена в библиотеке как:

static void browseUrl (const char *urlbuf, const char *urlbuf_varpart,
                           const char *hoststr, const char *additionalheaderline,
                           void (*callback)(uint8_t,uint16_t,uint16_t));

Указанный выше код функции даёт следующий ответ сервера:

HTTP/1.1 404 Not Found
Date: Tue, 21 Feb 2017 15:08:38 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Length: 274
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found...

А вот такой вариант возвращает правильный ответ

byte netsend(String mes) {
    String ref="post.php?ID=";
    ref = ref + DeviceNumb+mes;
    Serial.print("STR_REQUEST = ");
    Serial.println(ref);
    Serial.print("STR_LENGTH = ");
    Serial.println(ref.length());
    
   
   char refC[]="post.php?ID=3&RTM=TEST&VAL=1333";

    ether.browseUrl(PSTR("/"), (const char*)refC, website, my_callback);
     return 0;
}
HTTP/1.1 200 OK
Date: Tue, 21 Feb 2017 15:11:58 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Length: 4
Connection: close
Content-Type: text/html; charset=UTF-8


ok...

Подскажите в чём может быть проблема? Весь день сегодня убил на это....

Возможно я неправильно преобразовываю строку в char?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А Вы в логе сервера посмотрите какой запрос пришёл, сразу понятно станет.

derwesh
Offline
Зарегистрирован: 21.02.2017

В логе сервера в первом варианте приходит мусор. И ниразу понятнее не стало

192.168.1.1 - - [21/Feb/2017:21:29:33 +0200] "GET /\xf7\b\x90\b\xb0\x05\xf0\x05\x04~\b\xa7\xd7 HTTP/1.0" 404 463 "-" "-"
192.168.1.1 - - [21/Feb/2017:21:21:26 +0200] "GET /post.php?ID=3&RT\x12K\x04~\b\xa7z HTTP/1.0" 200 178 "-" "-"

а вот нормальная строка лога 

192.168.1.1 - - [21/Feb/2017:21:08:49 +0200] "GET /post.php?ID=3&RTM=A18T&VAL=26.40 HTTP/1.0" 200 170 "-" "-"

Уже думаю может памяти нехватает, поэтому и мусор лезет.

Диагностический вывод в сериал в 5 и 12 строке - идентичны.

Может кто пользовал enc28j60 с нано и имеет опыт работы клиента, поделитесь кодом. Нужно "всего-лиш" выполнить GET запрос в статической сети, ответ сервера сохранять/обрабатывать ненужно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

derwesh пишет:

В логе сервера в первом варианте приходит мусор. 

Ну, вот и отлично. Теперь Вы знаете, что посылает Ваша программа и можете, внося исправления, контролировать процесс.

derwesh пишет:

И ниразу понятнее не стало

Ну, не знаю, что Вам ещё нужно. Вы локализовали ошибку. Осталось её исправить. Всё стало понятнее, просто сядьте и подумайте. Если надо, поставьте ещё печати в скетче.

 

 

derwesh
Offline
Зарегистрирован: 21.02.2017

Благодарю Евгений, за то, что пытаетесь помочь. Да контролировать можно, но насчёт локализации незнаю.

Я уже говорил, что в первом примере тестовый вывод даёт одинаковые результаты в терминале. А на сервере получается мусор. Возможно данные портятся в недрах библиотеки EthernetCard.h. Во всяком случае результат не стабилен во времени, даже для одной версии прошивки.

Для начала, я хотел узнать правильно ли я делаю конвертацию из String в массив char?

Далее проследить работу библиотеки уже сложно. При вызове функции библиотеки 

ether.browseUrl(PSTR("/"), (const char*)refC, website, my_callback);

Функия my_callback, просто выводит в терминал содержимое буфера обьекта ether. И в случае неправильной работы, мне кажется, ответ сервера не помещается туда. my_callback начинает выводить тоже мусор.

Я знаю что "официальной" версии библиотеки для этого железа нет. Но может кто-то находил стабильно работающую библиотеку?