logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ESP8266 - Jak zwiększyć prędkość wysyłania danych z Arduino Due?

pawel10220 08 Cze 2015 21:27 4833 7
REKLAMA
  • #1 14755706
    pawel10220
    Poziom 8  
    Mam do wysłania string o długości 69 znaków. Wysyłam go z Arduino Due.

    command = "AT+CIPSEND=0,11\r\n";
    Serial1.println(command);
    delay(5);
    Serial1.println(dane);


    Chciałbym te dane wysyłać jak najszybciej. Są to dane z akcelerometru, żyroskopu i magnetometru. Przy 10 cyklach na sekundę(około) moduł ESP8266 nie wyrabia. Resetuje się, wysyła losowe znaki, wysyła zera. Czasem wyśle 20 razy dane, czasem 600, lecz nie ma tu pracy ciągłej. Czy AT+CIPSEND ma jakieś ograniczenie czasowe? Jak inaczej wysyłać dane by moduł "ogarniał"?
  • REKLAMA
  • #2 14756531
    BlueDraco
    Specjalista - Mikrokontrolery
    Nie sprawdzasz gotowości modułu do przyjęcia danych.
  • REKLAMA
  • #3 14757157
    pawel10220
    Poziom 8  
    Jak to zrobić? Po prostu Serial1.available?
  • #4 14757796
    BlueDraco
    Specjalista - Mikrokontrolery
    Sprawdź, co robi moduł ESP8266 po otrzymaniu tego polecenia - czekaj na jego odpowiedź.
  • REKLAMA
  • #5 14758686
    pawel10220
    Poziom 8  
    To niestety wychodzi na to, że to jest za wolno, moduł ten może pewnie wysyłać większe pakiety niż 69 znaków, ale nie zrobi tego 20 razy na sekundę jak nam trzeba w projekcie. Trudno, polecimy na kablu
  • REKLAMA
  • #6 14762055
    oloam
    Poziom 22  
    Nie wiem czy nie za pozno ale czy dane musza byc odbierane z takim samym przedzialem czasowym jak sa wysylane? Czy moze byc odebrana paczka np. 10 pomiarow co 1s?
    Jezeli odpowiedz brzmi 'tak', to sprobuj :
    1. Ustawic max predkosc transmisji (dla esp to 921600). Po co czekac na przesylanie danych jak moga byc wczesniej przetwarzane (?)
    2 Uzyj komendy AT+CIPSENDBUF=<wielkoscbuforu> (max 2048bajtow). Po znaku zachety ">" mozesz wysylac swoje dane (w twoim przypadku np 10x69bajtow). Wyslane dane sa buforowane, kolejkowane i wysylane.Po osiagnieciu wielkosci buforu, mozesz wysylac nastepna paczke (nie musisz czekac na potwierdzenie "SEND OK"), co lepsze wysylajac komende CIPSENDBUF i otrzymujac inna odpowiedz niz znak zachety, wiesz, ze esp jest zajety lub wystapil inny blad. Jezeli paczki nie beda przechodzic to mozesz latwo sprawdzic za pomoca polecenia CIPBUFSTATUS w ktorym miejscu dane sie zatykaja (sprawdz datasheet komend AT)
    3. Moze warto zajac sie SDK od esp i zrezygnowac z firmware AT, napisac wlasne zoptymizowane pod wlasny projekt
  • #7 14763041
    Marico
    Poziom 20  
    pawel10220 napisał:
    Mam do wysłania string o długości 69 znaków. Wysyłam go z Arduino Due.

    command = "AT+CIPSEND=0,11\r\n";
    Serial1.println(command);
    delay(5);
    Serial1.println(dane);


    Robisz to w utarty sposób (nie wiem skąd wział się ten "styl" programowania) proszący się o problemy nie tylko w tym konkretnym przypadku ale w każdym innym przy tego typie komnikacji. Nie sprawdzasz odpowiedzi po "command", przez 5 (sekund?) blokujesz procesor (który mógłby w tym czasie zrobić dużo innych rzeczy nie tylko obsługując przerwania) po czym ślepo wysyłasz dane.
    Zrób pożądnie komnikację z urządzeniem na maszynie stanów, sprawdzaj odpowiedzi (w kolejnych stanach) na wysyłane polecenia, wysyłaj dane tylko wtedy gdy stan urządzenia zezwala na wysyłkę.
  • #8 14951450
    rexl
    Poziom 11  
    To jest arduino sketch. Więc to nie były 5s tylko 5ms. Ale fakt lepiej było to oprzeć na czasie pozyskiwanym z millis();
REKLAMA