RTV forum PL | NewsGroups PL

Arduino, SIM900A, SMS

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Arduino, SIM900A, SMS

Goto page 1, 2, 3  Next

Michal M. Lechanski
Guest

Sun Nov 25, 2018 4:59 pm   



Dzień dobry,

Może ktoś z Was podpowie mi co robię źle.

Hardware: Arduino Uno, moduł GSM SIM900A, zasilacz 5V 3.6A
Software jak poniżej. W plikach Arduino SoftwareSerial.h i
HardwareSerial.h zmieniona wielkość bufora RX do 256.

Objawy - wysyłanie smsów działa (choć przyznam, że nie sprawdzałem ile
maksymalnie znaków mogę wysłać), odbieranie działa ale odebrana
wiadomość jest ucinana do kilkunastu znaków (poniżej przykład).
Wysyłam dla przykładu 1234567890 powtórzone pięć razy i w msgBuffer
otrzymuję:

+CMT: "+XXXXXXXXXXXX","","18/11/25,15:36:19+00"
12345678901237

czasem ostatnia cyferka jest inna, czasem jej w ogóle nie ma, czasem
jest jedna więcej - żadnej prawidłowości.

Kod (właściwie to copy&paste z internetowych poradników):

#include <SoftwareSerial.h>
SoftwareSerial mySerial(5, 6);

void SendMessage(String rcpNumber, String sendMsgBody)
{
mySerial.println("AT+CMGF=1"); //Sets the GSM Module in Text Mode
delay(1000); // Delay of 1000 milli seconds or 1 second
mySerial.print("AT+CMGS=\"");
mySerial.print(rcpNumber);
mySerial.println("\"\r");
delay(1000);
mySerial.println(sendMsgBody);// The SMS text you want to send
delay(100);
mySerial.println((char)26);// ASCII code of CTRL+Z
delay(1000);
}

void setup() {
Serial.begin(115200);
delay(2000);
mySerial.begin(57600);
delay(30000);
mySerial.println("AT+CMGF=1");
mySerial.println("AT+CNMI=2,2,0,0,0");
delay(1000);
Serial.print("End of setup");
SendMessage("+XXXXXXXXXXXX", "End of setup");
}

void loop() {
msgDetails();
}

void msgDetails() {
String msgBuffer = readSIM900A();
if (msgBuffer.startsWith("\r\n+CMT: ")) {
Serial.println(msgBuffer);
}
}

String readSIM900A() {
String msgBuffer;
while (mySerial.available() > 0) {
char c = mySerial.read();
msgBuffer.concat(c);
delay(10);
}
return msgBuffer;
}

Pomożecie? Z góry bardzo dziękuję.

--
Michał

Zbych
Guest

Sun Nov 25, 2018 7:21 pm   



Michal M. Lechanski wrote on 25.11.2018 16:59:
Quote:
Dzień dobry,

Może ktoś z Was podpowie mi co robię źle.

Hardware: Arduino Uno, moduł GSM SIM900A, zasilacz 5V 3.6A
Software jak poniżej. W plikach Arduino SoftwareSerial.h i
HardwareSerial.h zmieniona wielkość bufora RX do 256.

Objawy - wysyłanie smsów działa (choć przyznam, że nie sprawdzałem ile
maksymalnie znaków mogę wysłać), odbieranie działa ale odebrana
wiadomość jest ucinana do kilkunastu znaków (poniżej przykład).

Po pierwsze podłącz oscyloskop albo lepiej analizator stanów logicznych
na linie RxD/TxD i zweryfikuj co faktycznie leci po drutach, łącznie z
czasami trwania bitów.
Może masz odrobinę skopaną prędkość transmisji i po kilku bajtach ci się
rozjeżdża synchronizacja?
Zwłaszcza jeśli używasz software'owego UARTa. Jeśli masz też włączone
inne przerwania (timery?, inne uarty?), to na bank nie będzie to
działało dobrze.
AVR nie ma priorytetów przerwań i jedyne co możesz w tej sytuacji zrobić
to zmiana procka na model z 2 UARTami.

PS. Pamiętam też że ktoś już kiedyś skarżył się na grupie na modem
SIMxxx, że cześć radiowa zakłócała mu komunikację po RSie, ale to
sprawdził po upewnieniu się, że z programem jest wszystko w porządku.

Michal M. Lechanski
Guest

Sun Nov 25, 2018 7:33 pm   



W dniu 25.11.2018 o 18:21, Zbych pisze:

Quote:
Po pierwsze podłącz oscyloskop albo lepiej analizator stanów logicznych
na linie RxD/TxD i zweryfikuj co faktycznie leci po drutach, łącznie z
czasami trwania bitów.

Pięknie dziękuję, ale przeceniasz mnie :-)

Quote:
Może masz odrobinę skopaną prędkość transmisji i po kilku bajtach ci się
rozjeżdża synchronizacja?

Zapomniałem napisać - sprawdzałem dla różnych kombinacji prędkości i
albo nie dostawałem nic, albo jakieś krzaczki. Ustawienia Serial i
prędkość w okienku terminala na 115200 wydają się działać dla różnych
prędkości SoftwareSerial. Nie wpływa to jednak na to co dostaję w msgBuffer

Quote:
po upewnieniu się, że z programem jest wszystko w porządku.

Jak pisałem poprzednio - mój "program" to w zasadzie copy&paste z (wielu
różnych) internetowych poradników. Trudno mi uwierzyć, żeby wszyscy
autorzy publikowali to bez sprawdzenia.

Jeszcze raz bardzo dziękuję za zainteresowanie.

--
Michał

Zbych
Guest

Sun Nov 25, 2018 7:50 pm   



Michal M. Lechanski wrote on 25.11.2018 19:33:
Quote:
W dniu 25.11.2018 o 18:21, Zbych pisze:

Po pierwsze podłącz oscyloskop albo lepiej analizator stanów logicznych
na linie RxD/TxD i zweryfikuj co faktycznie leci po drutach, łącznie z
czasami trwania bitów.

Pięknie dziękuję, ale przeceniasz mnie Smile

Tzn. nie masz 20...40zł na narzędzie, które pozwoli ci zweryfikować co
się dzieje na drutach?
https://allegro.pl/listing?string=Saleae
https://www.aliexpress.com/w/wholesale-logic-analyzer.html?spm=2114.search0104.0.0.8205740boSXdhk&initiative_id=SB_20181125104744&site=glo&groupsort=1&SortType=price_asc&SearchText=logic+analyzer

Quote:
Może masz odrobinę skopaną prędkość transmisji i po kilku bajtach ci się
rozjeżdża synchronizacja?

Zapomniałem napisać - sprawdzałem dla różnych kombinacji prędkości i
albo nie dostawałem nic, albo jakieś krzaczki. Ustawienia Serial i
prędkość w okienku terminala na 115200 wydają się działać dla różnych
prędkości SoftwareSerial. Nie wpływa to jednak na to co dostaję w msgBuffer

Jeśli problemem jest programowy Uart, to tylko maksymalne obniżenie
prędkości transmisji może cię ratować. Ale i tak najpierw musisz z
prędkością 115200 wysłać do SIM900 komendę zmieniającą prędkość na np. 9600.

Michal M. Lechanski
Guest

Sun Nov 25, 2018 8:06 pm   



W dniu 25.11.2018 o 18:50, Zbych pisze:
Quote:
Michal M. Lechanski wrote on 25.11.2018 19:33:
W dniu 25.11.2018 o 18:21, Zbych pisze:

Po pierwsze podłącz oscyloskop albo lepiej analizator stanów logicznych
na linie RxD/TxD i zweryfikuj co faktycznie leci po drutach, łącznie z
czasami trwania bitów.

Pięknie dziękuję, ale przeceniasz mnie :-)

Tzn. nie masz 20...40zł na narzędzie, które pozwoli ci zweryfikować co
się dzieje na drutach?

Nie w narzędziu problem ale w umiejętności skorzystania z takiego
urządzenia lub interpretacji uzyskanych pomiarów.

Quote:
Jeśli problemem jest programowy Uart, to tylko maksymalne obniżenie
prędkości transmisji może cię ratować. Ale i tak najpierw musisz z
prędkością 115200 wysłać do SIM900 komendę zmieniającą prędkość na np. 9600.

To wydaje mi się ważne - nie pomyślałem że zadeklarowanie prędkości w
kodzie może nie być wystarczające i że trzeba jeszcze zmienić ustawienia
modemu... Poczytam, spróbuję.
Dzięki za dodatkowy trop, bez względu na to dokąd mnie doprowadzi :-)

--
Michał

Marek
Guest

Sun Nov 25, 2018 9:12 pm   



On Sun, 25 Nov 2018 19:21:45 +0100, Zbych <abuse_at_onet.pl> wrote:
Quote:
PS. Pamiętam też że ktoś już kiedyś skarżył się na grupie na modem
SIMxxx, że cześć radiowa zakłócała mu komunikację po RSie, ale to
sprawdził po upewnieniu się, że z programem jest wszystko w
porządku.

To ja pisałem. Faktycznie zakłócenia były tak silne, że musiałem
prędkość obniżyć do 9600, natomiast nigdy nie udało mi się tym
modulem (w sensie chińskiej płytki z modułem) uzyskać 100% transmisji
bez błędów.
A tak z ciekawości pytanie do inicjatora wątku, z jakiego zrodla
pochodzi ten Twój sim900A? O ile pamiętam sim900a był wyłącznie na
rynek azjatycki z simlockiem. Sam go flashowales by chodził u nas?

--
Marek

Michal M. Lechanski
Guest

Sun Nov 25, 2018 9:17 pm   



W dniu 25.11.2018 o 20:12, Marek pisze:

Quote:
A tak z ciekawości pytanie do inicjatora wątku, z jakiego zrodla
pochodzi ten Twój sim900A? O ile pamiętam sim900a był wyłącznie na
rynek azjatycki z simlockiem. Sam go flashowales by chodził u nas?

Kupiony na eBay więc pewnie z Chin, choć dostawa była z UK. I tutaj
działa, tyle że narowiście... Czy sprzedawca coś z nim robił? Nie mam
pojęcia.

--
Michał

J.F.
Guest

Sun Nov 25, 2018 10:48 pm   



Dnia Sun, 25 Nov 2018 15:59:51 +0000, Michal M. Lechanski napisał(a):

Quote:
void msgDetails() {
String msgBuffer = readSIM900A();
if (msgBuffer.startsWith("\r\n+CMT: ")) {
Serial.println(msgBuffer);
}
}

String readSIM900A() {
String msgBuffer;
while (mySerial.available() > 0) {
char c = mySerial.read();
msgBuffer.concat(c);
delay(10);
^^^^^
}
return msgBuffer;
}

wstaw delay(1), albo wywal kompletnie/przerob.

Teraz ci grozi cos takiego, ze znaki stracisz, bo sie bufor przepelni.

J.

Michal M. Lechanski
Guest

Sun Nov 25, 2018 11:10 pm   



W dniu 25.11.2018 o 21:48, J.F. pisze:
Quote:
Dnia Sun, 25 Nov 2018 15:59:51 +0000, Michal M. Lechanski napisał(a):

delay(10);
^^^^^

wstaw delay(1), albo wywal kompletnie/przerob.

Teraz ci grozi cos takiego, ze znaki stracisz, bo sie bufor przepelni.

Dziękuję bardzo! Znacząca poprawa - po usunięciu delay(10), zamiast
kilkunastu znaków z wysłanych 50, dostałem 47...

--
Michał

Marek
Guest

Mon Nov 26, 2018 9:30 am   



On Sun, 25 Nov 2018 20:17:19 +0000, "Michal M. Lechanski"
<michal_at_doriath.eu> wrote:
Quote:
Kupiony na eBay więc pewnie z Chin, choć dostawa była z UK. I tutaj
działa, tyle że narowiście... Czy sprzedawca coś z nim robił? Nie
mam
pojęcia.

Możesz pokazać jak wygląda, jakiś link do aukcji?

--
Marek

Marek
Guest

Mon Nov 26, 2018 9:39 am   



On Sun, 25 Nov 2018 22:10:32 +0000, "Michal M. Lechanski"
<michal_at_doriath.eu> wrote:
Quote:
Dziękuję bardzo! Znacząca poprawa - po usunięciu delay(10), zamiast
kilkunastu znaków z wysłanych 50, dostałem 47...

Niestety to kolejny przykład badziewnego gotowego softu dla Arduino.
Często nadużywane delay() blokujące Io a w tym skrajnym przypadku
powodujące utratę danych czy wręcz blokadę uarta spowodowaną
przepełnienie sprzetowwgo bufora rx . Nie możesz zakładać, że tysiące
ludzi używa to musi działać, jak wydzisz działa tak sobie. Odbiór
znaku z uart powinien być w przerwaniu, które zapisze je do
aplikacyjnego kołowego bufora odbiorczego (ring buffer). Z niego
aplikacja pobiera sobie po kolei odebrane znaki.

--
Marek

Michal M. Lechanski
Guest

Mon Nov 26, 2018 8:32 pm   



W dniu 26.11.2018 o 08:30, Marek pisze:
Quote:
On Sun, 25 Nov 2018 20:17:19 +0000, "Michal M. Lechanski"
michal_at_doriath.eu> wrote:
Kupiony na eBay więc pewnie z Chin, choć dostawa była z UK. I tutaj
działa, tyle że narowiście... Czy sprzedawca coś z nim robił? Nie
mam
pojęcia.

Możesz pokazać jak wygląda, jakiś link do aukcji?

Na ebay już ich nie ma, ale znalazłem niemal identyczny (mój ma czerwoną

płytkę) na Aliexpres:

tiny.cc/5lo90y

Albo jak kto woli:

https://www.aliexpress.com/item/Smallest-SIM800C-GPRS-GSM-Module-MicroSIM-Card-Core-Board-Quad-band-TTL-Serial-Port-Compatible-SIM800L/32712837444.html?spm=2114.search0104.3.57.734e427ajNzTXv&ws_ab_test=searchweb0_0,searchweb201602_4_10065_10068_10130_10547_319_317_10548_10696_10192_10190_10924_453_10084_454_10083_10618_10920_10921_10922_10307_10820_10301_10821_10303_537_536_10059_10884_10887_100031_321_322_10103,searchweb201603_51,ppcSwitch_0&algo_expid=a39957e5-a977-4d3a-ba39-0332288bb01b-8&algo_pvid=a39957e5-a977-4d3a-ba39-0332288bb01b

--
Michał

Michal M. Lechanski
Guest

Mon Nov 26, 2018 8:35 pm   



W dniu 26.11.2018 o 19:32, Michal M. Lechanski pisze:

Quote:
niemal identyczny

Oczywiście mój to SIM900a a nie SIM800C

--
Michał

J.F.
Guest

Mon Nov 26, 2018 9:36 pm   



Użytkownik "Marek" napisał w wiadomości grup
dyskusyjnych:almarsoft.785055201780232822_at_news.neostrada.pl...
On Sun, 25 Nov 2018 22:10:32 +0000, "Michal M. Lechanski"
<michal_at_doriath.eu> wrote:
Quote:
Dziękuję bardzo! Znacząca poprawa - po usunięciu delay(10), zamiast
kilkunastu znaków z wysłanych 50, dostałem 47...

Niestety to kolejny przykład badziewnego gotowego softu dla Arduino.
Często nadużywane delay() blokujące Io a w tym skrajnym przypadku
powodujące utratę danych czy wręcz blokadę uarta spowodowaną
przepełnienie sprzetowwgo bufora rx . Nie możesz zakładać, że tysiące
ludzi używa to musi działać, jak wydzisz działa tak sobie. Odbiór
znaku z uart powinien być w przerwaniu, które zapisze je do
aplikacyjnego kołowego bufora odbiorczego (ring buffer). Z niego
aplikacja pobiera sobie po kolei odebrane znaki.

Tylko na ile dobrze rozumiem:
-to jest akurat uart softwareowy, sprzetowy zajety na wazniejsze
rzeczy,
-biblioteka dziala w przerwaniach, i zapisuje do bufora, ale jakos
slabo, albo bufor maly,

-to przyklad jest do d*, bo nalezy odbierac dane z uarta az do ...
jakiegos znaku konca czy dluzszej przerwy w transmisji,

-zrodel biblioteki znalezc na szybko nie moglem, no to co mozna mowic
o jakosci ...

J.

Adam GĂłrski
Guest

Tue Nov 27, 2018 1:13 pm   



On 2018-11-26 20:35, Michal M. Lechanski wrote:
Quote:
W dniu 26.11.2018 o 19:32, Michal M. Lechanski pisze:

niemal identyczny

Oczywiście mój to SIM900a a nie SIM800C


Pięknie , pięknie aż całe 100uF dali....
Ale wiesz ile bierze taki moduł przy transmisji ?
Pobór prądu przy nadawaniu/logowaniu do sieci to seria impulsów
2A/~0.6ms. Napięcie na zasilaniu nie może spaść bardziej niż o 0.35V.

No to jeżeli tam nie ma więcej pojemności lub bardzo szybkiego
zasilacza/stabilizatora no to jesteś w .... niedomówienie.

To tyle odnośnie problemów ze zbyt szybkim rs-em i zakłócaniem z anteny.

Adam Górski

Goto page 1, 2, 3  Next

elektroda NewsGroups Forum Index - Elektronika Polska - Arduino, SIM900A, SMS

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map