Как сделать проверку контрольной суммы

Нет ответов
Alexx221988
Offline
Зарегистрирован: 11.02.2015
Здравствуйте! На Arduino.c написал такой простенький прием данных, где данные принимаются в виде $61\n , где $ начало пакета, \n конец пакета. В середине числа, например: 6- номер устройства , 1- команда на включение\либо трехзначная цийра для задания угла сервопривода.  В итоге получается мешанина -  в команду формируется и $6611  и 1611 и получается, что устройство и срабатывает не сразу и отключается не с первого раза. Как избежать этого?? Может проверять контрольную сумму пакета ?? 
#include <Servo.h> 


int pinLed = 13;
void setup() {
  Serial.begin(9600);
    String packet = "";
}

int getDevice(String p){
  return p.substring(0,1).toInt();
}
void rollservo(Servo servo, int pin, String packet){
     servo.attach(pin);
     int val = packet.substring(1,3).toInt();
     servo.write(val);
     packet = "";  
}
void rolldc(int pin, String packet){
         pinMode(pin,OUTPUT);
         int val = packet.substring(1,3).toInt();
         analogWrite(pin, val);
         packet = "";  
}
void rolllaser(int pin, String packet) {
      pinMode(pin,OUTPUT);
      if (packet.substring(1,2) == "1") {
        digitalWrite(pin, HIGH);
      }
      else{
        digitalWrite(pin, LOW);   } 
      packet = "";  
}

// Главный цикл
void loop() {
while (Serial.available())
{
if (Serial.read()== '$'){
break;
}
}

String packet="" ;
while (Serial.available())
{
packet = Serial.readStringUntil('\n');

//String pack = packet.substring(1,2);
//Serial.print(pack);
int device = getDevice(packet);
switch(device){

case 1:{ //ServoWW
Servo myservo1;
int pinServo1 = 8;
rollservo(myservo1,pinServo1,packet);}

break;
case 2:{ //Servo
Servo myservo2;
int pinServo2 = 9;
rollservo(myservo2,pinServo2,packet);}

break;
case 3:{ //DC motor
int pinDC1 = 1;
rolldc(pinDC1,packet);

}
break;
case 4:{ //DC motor
int pinDC2 = 2;
rolldc(pinDC2,packet);
break;}
case 5:{ //DC motor

int pinLaser1 = 10;
rolllaser(pinLaser1,packet);
break;}
case 6:{ //DC motor
int pinLaser2 = 13;
rolllaser(pinLaser2,packet);
// pinMode(pinLed,OUTPUT);
// digitalWrite(pinLed, HIGH);
break;}

}
}

}