Передача данных между Arduino
Здравствуйте, собираю систему управления в машину. Состоит из центрального блока на меге и несколько блоков (нано) управления разбросанных по кузову. Все соединено по 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;}
}}
Re: Передача данных между Arduino
Я обычно перед началом пакета отправляю идентификатор из 3-х символов
Например: "cm="
Так как пакет может покалечится в силу разных причин и последовательность данных нарушится
Выглядит примерно вот так:
Код:
void loop()
{
if (UART_ReadByte(inByte))
{
if ( packid == 16 ) // контрольная сумма команды cm=
{
packid=0;
switch (inByte) // Смотрим какая команда пришла
{
case 'U': // Серва поднимается
if(i > min_pos) myservo1.write(i -= step_servo);
break;
case 'J': // Серва опускается
if(i < max_pos) myservo1.write(i += step_servo);
break;
case 'K': // Серва поворачивается вправо
if(i2 > min_pos) myservo2.write(i2 -= step_servo);
break;
case 'H': // Серва поворачивается влево
if(i2 < max_pos) myservo2.write(i2 += step_servo);
break;
case 'C': // Клаксон
horn();
break;
case ']': // запрос состояния аналоговых датчиков
byte2char(A6_Read,A7_Read);
break;
case 'V': // Включить/Выключить фары
D9_Low;
break;
} else packet_id(inByte);
//**************************************************
void packet_id(uint8_t inbyte) //проверяем идентификатор пакета "cm="
{
switch (inbyte)
{
case 'c':
packid=2;
break;
case 'm':
packid*=2;
//packid=packid<<1;
break;
case '=':
packid*=4;
//packid=packid<<2;
break;
default:
packid=0;
}
}
Код взял здесь
Работает безотказно, проверенно мной
Вложений: 2
Re: Передача данных между Arduino
Дело в том, что даже идентификаторы от слейва неправильные.
Вложение 19070
Красным идентификаторы (30), синим не правильные данные, вместо первого 255, должен быть ноль.
Изменил скорость на 9600. В первых строках при запуске монитора порта все окей, но потом начинается мусор
Вложение 19069
Re: Передача данных между Arduino
нужно весь код смотреть, что бы ошибку найти
Re: Передача данных между Arduino
Код:
//Охлаждение
float Tmp;
int Tmp2, Tmp1;
byte TGau, MinT, MaxT, PWM1, PWM2, PWMS,spray,Gal,AC,LS,HS,EST,Frost;
byte ID30_OK, IDcol, idcol;
//дисплей
String forNext;
String inStr = ""; // приемник информации от Nextion
//Свет
byte BS_set,BS_NF,DS_set,DS_NF,GAB_set,PTF_set,DRL_set,DRL_30,EPR;// Исходящие данные
byte Tout1,Tout2,BS_uNF,BS_uset,DS_uNF,DS_uset,GAB_uset,PTF_uset,POV_u,POWER,DRL_u;// Входящие данные
void printNextion(const char* data, String top, String page = "0"){
String spage = "page"+page+"."+top+".txt=\"";
Serial2.print(spage);
Serial2.print(data);
Serial2.print("\"");
Serial2.write(0xFF);
Serial2.write(0xFF);
Serial2.write(0xFF);
}
void printNextionVal(const char* data, String top, String page = "0"){
String spage = "page"+page+"."+top+".val=";
Serial2.print(spage);
Serial2.print(data);
Serial2.write(0xFF);
Serial2.write(0xFF);
Serial2.write(0xFF);
}
void setNextionCmd(const char* data){
Serial2.print(data);
Serial2.write(0xFF);
Serial2.write(0xFF);
Serial2.write(0xFF);
}
String readNextion(){
char _bite;
char _end = 0xff;//end of file x3
String cmd;
int countEnd = 0;
unsigned long start = millis();
while(Serial2.available()>0){
delay(5);
if(Serial2.available()>0){
_bite = Serial2.read();
cmd += String(_bite, HEX);
if(_bite == _end){
countEnd++;
}
if(countEnd == 3){
break;
}
}
}
return cmd;
}
void setup(){
Serial.begin(57600); // USB
Serial1.begin(9600); // ШИНА RS485
Serial2.begin(115200);// Nextion
pinMode(13,OUTPUT);
setNextionCmd("bkcmd=0");
}
void loop(){
/*****************************************************************************/
/* Прием данных от ID30 Cooler */
/*****************************************************************************/
digitalWrite(13,HIGH);
delay(1);
Serial1.write(30);
delay(1);
digitalWrite(13,LOW);
delay(45);
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;}
}}
else{Serial1.flush();}
Serial.print(idcol);
Serial.print(" ");
Serial.print(Frost);
Serial.print(" ");
Serial.print(Tmp1);
Serial.print(" ");
Serial.print(Tmp2);
Serial.print(" ");
Serial.print(spray);
Serial.print(" ");
Serial.print(Gal);
Serial.print(" ");
Serial.print(MinT);
Serial.print(" ");
Serial.print(MaxT);
Serial.print(" ");
Serial.print(PWM1);
Serial.print(" ");
Serial.print(PWM2);
Serial.print(" ");
Serial.print(PWMS);
Serial.print(" ");
Serial.print(AC);
Serial.print(" ");
Serial.print(LS);
Serial.print(" ");
Serial.print(HS);
Serial.print(" ");
Serial.print(EST);
Serial.print(" ");
Serial.print(IDcol);
Serial.print(" ");
Serial.println(ID30_OK);
Приемник, остальной код передачи на дисплей закоментин. Скорость на обоих ставлю одинаковые
Re: Передача данных между Arduino
возможно скорость порта не совпадает
Вложений: 1
Re: Передача данных между Arduino
снял данные через uart-usb на ноге RX1 mega2560
Вложение 19071