mrkovalchuk: case 2 наступает сразу же после отправки запроса. Вы успеваете 8 раз вызвать свой принт, прежде чем слейв ответит, а мастер примет ответ. Только после этого master.poll() обновит au16data, и выведется на девятый раз единичка. После второго запроса происходит то же самое, за исключением того, что единица в au16data осталась с предыдущего раза.
mrkovalchuk: да, электротехника - наука о контактах.
>Как посмотреть то, что получилось?
А что должно получиться? Сейчас слейв оцифровывает сигнал с 4 ножки и кладет в модбасный регистр по адресу 04. Мастер периодически этот регистр опрашивает. Вот и возьмите то, что он прочитал (au16data[] на мастере) и поглядите, корректные ли там значения. Потом попробуйте что-нибудь переслать в обратную сторону.
mrkovalchuk: вроде не видно. Но чтобы проверять код, нужно сперва убедиться, что железо работает. И хорошо бы от стадии "оно не работает" перейти к "оно работает, но не так, как надо".
mrkovalchuk:
Modbus slave(ID, 0, 0);
тут ошибка. Это конфиг для RS-232. Для RS-485 третьим параметром задаётся пин, который будет управлять направлением передачи.
>А сколько длится slave.pool()?
На именно вашем железе, с вашими настройками? Никто не скажет, проще измерить самостоятельно.
>Есть ли вероятность банального пропуска сигнала от мастера?
Если библиотеку писал не совсем дятел (а оно скорее всего так), данные, пришедшие через UART пишутся в какой-нибудь буфер. Сразу, по прерыванию. А потом уже slave.pool() их неспешно обрабатывает. Таким образом, если вызывать slave.pool() чаще, чем интервал опроса мастером, то пропуска пакетов не будет.
>Можно ли как-то обработать то, что получено от мастера?
Как именно? Вся полезная нагрузка (значения регистров modbus) доступна через au16data[], и вашему коду должно быть совершенно всё равно, как она туда попала, это личное дело библиотеки ModbusRtu. Поковыряться в сыром пакете? Лезьте в код библиотеки, в slave.pool(), ставьте обработчики там. Но зачем?
>Еще, можете, пожалуйста, объяснить эти три строчки?
После вдумчивого изучения спецификации modbus таких вопросов возникать не должно. Мастер в этом примере использует модбасную функцию 3 (Read Holding Registers, то есть чтение нескольких регистров слейва)
telegram.u16RegAdd = 1; // начиная с какого адреса он будет читать
telegram.u16CoilsNo = 4; // сколько прочтёт за раз
telegram.au16reg = au16data; // и куда положит прочитанное.
Spaceoddity: там не всё так просто. Представьте себе две фигуры в виде [ и ], сцепленные друг с другом. Они так и будут висеть, опираясь друг на друга, а должны упасть как единое целое.
Cлишком объемная? Да ладно, там кода 1-2 экрана, даже если с нуля писать. А можно взять какие-нибудь модули, вроде NRF24L01, у них адресация аппаратная, и есть библиотека под Arduino, где всё уже написано за вас.
#include "telepathy.h"
Еще может быть плохо подключена земля к контроллеру. Она замыкается либо через программатор, либо через кнопку и защитный диод внутри МК.
Изолирующие - имеется в виду электрически изолирующие. Такие, например, под высоковольтные транзисторы в БП ставятся. Эти прокладки тонкие, прозрачные, жесткие, обычно из слюды.
dimkabelkov: Поглядите на TI-шные чипы CC1x - CC2x: www.ti.com/lsds/ti/wireless_connectivity/simplelin...
Можно будет сделать вообще все на одном кристалле: и радио, и опрос датчиков. И сверхнизкое потребление заявлено. 20 лет от одной батарейки - как вам?
Японский Городовой:
> А вообще, странно что эти банкоматы не грабятся софтовыми средствами…
Грабятся. Вскрывают банкомату морду (она гораздо слабее, чем сейф), втыкаются в USB, через одну из многочисленных дыр винды получают системные права и подают на диспенсер команду на выдачу денег. Только это очень медленно - там 4 кассеты по 2000 банкнот, а диспенсер выдает по 20-50 банкнот за раз. Гораздо быстрее взломать сейф и унести все кассеты сразу.