Stap 17: Update :) Seriële communicatie protocol
Omdat het verbindingsdeel van mijn code niet zo goed was en ik gezien dat de auto ontvangen slechts 1 uit 5 gegevenspakket dat remote sturen ik tryd te maken een soort van protocol zodat de auto als de externe aanvragen sturen en feedback geven als de gegevens compleet was of soort dingen en ook de status van de verbinding en probeer opnieuw verbinden als de verbinding verbroken.
Op het hardware gedeelte dat ik heb toegevoegd 3 geleid op de afstandsbediening, een geven de status van de verbinding en de andere 2 bij het verzenden of ontvangen van gegevens, de LED's zijn aangesloten op 3 digitale pinnen
Remote kant sluit functie:
void connect(){ if(Serial.available() > 0){ byte first = Serial.read(); if(first == request_connect){ Serial.flush(); Serial.write(ok); connect_accepted = 1; } if (first == request_data && connect_accepted == 1){ connected = 1; connect_accepted = 0; Send_data(); } } }
Receiver(Car) kant sluit functie:
void connect(){ if(Serial.available() > 0){ if(Serial.read() == ok){ connected = 1; delay(10); Serial.write(request_data); Serial.flush(); } } else{ delay(100); Serial.write(request_connect); } }
Zoals u dat de auto de request_connect zien kunt totdat de afstandsbediening een "ok" dan de auto sets stuurt de verbinding en stuur gegevensaanvraag. De afstandsbediening gewoon wachten van de request_connect en verwijder de rest van seriële gegevens die mogelijk beschikbaar (omdat de auto Stuur request_data elke 100ms totdat het de ok), stuur de "ok" en sets connect_accepted true, maar alleen als het ontvangen de request_data verbinding waar en start verzenden gegevens ingesteld.
Remote kant verbinding functie
void communication(){ if (connected){digitalWrite(ledConnected,HIGH);} //light up the connec led else {digitalWrite(ledConnected, LOW);} if (running){ //running, you can set it to false when you make some setins in the remote menus if(!connected){ last_time_recived = millis(); connect(); } if(connected){ if (Serial.available() > 0){ int first_byte = Serial.read(); lcd.setCursor(0,5); //debug lcd.print(first_byte); //debug switch (first_byte) { case request_data: last_time_recived = millis(); Send_data(); digitalWrite(ledSend, HIGH); //light up the send led break; case incomming: last_time_recived = millis(); Recive_data(); digitalWrite(ledRecive, HIGH); //light up the receive led break; case recived_ok: //case you get a recive ok feedback send request data last_time_recived = millis(); Serial.write(request_data); break; case err_max_packet_overflow: //case the car say you send too many bytes last_time_recived = millis(); Serial.flush(); lcd.setCursor(0,5); //debug lcd.print("RRerr_max_packet"); //debug Send_data(); break; case err_data_overflow: //case the car say you send too many values last_time_recived = millis(); Serial.flush(); lcd.setCursor(0,6); //debug lcd.print("RRerr_data_"); //debug Send_data(); break; default: Serial.flush(); } } } } }
De communication() van de ontvanger is bijna hetzelfde, ik zet de gehele code in een bestand.
Remote kant send_data()
void Send_data(){ Serial.write(incomming); // send a head's up so the car can go to recive_data() Serial.write(nr_data_send); //nr of data to send (if more it will send a too many values error) Serial.write(throttle); // sending the values Serial.write(break_); Serial.write(stear); Serial.write(EEPROMReadInt(76)); // read from the eprom the value Serial.write(EEPROMReadInt(72)); }
Remote kant receive_data()
void Recive_data(){ if(Serial.available() > 0){ while (Serial.available() > 0) { packets[Cur_Packet_Index++] = Serial.read(); //saveing the data in an array the array must be delay(2); //long enough to store all the data if (Cur_Packet_Index >= MaxPacketNum){ //send too many byte error Serial.write(err_max_packet_overflow); Serial.flush(); lcd.setCursor(0,5); //debug lcd.print("err_max_packet"); //debug Cur_Packet_Index = 0; break; } } if(packets[0] != Cur_Packet_Index - 1){ //send too many values error Serial.write(err_data_overflow); Serial.flush(); lcd.setCursor(0,6); //debug lcd.print("err_data_"); //debug } else{ //save the values if no error car_bat_motor = packets[1]; car_bat_controler = packets[2]; RPM = packets[3]; last_time_recived = millis(); // set the time reference for time out connection Serial.write(recived_ok); } Cur_Packet_Index = 0; } }
Ik zet hier de afstandsbediening en de auto-bestanden, bijgewerkt en ook alleen de communicatie-bestanden voor de ontvanger die een remote, en u ze allemaal op google drive hier vinden kunt