Как сделать проверку контрольной суммы
- Войдите на сайт для отправки комментариев
Ср, 11/02/2015 - 11:54
Здравствуйте! На 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;}
}
}
}