• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Komunikacja UART
#1
Witam, próbuję zrozumieć i nauczyć się zasad przechwytywania łańcuchów znaków przychodzących po UART i wykorzystywania ich dalej np. do sterowania Arduino za pomocą SMS, itp. Udaje mi się to już jako tako przy wykorzystaniu klasy String ale spotkałem się z opiniami, że lepiej jest działać na tablicach za pomocą klasy Serial. Np na forum.arduino.cc znalazłem taką oto instrukcję pobierania i przekazywania dalej łańcucha znaków (poniżej skopiowałem kod ze strony http://forum.arduino.cc/index.php?topic=396450.0). Zastanawiam się czy zaproponowany sposób to jest typowe rozwiązanie i czy nie można tego rozwiązać jakoś prościej?

Kod:
// Example 2 - Receive with an end-marker

const byte numChars = 32;
char receivedChars[numChars];   // an array to store the received data

boolean newData = false;

void setup() {
   Serial.begin(9600);
   Serial.println("<Arduino is ready>");
}

void loop() {
   recvWithEndMarker();
   showNewData();
}

void recvWithEndMarker() {
   static byte ndx = 0;
   char endMarker = '\n';
   char rc;
   
   while (Serial.available() > 0 && newData == false) {
       rc = Serial.read();

       if (rc != endMarker) {
           receivedChars[ndx] = rc;
           ndx++;
           if (ndx >= numChars) {
               ndx = numChars - 1;
           }
       }
       else {
           receivedChars[ndx] = '\0'; // terminate the string
           ndx = 0;
           newData = true;
       }
   }
}

void showNewData() {
   if (newData == true) {
       Serial.print("This just in ... ");
       Serial.println(receivedChars);
       newData = false;
   }
}
 
Odpowiedź
#2
Chciałbym Ci coś podpowiedzieć ze swojego doświadczenia gdy pisałem program do obsługi modemu GSM.
Za jego pomocą odczytywałem SMSy i je wysyłałem.
Napotkałem wówczas na pewną trudność z obsługą stringów w funkcji Serial.print("string").

Trudność ta objawiła się gdy zebrało się w programie ileś tam komend Serial.print("string").
Program nagle zaczął się wykładać i działy się dziwne rzeczy.
Doszedłem do tego, że zapychała mi się pamięc RAM w procku (tak to sobie wytłumaczyłem).

Nie mogłem ograniczyć ilości wysyłanych stringów a docelowo potrzebnych mi ich było ponad 80.
Problem rozwiązałem wykorzystując pamięć FLASH mikrokontrolera.

Poniżej przykład z którego możesz skorzystać aby uniknąć problemu z jakim ja się borykałem.
Efekt pracy programu możesz zobaczyć w serial monitorze IDE Arduino.

Kod:
// FLASH MEMORY

// ---------------------------
// Zdefiniowanie pamięci FLASH
// ---------------------------
#include <avr/pgmspace.h>

// -------------------------------------
// Zdefiniowanie tekstów w pamięci FLASH
// -------------------------------------
const char tekst_0 [] PROGMEM = "Dowolny tekst";
const char tekst_1 [] PROGMEM = "Nastepny tekst";
const char tekst_2 [] PROGMEM = "Jeszcze jeden tekst";
const char tekst_3 [] PROGMEM = "... i jeszcze jeden";
const char tekst_4 [] PROGMEM = "... itd...";

const char* const tablicaFLASH [] PROGMEM = {
 tekst_0, tekst_1, tekst_2, tekst_3, tekst_4
};

char bufor [100];
byte poz;

// -------------------
// Ustawienia programu
// -------------------
void setup()  
{
 Serial.begin (9600);
}

// ---------------------
// Główna pętla programu
// ---------------------
void loop()
{
 STRING();
 Serial.println(bufor);
 
 poz ++;
 if (poz > 4) poz = 0;
 
 delay(1000);
}

// ---------------------------------------------------
// Funkcja ładująca STRING'a z pamięci FLASH do bufora
// ---------------------------------------------------
void STRING ()
{
 strcpy_P (bufor, (char*) pgm_read_word (& (tablicaFLASH [poz])));
}

Pozdr.
ANT
Jeżeli pomogłem, to poproszę o punkt reputacji Big Grin
 
Odpowiedź
#3
ANT, bardzo Ci dziękuję za te porady. Właśnie czekam na mój pierwszy moduł GSM - SIM800L, który powinien dotrzeć do mnie w ciągu kilku tygodni, żeby zacząć konkretną naukę i testy.  Tymczasem, żeby nie tracić czasu uczę się podstaw komunikacji po UART + AT. Ponieważ jestem bardzo początkującym arduinowcem więc wszelkie takie porady są dla mnie bardzo cenne i serdecznie za nie dziękuję. Jeśli pojawią się konkretne problemy z obsługą tego modułu GSM to będę pisał licząc na wsparcie... Smile

Tymczasem, odnośnie Twojego kodu - jeśli dobrze rozumiem, to nie używałeś zmiennych w klasie String (przez duże "S") tylko zmienne typu char?
MarJanPol
 
Odpowiedź
#4
ANT, jeśli można przy okazji zapytać - czy zasilałeś moduł GSM bezpośrednio z płytki czy niezależnie? Jeśli np z niezależnej baterii to czy minus baterii połączony z GND płytki?
 
Odpowiedź
#5
Oczywiście używałem zmiennych typu char Smile
Zasilanie modułu jak widać na poniższych zdjęciach prosto z gniazda którym zasilam Arduino.

W razie problemów w obsłudze modułu możesz śmiało pisać.
Urządzenie które skonstruowałem działa u mnie w firmie od ponad roku.
W trakcie pracy łączy się znim kilku serwisantów poprzez smsy
i od urzadzenia otrzymują odpowiednie odpowiedzi równiez sms'em.

Poniżej widok urządzenia:
[Obrazek: gsm1.jpg]

[Obrazek: gsm2.jpg]

Pozdr.
ANT
Jeżeli pomogłem, to poproszę o punkt reputacji Big Grin
 
Odpowiedź
#6
Wow szacun! Chylę czoło. Bardzo elegancko to wygląda Smile
Zastanawiam się tylko cały czas czy do tej komunikacji nie będzie prościej wykorzystać zmiennych w klasie String - bez tablic, które jeszcze sprawiają mi trochę problemów... Smile
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości