А SoftwareSerial нормально вообще работает ? Что то глюки лезут.

vlkam
Offline
Зарегистрирован: 17.02.2013

 Сперва делаю прием-передачу на HardwareSerial. Туда обратно все бегает.

Потом делаю на SoftwareSerial (меняю только имя класса). Туда убегает, а обратно, от HardwareSerial такое впечатление что на один бит сбивается. Т.е. первый бит обратывается как отдельный байт, а потом уже нормально идет чтение. Ну за исключением того, что биты сдвинуты

maksim
Offline
Зарегистрирован: 12.02.2012

Скорость сериал-соединения какая?

vlkam
Offline
Зарегистрирован: 17.02.2013

maksim пишет:
Скорость сериал-соединения какая?

9600

vlkam
Offline
Зарегистрирован: 17.02.2013

Выяснились интересные подробности.

У меня между Serial стоят MAX485 для серийной передачи по RS485

Так вот аппаратные серийные порты с ними отлично работают, а SoftwareSerial глючит на примем при переключении прием/передача для RS485

Вроде бы проблемка решилась легкой доработкой либы SoftwareSerial  в момент отправки функция приема отключается намертво

Вывод похоже такой : отлаживать на HardwareSerial а уж потом переводить на SoftwareSerial.
Иначе можно очень долго на ровном месте глюки ловить

maksim
Offline
Зарегистрирован: 12.02.2012

Так можно гадать сколько угодно, теперь оказывается у вас RS485, а значит задействован как минимум еще один вывод.
В общем либо вы подробно описываете, что и куда подключаете и показываете код (часть кода) либо вам на форум экстрасенсов нужно.

vlkam
Offline
Зарегистрирован: 17.02.2013

maksim пишет:
Так можно гадать сколько угодно, теперь оказывается у вас RS485, а значит задействован как минимум еще один вывод.
В общем либо вы подробно описываете, что и куда подключаете и показываете код (часть кода) либо вам на форум экстрасенсов нужно.

Так вопрос был абстрактный, бывают ли глюки у SoftwareSerial по сравнению с HardwareSerial
Оказываются между софт и хард есть существенные различия в реализации, раз HardwareSerial у меня работает без вопросов, а SoftwareSerial глючит. Хотя используются они совершенно одинаково :

		if(KindOfSerial == 0){
			avaibl = ((HardwareSerial *)AnSerial)->available();
		} else {
			avaibl = ((SoftwareSerial *)AnSerial)->available();
		}

 

__Alexander
Offline
Зарегистрирован: 24.10.2012

логично.

vlkam
Offline
Зарегистрирован: 17.02.2013

 А вот новый глюк SoftwareSerial вылез. Одна из команд у меня имеет (точнее имела) код 0х03
И ни в какую пролезать не хотела. Сменил код на 0x56 все влет полезло. Данные пихаю через write, там по идее ведь должно быть по барабану что пихается ?

((SoftwareSerial *)AnSerial)->write(buffer,header_size + size_struct  + HEADPREF_SIZE);

Блин, а это уже серьезно, цифра 3 никак не хочет пролазить. что делать ?

vlad072
Offline
Зарегистрирован: 01.08.2017

Через SoftwareSerial пины 11 ,12 arduino nano работает sim80c.  Всё как бы нормально первое время после включения, может проработать час, может день, может три... а потом вместо читабельного АТ - обмена  начинается суровый треш, либо модем пихает в порт кракозябры, либо SS так принимает байты. Лечится только перезагрузкой ардуины, и опять же на какое то время. Участок скетча ниже. Скорость ставил от 9600 до 115200 - разницы нет.

  
#define debug           Serial
SoftwareSerial modem(SIM800TX_PIN, SIM800RX_PIN);
char     at[128]   =  "";
void athandling() { //++++++++++++++++++ AT RESPONSES HANDLING ++++++++++++++++++++
  byte _atlen = 0; char* _ptr = NULL;
  while (modem.available()) {
    char _ch = modem.read();
    if ( (_atlen + 1) < sizeof(at) ) at[_atlen++] = _ch;  //delay(1);
  } at[_atlen] = '\0';
  #if DEBUG_LVL & 1
  for (byte _i = 0; _i < _atlen; _i++) debug.write(at[_i]);
  #endif
  //...
}
//...
void loop() {
  #if DEBUG_LVL & 1
  while (debug.available()) modem.write(debug.read());
  #endif
  if (modem.available()) athandling();
//...
}
andycat
andycat аватар
Онлайн
Зарегистрирован: 07.09.2017

О...у вас опять проблемы с sim800 глюченным как Вы утверждаете :)

ЗЫ. Я повторюсь - дело в руках - уж больше года работаю с этим модулем, uptime до месяца доходит легко, причём в неблагоприятных условиях, не стабильное питание и потеря зон связи. Так что советы стандартные: качественная фильтрация питания, с умом использовать wdt, использовать не блокириуюший код. 

vlad072
Offline
Зарегистрирован: 01.08.2017

Питание что модема что атмеги более чем качественное. По остальным двум пунктам не вижу связи с конктерно моей проблемой. У меня не виснет контроллер, а рушится обмен через сериал, при этом оба его "участника" продолжают работать, только "сами по себе". Подозреваю проблема именно в SoftwareSerial, хардварный пока не пробовал использовать, поскольку проблема трудновоспроизводима и пока пытаюсь хотя бы с помощью логов хоть какую то информацию выудить.

Про корвость самого модема тему даже обсуждать не интересно, поскольку он ГЛЮЧНЫЙ (как минимум с прошивкой xxxSIM800C24_BT), и это подтверждается опытом других людей, у которых он работает "на все деньги" 24/7 а не просто принимает СМС-ки для включения релюшки. Не надо в очередной раз пытаться показать свою невзb@6Eнность выставляя всех идиотами кроме себя. Задал вопрос в поисках КОНСТРУКТИВНОЙ помощи а не трёпа.

Logik
Offline
Зарегистрирован: 05.08.2014

vlad072 пишет:

 проблема именно в SoftwareSerial

А какую еще помощ надо, так оно и есть. Он не работал, не работает и не будет работать. Попробуйте замкнуть его Tx и Rx и погонять чего, сразу убедитесь. 

vlad072 пишет:

Питание что модема что атмеги более чем качественное.

я так не думаю. Эти модемы в коротких импульсах умеют много тока брать. Тут или БП на 2А или электролит размером с рюмку.

 

vlad072
Offline
Зарегистрирован: 01.08.2017

Т.е. со временем SoftwareSerial "валится", это факт? Читал что библиотека работает так себе, но именно то что с течением времени может чудить не слышал.

andycat
andycat аватар
Онлайн
Зарегистрирован: 07.09.2017

vlad072, это и был конструктив, software serial работает вполне себе стабильно. Я думаю именно в питании проблемы, поставьте амперметр, осциллограф, погоняйте в разных режимах,понаблюдайте и выясните в какой момент перестаёт работать обмен.

Logik
Offline
Зарегистрирован: 05.08.2014

vlad072 пишет:

Т.е. со временем SoftwareSerial "валится", это факт? Читал что библиотека работает так себе, но именно то что с течением времени может чудить не слышал.

Не со временем и не "валится".  Просто не работает. Эта библиотека не обеспечивает одновременно передачу и прием потока данных. Пока передача и прием не накладываются друг на друга - работает. Потому и пишу " Попробуйте замкнуть его Tx и Rx и погонять". Но т.к. СМС или входящий могут прийти в любой момент, т.е. асинхронно то надо быть готовым принимать данные с модема всегда, а это не реализуемо, иногда приходится чегото на модем отправлять (не в смысле звонить или смску, а в смысле опросить состояние, настройку задать и т.д.). Вот когда эти процессы наложились - глюк. Соответственно их интенсивность напрямую зависит от способа и интенсивности работы с модемом. Некоторые до поры эти глюки не замечают или они подобрали, зачастую бессознательно, такой режим при котором глючит редко. Поисчите по форуму, здесь тем про это валом. Есть альтернативные либки для софтоваго уарта, можете попробовать.

sadman41
Offline
Зарегистрирован: 19.10.2016

Последние релизы SoftwareSerial вроде как interrupt driven. 

Logik
Offline
Зарегистрирован: 05.08.2014

Так они все на прерываниях всегда были. Что их и губит ))) Получается что он при отправке, как ушел в прерывание при начале отправки байта, т.е. на стартовом бите, так и висит все время отправки в прерывании, игноря другие прерывания. Собственно игноря прием, который стартует по прерыванию на пине. Может чего там и допиляли в новых версиях но люди сунувшие такую хрень в массы, имхо, не заслужывают доверия и внимания. Я больше на это не ведусь. Кстати в прошлом тысячелетии ;) еще для ПИК я писал софт реализацию уарт, принципиально одновременная работа на передачу и прием возможна, но скорости невысокие получаются т.к. на один бит надо несколько прерываний таймера.

sadman41
Offline
Зарегистрирован: 19.10.2016

Библиотека как библиотека. Если к месту применить - вполне себе нормальная. Датчик там какой опросить или принять с чего-то вещающего по расписанию.

Logik
Offline
Зарегистрирован: 05.08.2014

Ага. И Туалетная бумага - бумага как бумага, если к месту применять ;)

Разговор жеж о модеме а не о датчиках. Хотя оно и с модемом впринципе можно если строго обеспечить отсутствие пересечения по времени. Но это не всегда возможно.

Заметим, тем о том что  SoftwareSerial не работает с датчиком на форуме не наблюдается, а вот с модемом и дуплексными каналами периодически появляются.

vlad072
Offline
Зарегистрирован: 01.08.2017

Logik, информация исчерпывающая, спасибо. В гуглах ничего подобного не видел, может плохо искал.. Т.е. если во время отправки придут данные на Rx, то будет принята только часть информации, которая останется "недоотправленоой" встречным устройством на момент завершения передачи от атмеги. И фактически этот приём вероятней всего начнётся прямо посреди очередного байта на входе. Если я что то не так понял поправьте... Да, и после этого кривого приёма следующее сообшение должно приняться нормально (конечно при условии отсутствия очередного наложения приёма на передачу)?

Logik
Offline
Зарегистрирован: 05.08.2014

В общих чертах так. Может полезно будет http://arduino.ru/forum/apparatnye-voprosy/gsm-a6-vopros-pro-ring#commen... На счет следующие нормально - не факт, кривые "хвосты" могут висеть в буфере. Но если его почистить то вполне.

vlad072
Offline
Зарегистрирован: 01.08.2017

Из Вашего поста "понижение скорости только ухудшает ситуацию" это мой случай кстати.

novak пишет:

Я отлаживаюсь на софтсериале, потом переключаюсь на аппаратное.

Походу придётся делать так же, кстати были мысли изнчально развести плату под пины (Rx -> Tx, Tx -> Rx, GND -> GND), которые в "штатном" режиме замкнуты джамперами, но при снятии их накинув колодку можно шить и дуину и модем... Потом погонял чутка, вроде и так всё ровно работает и отказался от идеи. Теперь уже платы из китая получил, комплектуху, часть напаял.. вобщем поспешил.