Передача данных между Arduino
- Войдите на сайт для отправки комментариев
Пт, 02/12/2016 - 00:32
Здравствуйте, собираю систему управления в машину. Состоит из центрального блока на меге и несколько блоков (нано) управления разбросанных по кузову. Все соединено по 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;} }}
А массив данных не проще составить? Ваш код не заработает. Передача данных в корне неправильная
Пробывал массив, та же история. В чем ошибка кода?
а, что это такое у тебя? (RS.available()>=1)
проверяет, есть ли данные в буфере
проверяет, есть ли данные в буфере
ок. перефразирую вопрос - это аппаратный UART контроллера?
нет, софтсериал это.
ок.
Мега перестала отправлять id. С слейва исходят правильные данные.
Мега перестала отправлять id. С слейва исходят правильные данные.
40-вую строку исправь
где ты там 40-ю строку увидел?
вот попробуйте код в конце темы работает передает параметры слейву и обратно принимает
с одним моментом я там не разобрался но эо не критично
http://arduino.ru/forum/programmirovanie/modbus-rtu
не обращайте внимание ... на каждом форуме есть местный клоун, хотя иногда пишет толковые вещи
где ты там 40-ю строку увидел?
ты ещё и тупой - покажи код, моё терпение не бесконечно
где ты там 40-ю строку увидел?
ты ещё и тупой - покажи код, моё терпение не бесконечно
все с тобой понятно, сгинь...
вот попробуйте код в конце темы работает передает параметры слейву и обратно принимает
с одним моментом я там не разобрался но эо не критично
http://arduino.ru/forum/programmirovanie/modbus-rtu
не обращайте внимание ... на каждом форуме есть местный клоун, хотя иногда пишет толковые вещи
так это протокол модбас?
да Modoos RTU
Если решите сделать обмен по протоколу, рекомендую воспользоваться этой темой:
http://arduino.ru/forum/proekty/sistema-avtomatizatsii-na-baze-arduino-umnyi-dom-umnaya-teplitsa-okhrannaya-signalizat
Ничего толком не получалось, решил перейти с софтсериал на хард. Просматривал разные протоколы, но мне не понравилось тем что там много лишнего в послании идет, а это ресурсы контроллера. Сделал свой простой, в начале и в конце по одинаковой цифре, при приеме они сравниваются, и если все ок, обработка данных. Но проблема оказалась в следующем. Если к мастеру подключать по одному блоку и заливать только одну функцию с работой этого блока, все работает как по маслу. Но если подключить второй слейв и залить функцию с обработкой и этого блока, начинаются проблемы. Работает медленно с тормозами, могут сбиваться данные. В слейвах я использовал функцию serialEventRun();. В мастере идет сначало опрос одного блока, затем обработка, далее второй блок опрос-обработка. В передачах данных чищу буфер, иначе кавасия будет. Может кто-то знает в чем проблема может быть, а то уже достала эта сеть.