• Система автоматизации с открытым исходным кодом на базе 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);
С установкой этого бита заработало с изначальным кодом, и с предложенными.
 
Сверху Снизу