• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Получение данных от MAX3232

Vova2407

New member
Всем привет. Работаю с модулем ESP201. Уже не знаю, что попробовать, или не вижу возможной явной ошибки, потому обращаюсь сюда.

Дано:

Необходимо использовать этот модуль как WIFI передатчик с последовательного порта (RS232). На RS232 находится устройство (условно черный ящик), который отправляет команды. Например, при включении от него приходит команда 64, означающая готовность. Уровни напряжения от черного ящика +-6 В (по документации. Осциллографа нет, проверить не могу). Понижаю до нужных для esp201 3.3v с помощью преобразователя на мс MAX3232 с нужной обвязкой (взял готовый в магазине). Далее данные через GET запрос отправляются на локальный веб сервер(поднят на Denwer), где php скрипт записывает их в txt файл.

Проблема: в txt файле на локальном сервере при включении черного ящика вместо 64 записывается символ �.

Что и как подключено: TX(чёрн. ящик) > RX(MAX3232), TX (MAX3232) > RX(ESP201). GND везде общая. Питание ESP201 и преобразователя MAX3232 - от отдельного источника питания 3.3v. GPIO15 - GND. CH_PD к 3.3v.

Проверял отдельно составные узлы всего этого дела:

1) Чёрный ящик > max3232 > магазинный com-usbшнурок > ПК с программой Terminal-1.9b-RS232. При включении черного ящика в терминал приходит нужная команда 64. Делаю вывод, что модуль на max3232 исправен.

2) ПК с Arduino ide и монитором порта > usb-ttl 3.3v> esp201 >(по вай фай) ПК с локальным веб-сервером. Всё работает. Приходит всё, что я вбиваю в мониторе порта. Запись в txt файл происходит исправно.

3) Вместо max3232 ставил st3232 на модуль. Всё то же самое. Разницы никакой.

ESP201 прошит через ArduinoIDE. Код:
Код:
#include <ESP8266WiFi.h>


const char* ssid  = "ESPESPESP";

const char* password = "VOVAVOVA";

char val[12];

const char* host = "192.168.1.1";

const char* streamId  = "catcher.php";

const char* privateKey = "?request=";



IPAddress ip(192, 168, 1, 3); //Node static IP

IPAddress gateway(192, 168, 1, 1);

IPAddress subnet(255, 255, 255, 0);


void setup() {

  Serial.begin(115200);

  delay(10);

  Serial.println();

  Serial.println();

  Serial.print("Connecting to ");

  Serial.println(ssid);


  WiFi.begin(ssid, password);

  WiFi.config(ip, gateway, subnet);

  while (WiFi.status() != WL_CONNECTED) {

  delay(500);

  Serial.print(".");

  }


  Serial.println("");

  Serial.println("WiFi connected");

  Serial.println("IP address: ");

  Serial.println(WiFi.localIP());

}


void loop()

{

  while (Serial.available()) {

  val[12] = Serial.read();

  WiFiClient client;

  const int httpPort = 80;

  if (!client.connect(host, httpPort)) {

  Serial.println("connection failed");

  return;

  }

  String url = "http://192.168.1.1/catcher.php?request=";

  //url += streamId;

  //url += privateKey;

  url += val[12];

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +

  "Host: " + host + "\r\n" +

  "Connection: close\r\n\r\n");

  unsigned long timeout = millis();

  while (client.available() == 0) {

  if (millis() - timeout > 5000) {

  Serial.println(">>> Client Timeout !");

  client.stop();

  return;

  }

  }

}

}
Есть мнение, что ESP201 некорректно принимает данные от MAX3232. Посмотрел наши и забугорные интернеты - не удалось найти зацепки.
Подскажите, пожалуйста, в чём может быть проблема?
 

CodeNameHawk

Moderator
Команда форума
Ошибка в
Код:
  while (Serial.available()) {
  val[12] = Serial.read(); <==============
Скорее всего должно быть
Код:
  while (Serial.available()) {
  temp = Serial.read();
val[i]=temp; i++;
и следить, чтобы буфер не переполнился. Или прочитали байт и байт отослали.
Это тогда
тоже поменять.
Для Arduino 1.6.9 и ESP 2.2.0 поменять
Код:
  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet);
на
Код:
    WiFi.config(ip, ip_gate, ip_subnet, ip_dns1, ip_dns2);
   WiFi.begin ( ssid, password );
 
Последнее редактирование:

nikolz

Well-known member
char val[12];
это означает что символов может быть 12. номер первого 0.
т е элемента val[12] нет. последний val[11].
тогда это
val[12] = Serial.read();не катит максимам будет так val[11] = Serial.read();
далее
если Вы передаете строку то она должна заканчиваться нулем либо надо явно передать длину.
 

Vova2407

New member
Всем спасибо за ответы. Ваши наводки позволили мне уменьшить гэп в знаниях по программированию. Тем не менее, пока я разбирался с кодом, параллельно ковырял железо. Всё-таки выяснилось, что проблема с преобразователем уровней на мс MAX3232. В прошлый раз, когда я якобы заключил, что он исправен, я отправил одно сообщение через него и был рад. Но если продолжать отправлять, то через пару посылок (с терминала в другой терминал через переходники usb-com и usb-ttl, подключенные к компьютеру), на второй терминал начинает через раз приходить мусор. И так в обе стороны. Если у кого было подобное, отпишите, пожалуйста, как решили. Варианты с подтягивающими резисторами пока не принесли результата. Кондеры стоят 0.1 мкФ.
 

nikolz

Well-known member
Всем спасибо за ответы. Ваши наводки позволили мне уменьшить гэп в знаниях по программированию. Тем не менее, пока я разбирался с кодом, параллельно ковырял железо. Всё-таки выяснилось, что проблема с преобразователем уровней на мс MAX3232. В прошлый раз, когда я якобы заключил, что он исправен, я отправил одно сообщение через него и был рад. Но если продолжать отправлять, то через пару посылок (с терминала в другой терминал через переходники usb-com и usb-ttl, подключенные к компьютеру), на второй терминал начинает через раз приходить мусор. И так в обе стороны. Если у кого было подобное, отпишите, пожалуйста, как решили. Варианты с подтягивающими резисторами пока не принесли результата. Кондеры стоят 0.1 мкФ.
Полагаю Вам надо продолжить "уменьшать гэп по программированию"
и изучить особенности асинхронного обмена данными, в частности решения проблемы переполнения буфера и синхронизации пакетов данных.
 

Vova2407

New member
Проблема решилась инвертированием принимаемого сигнала. (Данные с черного ящика отправляются младшими разрядами байта вперёд).
Для этого надо установить соответствующий бит:
Код:
void setup() {
    Serial.begin(115200);
    SET_PERI_REG_MASK(UART_CONF0(UART0) , BIT19);
С установкой этого бита заработало с изначальным кодом, и с предложенными.
 
Сверху Снизу