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

Arduino + ESP8266 + Ноутбук

arantar

New member
Есть Ардуино Мега 2560, датчики которые к ней присоединены (gps, акселерометр и т.д.), ESP8266 Lolin, которая подключена к Ардуино для передачи данных на ноутбук.

Программирую все в Arduino IDE.

ESP подкючена к Ардуино через аппаратный serial и делитель напряжения. Проблема в том, что на ноут данные не приходят, только знаки вопроса. С Ардуино данные отправляются и приходят на ESP нормально, но только если использовать программный serial на ESP, и если передавать их дальше на ноут, то также все нормально. Проблема получается именно в аппаратном serial (gpio1 и gpio3).

Их я проверял, замыкая и отправляя через монитор порта данные, все приходит.

Если переназначить аппаратный serial на контакты gpio13 и gpio15, то данные на ноутбук приходят частично, в сильно искаженной форме.

Пробовал менять скорость serial - без эффекта.

Помогите разобраться, пожалуйста. Если какая инфа еще нужна, скажите.
 

CodeNameHawk

Moderator
Команда форума
Покажите электрическую схему и два скетча, из которых все выкинуто, кроме работы с сериал.
 

arantar

New member
Код:
#include <WiFiUdp.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

const char *ssid = "Notebook";
const char *password = "12345670";

const uint16_t port = 11000;
const char *host = "192.168.137.1";
const int sizeBuffer = 350;

WiFiUDP Udp;
ESP8266WiFiMulti WiFiMulti;

void setup() {
    Serial.begin(19200);
    WiFiMulti.addAP(ssid, password);
    while (WiFiMulti.run() != WL_CONNECTED) {
        delay(500);
    }
    delay(500);
}

void loop() {
    char incomingChars[sizeBuffer];
    for (int i = 0; i < sizeBuffer; i++) {
        incomingChars[i] = Serial.read();
    }
    Udp.beginPacket(host, 11000);
    Udp.write(incomingChars);
    Udp.endPacket();
}
На ноутбук приходит следующее:
https://goo.gl/photos/UDJbNJrn1ifbHtx6A

А это рабочий вариант. Отличие от нерабочего - это использование программного serial и подключение к пину D7 (gpio 13), вместо RX (gpio 3) на плате ESP8266.
Код:
#include <SoftwareSerial.h>
#include <WiFiUdp.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

SoftwareSerial ESPserial(13, 15);

const char *ssid = "Notebook";
const char *password = "12345670";

const uint16_t port = 11000;
const char *host = "192.168.137.1";
const int sizeBuffer = 350;

WiFiUDP Udp;
ESP8266WiFiMulti WiFiMulti;

void setup() {
    Serial.begin(19200);
    ESPserial.begin(19200);
    WiFiMulti.addAP(ssid, password);
    while (WiFiMulti.run() != WL_CONNECTED) {
        delay(500);
    }
    delay(500);
}

void loop() {
    char incomingChars[sizeBuffer];
    for (int i = 0; i < sizeBuffer; i++) {
        incomingChars[i] = ESPserial.read();
        Serial.print(incomingChars[i]);
    }
    Udp.beginPacket(host, 11000);
    Udp.write(incomingChars);
    Udp.endPacket();
}
На ноутбук приходит все нормально :
https://goo.gl/photos/t7aySwuXVt2VEEQg6

Код:
#include <ArduinoJson.h>
#include <Wire.h>
#include <TroykaIMU.h>
#include <TinyGPS++.h>

. . .
void setup() {
    Serial1.begin(ESP8266Baund);
    . . .
}

void loop() {
    GenerationJson();
}

void GenerationJson() {
    . . .
    // сериализация массива значений в JSON строку
    dataSensors.prettyPrintTo(str);
    Serial1.println(str);
}

Фото макета.
https://goo.gl/photos/aM5tQ5HcgCbh5rLH6
 
Последнее редактирование:

CodeNameHawk

Moderator
Команда форума
Почему читаете Serial.read(); не проверив поступило ли туда что нибудь?
 

RusikOk

New member
не перечитывал всю тему но у меня тоже была такая проблема на STM32. при чем в отладчике я четко видел что данные в буфер прилетали но scanf("%s", &buf); не работал. при чем это происходило не всегда. помогло посимвольное чтение scanf("%с", &buf); со всеми вытекающими из этого неудобствами
 
Сверху Снизу