Как сделать проверку контрольной суммы
- Войдите на сайт для отправки комментариев
Ср, 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;} } } }