Связь Ардуин по Software Serial

gonzales
Offline
Зарегистрирован: 13.07.2015

Доброго времени суток!

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

Так вот, пока на мастере создан один SoftwareSerial все работает, но как только создаю их два, появляются проблемы. В справке вычитал, что для переключения портов на прослушку нужно использовать функцию listen(), но при ее использовании не читает ни из какого порта. Если же ее убрать, то читает только их последнего проиниализированного порта (это ожидаемо и понятно)

Кто-нибудь сталкивался с чем-то похожим?

Да, пины, которые я использую на мастере -  (A3,A4) и (A1, A2), по отдельности обе комбинации работают, вместе нет. Скорости пробовал 4800 и 9600, результат один.

Заранее спасибо за ответы

rkit
Онлайн
Зарегистрирован: 23.11.2016

Используй i2c

b707
Онлайн
Зарегистрирован: 26.05.2017

или rs485 или can

gonzales
Offline
Зарегистрирован: 13.07.2015

Про i2c - я уже думаю, но все-таки вопрос про Software Serial, ведь даже пример есть в штатной библиотеке, но не работает, вопрос - почему?

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

я щас везде леплю JDY-40.  Где надо и где не надо. 

b707
Онлайн
Зарегистрирован: 26.05.2017

gonzales пишет:

вопрос про Software Serial, ведь даже пример есть в штатной библиотеке, но не работает, вопрос - почему?

вы можете сделать этот вопрос предметом своей диссертации... но если вам нужен просто результат. я бы советовал забыть про использование более одного СофтСериала за раз. Он один-то не слишком надежно работает.

rkit
Онлайн
Зарегистрирован: 23.11.2016

gonzales пишет:

вопрос - почему?

Вопрос в спортлото. Никто не знает что ты там сотворил, и ты не удосужился показать. Так что прекрати тратить свое и чужое время, а используй правильное решение.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

gonzales пишет:
вопрос - почему?

Ответ "по кочану". Ну, или точнее, у Вас неправильно соединён зелёный провод и очевидная ошибка в строке №33 скетча приёмника и в строке №13 скетча передатчика.

gonzales
Offline
Зарегистрирован: 13.07.2015

Как говАривал мой старик - отец, прежде чем он покинул этот гавЕный мир, никогда не гоняйся за бабами и автобусами, а еще не спашивай ничего серьезного у зевак и туристов, все равно тебе никто не поможет, только будут соревноваться в своем сногсшибательном юморке. Ребята, я чуть не надорвался, как вы это делаете, научите))). Тут тебе и диссертация, и спортлото, и "по качану", прям джекпот отхватил. Для полного счастья не хватило только сырым мясом по морде...

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

SoftwareSerial only has one internal buffer. Yes, you can have multiple SoftwareSerial objects in existence, but only one of them controls the internal buffer. When any RX pin gets asserted, that generates an interrupt, but only the listen()ing RX pin gets checked for a start bit.

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

rkit
Онлайн
Зарегистрирован: 23.11.2016

gonzales пишет:

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

gonzales пишет:

решил проблему, перейдя к модели мастер-слейв

Я бы дополнил отца: не спрашивай вопросы вообще, это не твое.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

gonzales пишет:

отец, ... не спашивай ничего серьезного у зевак 

Видимо, он Вас так и учил спрашивать: "я тут сделал одну хрень, схему и скетч показывать не буду, так вот она не работает, почему?".

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

В любой непонятной ситуации - бухай.  Помогает. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

gonzales пишет:

По существу, я разобрался в проблеме...

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

Возникает 2 законны вопроса:

1. А почему Вы не сделали так с самого начала?

2. Откуда форумчанам знать, в чем Ваша ошибка, если Вы не привели кода?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

В любой непонятной ситуации - бухай.  Помогает. 

А Мусоргский - бухал! Т.Шаов )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

gonzales пишет:

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

а вот интересно, можно ли тут попробовать применить механизм борьбы за общую шину аналогичный передаче через Ethernet

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:
применить механизм борьбы за общую шину
Лучше за мир во всём мире.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:
применить механизм борьбы за общую шину
Лучше за мир во всём мире.

я за!