Remote control (17 / 17 steg)
Steg 17: Uppdatera :) Seriell kommunikation protokoll
Eftersom den anslutning delen av min kod var inte så bra och jag sett att bilen får bara 1 från 5 paket med data att fjärrkontrollen sända den jag tryd att göra någon form av protokollet så bilen och remote skicka förfrågningar och ge feedback om data var komplett eller sånt och också kontrollera anslutningsstatus och försöka återansluta om frånkopplad.
På hårdvara delen jag la till 3 ledde på fjärrkontrollen, en indikera anslutningsstatus och de andra 2 när du sänder eller tar emot data, lysdioderna är ansluten till 3 digitala pins
Fjärrparten ansluta funktion:
void connect() {
IF(Serial.available() > 0) {
byte först = Serial.read();
IF(First == request_connect) {
Serial.flush();
Serial.write(OK);
connect_accepted = 1;
}
om (första == request_data & & connect_accepted == 1) {
anslutna = 1;
connect_accepted = 0;
Send_data();
}
}
}
Receiver(Car) sidan ansluta funktion:
void connect() {
IF(Serial.available() > 0) {
IF(Serial.Read() == ok) {
anslutna = 1;
Delay(10);
Serial.write(request_data);
Serial.flush();
}
}
annat {
Delay(100);
Serial.write(request_connect);
}
}
Som ni ser bilen skicka request_connect tills fjärrkontrollen skickar ett "ok" sedan bil uppsättningar anslutningen och skicka begäran om data. Fjärrkontrollen bara vänta på request_connect och ta bort resten av seriell data som kan vara tillgängliga (eftersom bilen bara skicka request_data varje 100ms tills det blir ok), skicka "ok" och uppsättningar connect_accepted sant så, bara bara när det får request_data ställer in anslutningen sant och start skickar data.
Fjärrparten anslutning funktion
void communication() {
om (connected){digitalWrite(ledConnected,HIGH);} //light upp connec ledde
annat {digitalWrite (ledConnected, låg);}
om (kör) {/ / kör, du kanna sätta den till false när du gör några setins i menyerna remote
IF(!Connected) {
last_time_recived = millis();
Connect();
}
IF(Connected) {
om (Serial.available() > 0) {
int first_byte = Serial.read();
lcd.setCursor(0,5); debug
LCD.Print(first_byte); debug
växel (first_byte) {
fall request_data:
last_time_recived = millis();
Send_data();
digitalWrite (ledSend, hög); Lys upp skicka ledde
bryta;
fall inkommande:
last_time_recived = millis();
Recive_data();
digitalWrite (ledRecive, hög); Lys upp emot ledde
bryta;
fall recived_ok: //case får du en registrerad ok feedback skicka begäran data
last_time_recived = millis();
Serial.write(request_data);
bryta;
fall err_max_packet_overflow: //case bilen säger du skicka för många byte
last_time_recived = millis();
Serial.flush();
lcd.setCursor(0,5); debug
LCD.Print("RRerr_max_packet"); debug
Send_data();
bryta;
fall err_data_overflow: //case bilen säger du skicka för många värden
last_time_recived = millis();
Serial.flush();
lcd.setCursor(0,6); debug
LCD.Print("RRerr_data_"); debug
Send_data();
bryta;
standard:
Serial.flush();
}
}
}
}
}
Mottagare communication() är nästan samma, jag lägger hela koden i en fil.
Fjärrparten send_data()
void Send_data() {
Serial.write(Incomming); Skicka en head's up så bilen kan gå till recive_data()
Serial.write(nr_data_send); nr av data att skicka (om mer skickas ett för många värden-fel)
Serial.write(Throttle); Skicka värdena
Serial.write(break_);
Serial.write(stear);
Serial.write(EEPROMReadInt(76)); läsa från eprom värdet
Serial.write(EEPROMReadInt(72));
}
Fjärrparten receive_data()
void Recive_data() {
IF(Serial.available() > 0) {
medan (Serial.available() > 0) {
Paket [Cur_Packet_Index ++] = Serial.read(); SAVEING data i en matris matrisen måste vara
Delay(2); tillräckligt länge för att lagra alla uppgifter
om (Cur_Packet_Index > = MaxPacketNum) {//send alltför många byte fel
Serial.write(err_max_packet_overflow);
Serial.flush();
lcd.setCursor(0,5); debug
LCD.Print("err_max_packet"); debug
Cur_Packet_Index = 0;
bryta;
}
}
om (paket [0]! = Cur_Packet_Index - 1) {//send för många värden fel
Serial.write(err_data_overflow);
Serial.flush();
lcd.setCursor(0,6); debug
LCD.Print("err_data_"); debug
}
annat {//save värden om inget fel
car_bat_motor = paket [1].
car_bat_controler = paket [2].
RPM = paket [3].
last_time_recived = millis(); Ange den tid referensen för time out för anslutning
Serial.write(recived_ok);
}
Cur_Packet_Index = 0;
}
}
Jag lägger här fjärrkontrollen och bil arkivera, uppdaterad och också bara meddelande filer för mottagaren en fjärrkontroll, och du kan hitta dem alla på google drive här