преобразование типов данных
- Войдите на сайт для отправки комментариев
Здравствуйте. Помогите пожалуйста разобраться с преобразованием/приведением типов данных. Это я так думаю, что проблема в этом.
Итак: 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?
А Вы в логе сервера посмотрите какой запрос пришёл, сразу понятно станет.
В логе сервера в первом варианте приходит мусор. И ниразу понятнее не стало
а вот нормальная строка лога
Уже думаю может памяти нехватает, поэтому и мусор лезет.
Диагностический вывод в сериал в 5 и 12 строке - идентичны.
Может кто пользовал enc28j60 с нано и имеет опыт работы клиента, поделитесь кодом. Нужно "всего-лиш" выполнить GET запрос в статической сети, ответ сервера сохранять/обрабатывать ненужно.
В логе сервера в первом варианте приходит мусор.
Ну, вот и отлично. Теперь Вы знаете, что посылает Ваша программа и можете, внося исправления, контролировать процесс.
И ниразу понятнее не стало
Ну, не знаю, что Вам ещё нужно. Вы локализовали ошибку. Осталось её исправить. Всё стало понятнее, просто сядьте и подумайте. Если надо, поставьте ещё печати в скетче.
Благодарю Евгений, за то, что пытаетесь помочь. Да контролировать можно, но насчёт локализации незнаю.
Я уже говорил, что в первом примере тестовый вывод даёт одинаковые результаты в терминале. А на сервере получается мусор. Возможно данные портятся в недрах библиотеки EthernetCard.h. Во всяком случае результат не стабилен во времени, даже для одной версии прошивки.
Для начала, я хотел узнать правильно ли я делаю конвертацию из String в массив char?
Далее проследить работу библиотеки уже сложно. При вызове функции библиотеки
Функия my_callback, просто выводит в терминал содержимое буфера обьекта ether. И в случае неправильной работы, мне кажется, ответ сервера не помещается туда. my_callback начинает выводить тоже мусор.
Я знаю что "официальной" версии библиотеки для этого железа нет. Но может кто-то находил стабильно работающую библиотеку?