Skocz do zawartości

Komunikacja kilka liczb rzeczywistych Arduino <-> PC


Pomocna odpowiedź

Napisano

Mam pytanie. Chciałbym wykorzystać UART/USB do komunikacji Arduino - PC. Chciałbym aby na początku programu Arduino pobrać kilka liczb rzeczywistych - przypisać te wartości do zmiennych np float a,b,c. Wykonać program. Na końcu wysłać wynik do PC (też kilka liczb).

Jak zorganizować taką komunikację?

Chciałbym zabezpieczyć się przed sytuacją rozpoczęcia odbioru komunikatu, gdy jeszcze wszystkie liczby nie zostały wysłane.

kilka liczb rzeczywistych

Jaki zakres tych liczb?

Jedną z opcji jest przesyłanie liczb naturalnych w postaci binarnej (odpowiednio przeskalowanych liczb rzeczywistych), 'rozpakowanie' ich w Arduino i potem ponowne 'pakowanie' do postaci binarnej przed wysłaniem.

Czy sensowne byłoby wysyłanie wszystkich liczb całkowitych (przeskalowanych rzeczywistych) na raz?

Czy każdą liczbę osobno i na ich początku jakiś nagłówek?

Jeśli użyć stałej liczby cyfr binarnych dla każdej z liczb, to nie problem będzie rozpakować.

Do synchronizacji wysyłania i odbioru danych przydałaby się para sygnałów CTS i RTS.

Tak się zastanawiałem czy nie ma ustalonego protokołu komunikacyjnego wykorzystującego UART?

Witam

Albo nie rozumiem tematu albo za bardzo kombinujecie. Ja mam taki przykład do obioru poleceń z PC i przypisywanie jakimś zmiennym wartości:


#define buffsize 32
char input[buffsize];
uint16_t dane [4]; // jakie i ile  zmiennych odbieramy z UART
byte index = 0; 
boolean stringComplete = false;  // gdy cale polecenie/napis odebrany


void   parsujpolecenia()
 {
   //polecenie ma wygladac tak: cmd=zmienna1,zmienna2,zmienna3,zmienna4  z zalozenia sa to 4 liczby calkowite
   // do 5 cyfr, dlatego buffsize32 ma zapas, dla innych trzeba zmodyfikowac bufor, tablice zmiennych, funkcje
   // do konwersji napisu na liczby
   //cmd=234,342,553,3432

    uint8_t index=0;
   char * polecenie=input;
   Serial.print("Otrzymane polecenie: ");
   Serial.println(polecenie);

   char* command1 = strtok(polecenie, "=");

if (strcmp(command1 , "cmd")==0){  //sprawdzenie czy czesc przed znakiem = jest rowna cmd
while (command1 != 0)
{
Serial.println(command1);
command1 = strtok(NULL, ","); //dzielimy reszte napisu w miejscach gdzie jest ","

// Find the next command in input string
if(index<4) dane[index]=atoi(command1); //konwersja napisu na INT i zapisanie do kolejnej pozycji w tablicy
index++;
} 
}
 else Serial.println("Polecenie nieprawidlowe"); 
 Serial.println("Aktualne parametry:");
 Serial.print("Zmienna 1 = ");
 Serial.println(dane[0]);
 Serial.print("Zmienna 2 = ");
 Serial.println(dane[1]);
 Serial.print("Zmienna 3 = ");
 Serial.println(dane[2]);
 Serial.print("Zmienna 4 = ");
 Serial.println(dane[3]);
   stringComplete = false;
 }


// Arduino initialization function.
void setup() 
{
 Serial.begin(115200);
}


void loop() 
{ 

if (stringComplete) parsujpolecenia();
// Teraz mozna cos zrobic ze zmiennymi
}



void serialEvent() {
 while (Serial.available()>0) {

char aChar = Serial.read();
    if(aChar == '\n')
    {
      // wykryto znak konca linii \n, koniec odbioru
      input[index] = 0;
      index = 0;
      stringComplete = true;
    }
    else
    {
       input[index] = aChar;
       if(index<buffsize) index++;
       input[index] = '\0'; // Na koncu napisu wstawiamy 0   
    }
 }
}

Oczywiście jest to przykład, jeśli zamiast int mają być float to funkcja atoi() (ascii to int) zamienia się na atof(); jak liczby mają być dłuższe (przylatują z UART jako znaki char) to większy bufor, jak ma ich być więcej to większa tablica. Jest to na bazie przykładu Arduino Serial_Event. Można tu sporo wywalić, sporo dodać, np jakiś else if do wykonania obliczeń gdy początek zamiast cmd będzie oblicz.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...