Передача данных между Arduino

VXXXV
Offline
Зарегистрирован: 09.09.2016

Здравствуйте, собираю систему управления в машину. Состоит из центрального блока на меге и несколько блоков (нано) управления разбросанных по кузову. Все соединено по RS485. Когда сделал первый блок, сконектил к меге без проблем, затем сделал второй, подправил что-то в меге и все, данные теряются.
Менял только время между командами. Пробовал подстраивать сейчас, не получается. Затем подправил еще скетч, добавил проверку первого и последнего байта. В итоге снова какой то мусор.
Вот кусок кода slave:

if (RS.available()>=1){byte id=RS.read();
     if(id==30){digitalWrite(13,HIGH);//старт передачи
                delay(2);
                RS.write(IDcol),      
                RS.write(frost),    
                RS.write(abs(Tmp)),  
                RS.write(abs(tempd)),  
                RS.write(spray),    
                RS.write(Gal),      
                RS.write(int(MinT)),  
                RS.write(int(MaxT)),  
                RS.write(PWM1),      
                RS.write(PWM2),      
                RS.write(PWMS),      
                RS.write(AC),        
                RS.write(LS),        
                RS.write(HS),        
                RS.write(EST),        
                RS.write(IDcol);      
                delay(10);
                digitalWrite(13,LOW);}//стоп передачи
                }

А вот прием на мастере:

digitalWrite(13,HIGH);
delay(1);
Serial1.write(30);
delay(1);
digitalWrite(13,LOW);
delay(5);
if (Serial1.available()){   idcol = Serial1.peek();
                                if(idcol==30){
                                idcol = Serial1.read();
                                Frost = Serial1.read();
                                Tmp1 = Serial1.read();
                                Tmp2 = Serial1.read();
                                spray = Serial1.read();
                                Gal = Serial1.read();
                                MinT = Serial1.read();
                                MaxT = Serial1.read();
                                PWM1 = Serial1.read();
                                PWM2 = Serial1.read();
                                PWMS = Serial1.read();
                                AC = Serial1.read();
                                LS = Serial1.read();
                                HS = Serial1.read();
                                EST = Serial1.read();
                                IDcol = Serial1.read();
                                if(idcol==IDcol){ID30_OK=1;}else{ID30_OK=0;}
                               }}

 

Megawollt
Offline
Зарегистрирован: 06.12.2015

А массив данных не проще составить? Ваш код не заработает. Передача данных в корне неправильная

VXXXV
Offline
Зарегистрирован: 09.09.2016

Пробывал массив, та же история. В чем ошибка кода?

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

а, что это такое у тебя? (RS.available()>=1)

VXXXV
Offline
Зарегистрирован: 09.09.2016

проверяет, есть ли данные в буфере

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

VXXXV пишет:

проверяет, есть ли данные в буфере

ок. перефразирую вопрос - это аппаратный UART контроллера?

VXXXV
Offline
Зарегистрирован: 09.09.2016

нет, софтсериал это.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

ок.

if (Serial.availableForWrite() == 64) { // отправляем что-то в сериал, только когда буфер сериала полностью свободен, т.е. всё предыдущее успешно отправлено.
Serial.write(d); // здесь что-то пишем в сериал, но не не больше размера буфера сериала(64 или сколько там у тебя).
}

 

VXXXV
Offline
Зарегистрирован: 09.09.2016

Мега перестала отправлять id. С слейва исходят правильные данные.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

VXXXV пишет:

Мега перестала отправлять id. С слейва исходят правильные данные.

40-вую строку исправь

VXXXV
Offline
Зарегистрирован: 09.09.2016

где ты там 40-ю строку увидел?

 

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

вот попробуйте код в конце темы работает передает параметры слейву и обратно принимает

с одним моментом я там не разобрался но эо не критично

http://arduino.ru/forum/programmirovanie/modbus-rtu

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

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

VXXXV пишет:

где ты там 40-ю строку увидел?

 ты ещё и тупой - покажи код, моё терпение не бесконечно

VXXXV
Offline
Зарегистрирован: 09.09.2016

Клапауций 234 пишет:

VXXXV пишет:

где ты там 40-ю строку увидел?

 ты ещё и тупой - покажи код, моё терпение не бесконечно

все с тобой понятно, сгинь...

VXXXV
Offline
Зарегистрирован: 09.09.2016

Baks пишет:

вот попробуйте код в конце темы работает передает параметры слейву и обратно принимает

с одним моментом я там не разобрался но эо не критично

http://arduino.ru/forum/programmirovanie/modbus-rtu

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

так это протокол модбас?

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

да Modoos RTU

SmartRnd
Offline
Зарегистрирован: 13.09.2016

Если решите сделать обмен по протоколу, рекомендую воспользоваться этой темой:

http://arduino.ru/forum/proekty/sistema-avtomatizatsii-na-baze-arduino-umnyi-dom-umnaya-teplitsa-okhrannaya-signalizat

VXXXV
Offline
Зарегистрирован: 09.09.2016

Ничего толком не получалось, решил перейти с софтсериал на хард. Просматривал разные протоколы, но мне не понравилось тем что там много лишнего в послании идет, а это ресурсы контроллера. Сделал свой простой, в начале и в конце по одинаковой цифре, при приеме они сравниваются, и если все ок, обработка данных. Но проблема оказалась в следующем. Если к мастеру подключать по одному блоку и заливать только одну функцию с работой этого блока, все работает как по маслу. Но если подключить второй слейв и залить функцию с обработкой и этого блока, начинаются проблемы. Работает медленно с тормозами, могут сбиваться данные. В слейвах я использовал функцию serialEventRun();. В мастере идет сначало опрос одного блока, затем обработка, далее второй блок опрос-обработка. В передачах данных чищу буфер, иначе кавасия будет. Может кто-то знает в чем проблема может быть, а то уже достала эта сеть.