32U4 одновременно Serial и Serial1

leshak
Offline
Зарегистрирован: 29.09.2011

Вообщем понадобилось на pro micro (аналог леонардно) пообщатся через UART с внешним модулем.
Естественно, по привычке, решил вначале убедится что он работает...
Вливаем стандартный скетч, которые копирует все между Serial <--> Serial1

void setup(){

  while(!Serial){;} // for leonardo
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop(){
  // Копируем Serial1 --> Serial
  if(Serial1.available()){
    Serial.write(Serial1.read());
  }
  // Копируем Serial --> Serial1
  if(Serial.available()){
    Serial1.write(Serial.read());
  }

}

, замыкаем RX/TX посылаем что-то в Serial мониторе и ждем эхо.... (значит все норм).

Но.... у меня образовалась "тишина". Ничего не приходит.

Взля мегу (у нее тоже есть Serial1). Влил в нее этот скетч, замкнул ее rx1/tx1 - есть эхо. Значит скетч рабочий..

Влил этот скетч одновременно и в pro micro и в мегу. Соеденил, накрест их rx1/tx1 меги с rx0/tx0 pro micro - опять все данные ходят (строчка посланна в сериал мониторе меги - печатается в мониторе микры, и наоборот).

То есть.... порт на pro micro работает. И посылает, и принимает...
Почему же он не слышит "сам себя", когда rx0/tx0 коротим?

Методом научного тыка, добавил вот такую строчку

void setup(){

  while(!Serial){;} // for leonardo
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop(){
  // Копируем Serial1 --> Serial
  if(Serial1.available()){
    Serial.write(Serial1.read());
  }
  // Копируем Serial --> Serial1
  if(Serial.available()){
    Serial.write('-'); // Ну вот нафига это? На что это влияет?
    Serial1.write(Serial.read());
  }

}

Добавил выделенную строку... и он услышал сам себя!!!!
Теперь когда я посылаю, что-то типа
"123"

В ответ приходит "---123"  (хотя ожидал что будет  "-1-2-3", но то наверное буферы так шалят, хотя... тоже не понятно).

А если убрать Serial.write('-'), то опять тишина полная.

Вообщем у кого-нибудь есть идеи "что это может быть?". Получается что Serial и Serial1 не могут работать одновременно?  Или получается (хотя тоже "не получается") что я не могу передавать и принимать данные и есть шанс что я "буду что-то трять".
Вообщем: что происходит-то, а?????

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

буфер? попробуй скорость увеличить

leshak
Offline
Зарегистрирован: 29.09.2011

Puhlyaviy пишет:

буфер? попробуй скорость увеличить

Вообщем-то с "больших скоростей" я и начинал. Это я уже спустился вниз в процессе эксперементов.
Да и.... в конце концов он же "должен заполнится". А тут все уходит в дев-нулл.
Да и чем, в случае вины буффера, помогает Serial.write('-'), если сами данные я пихаю в Serial1? Как оно вообще взаимосвязанно может быть?
Кстати пихать строки "подлинней", вместо Serial1.write(Serial.read())  делать вообще что-то типа Serial1.write("Yo-ho-ho-ho") пробовал.... "тишина". Причем именно когда я это "yo-ho-ho" кидаю именно по if(Serial.avaliable())
А вот.... если я просто делаю Serial1.write("Hello"), через millis() раз в секунду.... то это "Hello", замечательно эхом возвращается. Даже когда нет никаких магических Serial.write('-');

И, опять-таки, если в этот момент все-таки пускать делать "копируем Serial->Serial1", то все что я посылаю руками - продолжает терятся. А "Hello-шки" - идут. Если бы дело было в "буффере", то мне кажется хеллошки, все-таки "протолкнули бы" мои данные. Должны они быть видны среди них...
Кстати.. иногда они там действительно видны. Раз в несколько минут вдруг "проскакивают". Пару раз еще и "левый мусор" видно было.
Простов от это "нестабильное" уже не стал выкладывать. Описал то что "четко воспроизводится" и имеет непонятную природу...
 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

А вот как вариант попробуй иницилизировать сначала сериал1, а потом обычный сериал. Я помню у нас было что то подобное с дунькой. там сериал тоде через узб реализован и с бубнами запускался.

leshak
Offline
Зарегистрирован: 29.09.2011

Puhlyaviy пишет:

А вот как вариант попробуй иницилизировать сначала сериал1, а потом обычный сериал.

Так Serial1 у леонарды это и есть "обычный хардварный", а Serial - то USB-шный.

Да и... вот когда RX0/TX0 воткнуты в мегу. Данные же ходят.. значит "все инициализировалось".
И регулярные serial.println(millis()) видно хорошо (значит с USB-шным все в порядке).

Вообщем нефига не понимаю "что это может дать", но попробую, конечно. Все равно собственных идей пока других нет.

leshak
Offline
Зарегистрирован: 29.09.2011

leshak пишет:

Вообщем нефига не понимаю "что это может дать", но попробую, конечно. Все равно собственных идей пока других нет.

Переставил местами Serial1.begin и Serial.begin - ничего не изменилось в поведении.

Шо же это за пакость такая?  И, главное, непонятно где и когда она еще может "вылезти".

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

ну насколько я себе понял там заморочки именно с тем сериалом который через узб. как то у них там это дело через зад реализовано.а чего на буржуинском форуме пишут?

leshak
Offline
Зарегистрирован: 29.09.2011

Puhlyaviy пишет:

ну насколько я себе понял там заморочки именно с тем сериалом который через узб. как то у них там это дело через зад реализовано.а чего на буржуинском форуме пишут?

А фиг его знает. Непонятно даже "что загуглить", все врямя попадаю либо на советы типа

while(!Serial);

Либо реальные косяки в самом скетче типа:

Serial.write(Serial.read());

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

leshak пишет:

А фиг его знает. Непонятно даже "что загуглить", все врямя попадаю либо на советы типа

while(!Serial);

Либо реальные косяки в самом скетче типа:

Serial.write(Serial.read());

ну как вариант попробуй delay воткни между приемом с одного порта и отправкой в другой. посмотри что будет

leshak
Offline
Зарегистрирован: 29.09.2011

Puhlyaviy пишет:

ну как вариант попробуй delay воткни между приемом с одного порта и отправкой в другой. посмотри что будет

Да я его себе разве что в ж... не втыкал :(

Ладно, будет время нужно будет еще всяких digitalWrite натыкать и на лог.аналайзером посмтореть, что же именно глючить Serial1.write, Serial.available или Serial.write...

Пока меня устраивает что "с другим устройством" вроде нормально нормально работает (и нужно это устройство сейчас мучать). Просто неприятно такие загадки оставлять "за спиной". Не понимая ее причины не знаешь где еще вылезет этот прикол. А "бага" - явно имеет место быть.

leshak
Offline
Зарегистрирован: 29.09.2011

Нашел вот такой работающий воркараунд:

while(Serial1.available() && buffIndex<BUFF_SIZE){
    buff[buffIndex++]=Serial1.read();
  }
  Serial.write(buff,buffIndex);
  buffIndex=0;

Через промежуточный буффер.

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

В итоге выяснилось, что "проблема в железе". D1 нога померла. Причем, зараза, помирала "постепенно". Дня три. То работает, то не работает. Через Serial1.write - то есть на ней импульсы, то нету... Делаю блин с помощью digitalWrite.... - меняет состояние...(логическим анализатором смотрел).
Чуть головой не рохнулся.
В конце концов "смилостивилась" и окончательно умерла. Навсегда стала в состояние HIGH.
 

pinMode(1,OUTPUT);
digitalWrite(1,LOW);
Serial.println(digitalRead(1));

Выводит стабильно "1". (и анализатор тоже самое говорит).

Пришлось лезть в закрома за другой pro micro.
Случайно влил в нее скетч "без копирования через буффер". Обычный Serial.write(Serial1.read()) - и все работат.

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

RIP гыыы

leshak
Offline
Зарегистрирован: 29.09.2011

Puhlyaviy пишет:
RIP гыыы

Ага. А потом когда читаешь в "ищу исполнителя", что "да тут опытному на пол-часа работы".
Вот попробуй потом объясни такому что колом можно встать на три дня на строчке
 

Serial.write(Serial1.read());

Причем на строчке, которую уже "100 раз писал". На строчке которую, естественно, ни в какие риски и "непредвиденные трудности" - закладывать не будешь.
И что "опытный", это как раз тот кто не "оставит за спиной" (вроде работает - и ладно), а все-таки будет долбить как дятел пока не выяснит источник непонятки  (ну а если бы устройство вот такое уехало пользователю?  и оно бы "домерло" у него уже?)

P.S. Видите, "нудность" это не всегда плохо :)

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Угу. Я плохой, а нудный лешак хороший. Ыыы

123dmitri123
Offline
Зарегистрирован: 20.11.2013

Puhlyaviy пишет:
Угу. Я плохой, а нудный лешак хороший. Ыыы

Ахахаха)))

alexbmd
Offline
Зарегистрирован: 15.01.2016

вопрос на примере обсуждаемой платы, но вероятно он относиться ко всем ардуино с железным Serial

заметил вчера следующую особеность

void setup() {
  Serial.begin(115200); //This pipes to the serial monitor
  while (!Serial);
  Serial1.begin(115200); //This is the UART, pipes to sensors attached to board
  while (!Serial1);
}
...
if (!Serial1)  //If it offline switch power on
...

if всегда возращает true. т.е. не получается по if определить если внешний модуль на связи (online) с ардуиной.

serial.available понятно будет нуль. но это не проясняет ситуацию: просто нет данных в эфире или внешний модуль в отключке.

да можно написать тестовый программный анализатор общения но это тоже самое как определять живой человек или нет, не методом замеров пульса, сердцебиения или дыхания а анализируя ответы на поставленные вопросы :) сколько вам лет, где вы родились, как вас зовут 

как можно просто и надежно определять если внешний модуль готов к сериал обмену ?

alexbmd
Offline
Зарегистрирован: 15.01.2016

читая в 22ой раз статьи и форумы про Serial понимаю что отличать отсутсвие данных на входе от отсутсвия самого девайса (обесточен или даже питание есть, инициализирован но не настроен Serial)  Arduino не умеет. все сводиться к опросу девайса, даже если он молчит.

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

 

придеться писать функцию живучести..

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Только пинговать периодически