Ви не увійшли.
Сторінки 1
Всем привет, бьюсь 4ый день с этим модемом. Периодически теряются символы в терминале, самый относительно-стабильный результат удалось получить на скорости 38400.
Модем подключен через SoftwareSerial, т.к. arduino nano умеет только один аппаратный serial, хотя врядли в нем проблема, т.к. ошибки в передаче данных случаются даже на скорости 2400.
Питание перепробовано разное, уровни ардуина TX -> модем RX согласованы через мосфет, в обратную сторону подключил напрямую через 200 Ом резистор.
Схема согласования как на этом видео в последнем рисунке https://www.youtube.com/watch?v=t-yuYasIKtY
В случайный момент времени между ардуиной и модемом теряются символы, из-за чего весь код разваливается, потому что в код завязан на определенный ответ.
При 9600 теряются так https://postimg.org/image/91u27uumf/ , с 38400 только иногда проскакивают ошибки.
Собственно мой говнокод https://github.com/one-quaker/remote_re … _relay.ino , критика приветствуется. Так и не понял как ловить OK/ERROR от модема, возможно это добавило бы коду стабильности, но даже ERROR может прилететь как ERRO или ERRSR... Также не понял как лучше парсить строки.
У кого есть большой опыт с gsm, помогите
Остання редакція freeman (2016-06-17 20:56:18)
Неактивний
по частям запускайте
повторите это
http://radiolaba.ru/microcotrollers/gsm … eniya.html
AT+IPR=9600
at+enpwrsave=0
Неактивний
привет.
у SoftwareSerial есть одна проблема....если во время передачи данных (от mcu в модуль) модуль что-нибудь пошлет (типа OK)....это вызовет int2 и передаваемые данные потеряются
я бы очень рекомендовал использовать аппаратный serial для модема а отлаживаться с softserial... хотя это довольно геморойно
есть еще чудесная библиотека AltSoftSerial она лучше работает для вашей задачи
удачи.
Неактивний
могу поделиться функцией, которая посылает команду в модем и жет ответ.... может вам поможет....
пример использования .... формат: "команда","ответ", время ожидаия в секундах, кол-во повторных попыток, читить буфер);
надеюсь вы понимаете что \" это символ "
if (!modem_write("AT+SAPBR=3,1,\"Contype\",\"GPRS\"","OK",1,3,true ))
if (!modem_write("AT+SAPBR=3,1,\"APN\",\"www.ab.kievstar.net\"","OK",1,3,true ))
if (!modem_write("AT+SAPBR=1,1","OK",5,3,true ))
в начале
Serial.begin(9600);
debugSerial.begin(38400);
#define DEBUGMODE 4
//-------------------------------------------------modem_write---------------------------------------------
boolean SMARTBHIVE::modem_write(char command[], char answer[], byte waitTime, byte repeet, boolean after_read){
while(repeet>0){
#if DEBUGMODE < 5
debugSerial.print(F("modWrite>\""));debugSerial.print(command);debugSerial.print(F("\" wait:"));debugSerial.print(waitTime);
debugSerial.print(F("for:\"")); debugSerial.print(answer); debugSerial.print(F("\" left:")); debugSerial.print(repeet);
#endif
Serial.println(command);
gsm_read_buf ="";
unsigned long ii=millis();
while ((millis()-ii)/1000 < waitTime){
if (Serial.available()) gsm_read_buf += char(Serial.read());
if (gsm_read_buf.endsWith(answer)){
#if DEBUGMODE < 5
debugSerial.print (F("->DONE in:"));
debugSerial.println ((millis()-ii));
#endif
if (after_read){
unsigned long iii=millis();
while ((millis()-iii) < 200) if (Serial.available()) gsm_read_buf +=char(Serial.read());
};
#if DEBUGMODE < 5
debugSerial.println(gsm_read_buf);
#endif
return (0);
};
};
#if DEBUGMODE < 5
debugSerial.println(F(">TIMEOUT"));
#endif
#if DEBUGMODE < 5
debugSerial.println(gsm_read_buf);
#endif
repeet--;
};
#if DEBUGMODE < 7
debugSerial.println(F("modWrite>FAIL"));
#endif
return (1);
};
Остання редакція Igor Kovba (2016-06-19 00:35:52)
Неактивний
Ого тут насоветовали. За код спасибо, попробую применить.
А с SoftwareSerial действительно похоже беда, надо брать ардуину с двумя аппаратными UART, что посоветуете?
Я же правильно понял что использовать пины tx rx для общения с модемом не получится?
Неактивний
по частям запускайте
повторите это
http://radiolaba.ru/microcotrollers/gsm … eniya.html
AT+IPR=9600
at+enpwrsave=0
Это уже пробовал, спасибо
Неактивний
на будущее
фотку с "аааа" прошляпил ) при евен такое не возможно
я о том что один из портов подключайте к терминалке на компе, а второй к модему
считайте что ваша схема - примитивный переходник, такая концепция мне позволяет быстро вылавливать косяки схемы,которые не всегда можно выловить в автоматическом режиме
Igor Kovba дал хорошее решение,
так каков нынче статус? )
Неактивний
Even не помог, ограничился скоростью 38400, на ней как ни странно меньше ошибок, думаю сам модем немного неадекватный.
Как будет на чем, попробую аппаратный UART ибо лень отпаивать модем и тестировать напрямую с компьютером.
Неактивний
зачем отпаивать? есть готовое устройство. если serial uart можно использовать как IO с компа , то делаете перенаправление,
но мой опыт подсказывает, если не разберетесь с передачей данных устройство будет работать только на столе ( и то с глюками,
Неактивний
Сейчас это ардуино нано + модем neoway m590, ардуина с модемом общается через softwareserial и с компьютером через mini-usb (usb2ttl на микросхеме ch*** кажется). В коде все из Serial пересылается в softwareserial и наоборот. Не совсем понял с чем нужно разобраться
Неактивний
это и нужно было сделать )
https://github.com/one-quaker/remote_re … _relay.ino
слабо похоже на чистый forward )
Неактивний
Тестировал на чистом форварде, мне другое непонятно, ардуино через softwareserial какую-то четность вообще использует? Как это настроить?
То что в Serial команды возвращаются с ошибками это ладно, главное чтобы они до модема доходили без ошибок. Видимо самый нормальный вариант - не использовать softwareserial
Неактивний
Limitations
The library has the following known limitations:
If using multiple software serial ports, only one can receive data at a time.
Not all pins on the Mega and Mega 2560 support change interrupts, so only the following can be used for RX: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69).
Not all pins on the Leonardo and Micro support change interrupts, so only the following can be used for RX: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
On Arduino or Genuino 101 the current maximum RX speed is 57600bps
On Arduino or Genuino 101 RX doesn't work on Pin 13
If your project requires simultaneous data flows, see Paul Stoffregen's AltSoftSerial library. AltSoftSerial overcomes a number of other issues with the core SoftwareSerial, but has it's own limitations. Refer to the AltSoftSerial site for more information.
A SoftwareSerial library allows for serial communication on any of the Nano's digital pins.
https://github.com/arduino/Arduino/blob … al.cpp#L32
красиво пишут библиотеки )
мои домыслы -
library allows for serial communication on any of the Nano's digital pins.
это точно не хорошо
нормальный програмный uart получается только при использовании апаратных фишек таймера ( compare / capture )
любая нога - это вероятно перерывания с копированием значения таймера -, относительно высокие скорости - дают большую ошибку
итак - понизить скорость до 4800
установить в модеме скорость 4800 ( +ipr=4800 )
и дествительно избавляться от стрёмного порта )
обязаловка для модемов если не указано иное
http://www.gaw.ru/html.cgi/txt/publ/pow … levels.htm
либо запитайте вашу ардуино от 2.8В она работает от такой напруги?
Остання редакція NoName (2016-06-21 12:26:05)
Неактивний
Сторінки 1