Skocz do zawartości

Komunikacja kilka liczb rzeczywistych Arduino <-> PC


Mellon

Pomocna odpowiedź

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.