Помогите разобрать. К Leonardo подключил MAX485 2 шт. Через преобразователь подключил к компьютеру. Программой COM Port Toolkit 4.0 шлю запросы (06 03 00 01 00 02 94 7C и 03 03 00 01 00 02 94 29 ) в порт. Все хорошо если подключено 1-о устройство. Но как только я подключаю 2-е, Первое приходить с лишними байтами а второе вообще не отвечает. Код (C++): #include <EEPROM.h> #include <SoftwareSerial.h> #include "crc_modbus.h" #include "func.h" SoftwareSerial RS485(8, 9); const uint8_t ENABLE_PIN = 10; uint8_t r[8]; uint8_t sendr[9]; long portspeed = 9600; double randomDouble; void setup(void) { RS485.begin(portspeed); pinMode(ENABLE_PIN, OUTPUT); digitalWrite(ENABLE_PIN, LOW); // переводим модуль в режим приёма данных delay(100); } void loop() { //digitalWrite(ENABLE_PIN, LOW); // переводим модуль в режим приёма данных //delay(16); if (RS485.available() >= 8) { // если в последовательном порту есть данные для чтения, то ... RS485.readBytes(r, 8); if (r[0] == EEPROM.read(0)) { if (r[1] == 03) { RS485.end();//Очищаем буфер обмена RS485.begin(portspeed);//инициализируем порт. randomDouble = random(-3000, 3000); gx.gxval = randomDouble; sendr[0] = EEPROM.read(0); sendr[1] = r[1]; sendr[2] = 4; sendr[3] = gx.gxd[3]; sendr[4] = gx.gxd[2]; sendr[5] = gx.gxd[1]; sendr[6] = gx.gxd[0]; unsigned short crc22 = CRC16_MB(sendr, 7); c.cval = crc22; //Котрольная сумма sendr[7] = c.cd[0]; sendr[8] = c.cd[1]; digitalWrite(ENABLE_PIN, HIGH); // переводим модуль в режим передачи данных delay(16); for (int e = 0; e < 9; e++) { //9 количество значений в массиве. RS485.write(sendr[e]); } digitalWrite(ENABLE_PIN, LOW); // переводим модуль в режим приёма данных delay(16); } } else { digitalWrite(ENABLE_PIN, LOW); // переводим модуль в режим приёма данных delay(16); } } }
Я вопроса не понял. У меня нет объяснения этому феномену. Может условия не правильны в программе, считывание входящего пакета, переключения MAX485 на считывание и запись, может физическое подключение не верное но пока я это исключаю, когда подключено 1-о устройство ответ получаю нормально.
Сейчас я RAW на питание посадил. Если честно все ровно не работает с 2-я подключенными Leonardo. Но у меня 5В 2А питание может не хватает, пишут надо 7-9В
попробуйте там сами проследить, какая перемычка куда идет... получается? Не издевайтесь над людьми, учиться рисовать схемы все равно надо, раз ардуиной увлеклись
Код (C++): #include <EEPROM.h> #include <SoftwareSerial.h> #include "crc_modbus.h" #include "func.h" SoftwareSerial RS485(8, 9); const uint8_t ENABLE_PIN = 10; long portspeed = 9600; unsigned char buffer[8]; void setup(void) { RS485.begin(portspeed); pinMode(ENABLE_PIN, OUTPUT); digitalWrite(ENABLE_PIN, LOW); // переводим модуль в режим приёма данных delay(100); //EEPROM.write(0, id); } void loop() { //digitalWrite(ENABLE_PIN, LOW); // переводим модуль в режим приёма данных //delay(16); if (RS485.available() >= 8) { // если в последовательном порту есть данные для чтения, то ... RS485.readBytes(buffer, 8);//считываем символы, поступающие через последовательный порт. прекращает свою работу после обработки заданного количества символов. uint8_t id = 0x0C; //uint8_t id = 0x10; for (int f = 0; f < 8; f++) { if (buffer[f] == id) { digitalWrite(ENABLE_PIN, HIGH); // переводим модуль в режим передачи данных delay(16); for (int l = 0; l < 8; l++) { RS485.write(buffer[f + l]); } delay(16); digitalWrite(ENABLE_PIN, LOW); } } } } Упрастил код не использую EEPROM память, У меня пока работает
Начинаю использовать EEPROM не работает. Есть у кого идея как хоронить ID устройства с возможностью изменения не использую EEPROM память? Что бы после перезагрузки не слетела.
Я по фото не гадаю. Возможно, что здесь найдётся любитель реверс-инжиниринга, но мне оно не надо. Уважайте других.