Официальный сайт компании Arduino по адресу arduino.cc
Связь Ардуин по Software Serial
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Доброго времени суток!
Появилась необходимость наладить обмен данными между несколькими ардуинами, а точнее одна выступает в роли мастера, а две другие в роли слейвов. Решил сделать через Software Serial. Расстояние между ними минимальное.
Так вот, пока на мастере создан один SoftwareSerial все работает, но как только создаю их два, появляются проблемы. В справке вычитал, что для переключения портов на прослушку нужно использовать функцию listen(), но при ее использовании не читает ни из какого порта. Если же ее убрать, то читает только их последнего проиниализированного порта (это ожидаемо и понятно)
Кто-нибудь сталкивался с чем-то похожим?
Да, пины, которые я использую на мастере - (A3,A4) и (A1, A2), по отдельности обе комбинации работают, вместе нет. Скорости пробовал 4800 и 9600, результат один.
Заранее спасибо за ответы
Используй i2c
или rs485 или can
Про i2c - я уже думаю, но все-таки вопрос про Software Serial, ведь даже пример есть в штатной библиотеке, но не работает, вопрос - почему?
я щас везде леплю JDY-40. Где надо и где не надо.
вопрос про Software Serial, ведь даже пример есть в штатной библиотеке, но не работает, вопрос - почему?
вы можете сделать этот вопрос предметом своей диссертации... но если вам нужен просто результат. я бы советовал забыть про использование более одного СофтСериала за раз. Он один-то не слишком надежно работает.
вопрос - почему?
Вопрос в спортлото. Никто не знает что ты там сотворил, и ты не удосужился показать. Так что прекрати тратить свое и чужое время, а используй правильное решение.
Ответ "по кочану". Ну, или точнее, у Вас неправильно соединён зелёный провод и очевидная ошибка в строке №33 скетча приёмника и в строке №13 скетча передатчика.
Как говАривал мой старик - отец, прежде чем он покинул этот гавЕный мир, никогда не гоняйся за бабами и автобусами, а еще не спашивай ничего серьезного у зевак и туристов, все равно тебе никто не поможет, только будут соревноваться в своем сногсшибательном юморке. Ребята, я чуть не надорвался, как вы это делаете, научите))). Тут тебе и диссертация, и спортлото, и "по качану", прям джекпот отхватил. Для полного счастья не хватило только сырым мясом по морде...
По существу, я разобрался в проблеме, приведу ее описание, чтобы те кто столкнуться с такой же проблемой, понимали откуда ноги растут.
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" проверяется на наличие стартового бита. А это значит, что в реальных условиях хаотичной передачи данных даже по двум портам во входящем буфере будет каша. Поэтому я решил проблему, перейдя к модели мастер-слейв, то есть мастер переводит определенный порт в состояние "слушающего", посылает запрос, только после этого слейв посылает ответ, мастер дожидается ответа, после чего переходит ко второму порту. Проверил на трех одновременно работающих портах, все работает.
Появилась необходимость наладить обмен данными между несколькими ардуинами, а точнее одна выступает в роли мастера, а две другие в роли слейвов.
решил проблему, перейдя к модели мастер-слейв
Я бы дополнил отца: не спрашивай вопросы вообще, это не твое.
отец, ... не спашивай ничего серьезного у зевак
Видимо, он Вас так и учил спрашивать: "я тут сделал одну хрень, схему и скетч показывать не буду, так вот она не работает, почему?".
В любой непонятной ситуации - бухай. Помогает.
По существу, я разобрался в проблеме...
Поэтому я решил проблему, перейдя к модели мастер-слейв, то есть мастер переводит определенный порт в состояние "слушающего", посылает запрос, только после этого слейв посылает ответ, мастер дожидается ответа, после чего переходит ко второму порту. Проверил на трех одновременно работающих портах, все работает.
1. А почему Вы не сделали так с самого начала?
2. Откуда форумчанам знать, в чем Ваша ошибка, если Вы не привели кода?
В любой непонятной ситуации - бухай. Помогает.
А Мусоргский - бухал! Т.Шаов )))
Это в первоисточнике, переведя на русский, входной буфер у всех объектов софтовых портов один, поэтому, когда генерируется прерывание только "слушающий RX" проверяется на наличие стартового бита. А это значит, что в реальных условиях хаотичной передачи данных даже по двум портам во входящем буфере будет каша. Поэтому я решил проблему, перейдя к модели мастер-слейв, то есть мастер переводит определенный порт в состояние "слушающего", посылает запрос, только после этого слейв посылает ответ, мастер дожидается ответа, после чего переходит ко второму порту. Проверил на трех одновременно работающих портах, все работает.
а вот интересно, можно ли тут попробовать применить механизм борьбы за общую шину аналогичный передаче через Ethernet
я за!