Close

Bezdrátová komunikace

Úvodní stránka Fórum Vaše projekty Arduino Bezdrátová komunikace

  • Toto téma obsahuje celkem 9 odpovědí. Do diskuze (3 diskutující) se naposledy zapojil uživatel alan a poslední změna proběhla před 6 roky a 7 měsíci.
Aktuálně je na stránce zobrazeno 10 příspěvků - 1. až 10. (celkem z 10)
  • Autor
    Příspěvky
  • #6590
    alan
    Účastník

    Dobrý den,
    mám vytvořenou bezdrátovou komunikaci mezi Matlabem a arduinem uno, pomocí bluetooth HC 05. Z matlabu posílám čísla např. 123 ty obdržím do arduina a následně pošlu zpět do matlabu, kde je vypíšu. S tímto krokem nemám problém.
    Ale nyní musím poslat nějaký string z arduina do amtlabu například „e“. Tento string bych měl porovnat v matlabu a následně být schopen poslat další čísla z matlabu do arduina. S tímto krokem si nevím rady, protože místo toho, aby mi to poslalo „e“ jen jednou posílá mi to pořád dokolo nebo se to sloučí s předešlýma číslama a vznikne (1e2e3e), tím pádem nejsem schopen to porovnat v matlabu a poslat mu další čísla. Kód z arduina je níže, mám tam danou jen pauzu, aby nejdřív poslal daná čísla a až pak string“e“, ale i tak se to sloučí, nehledě na to, jak dlouhá ta pauza je.

    byte byteRead;
    
    void setup() {
      // put your setup code here, to run once:
    Serial.begin(9600);
    
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
    
      
      
      
      if(Serial.available( )){
      byteRead = Serial.read();
      Serial.write(byteRead);
      delay(20000);
      Serial.write("e");
      }
    }
    
    #6591
    alan
    Účastník

    Ještě pro vysvětlení by to mělo být takhle

    1. nejdříve odeslat 123 z amtlabu do arduina a ihned zpátky do maltabu
    2. spoté poslat string „e“ z arduina do matlabu
    3. tento string porovnám v matlabu a odešlu další čísla do arduina

    #6592
    posjirka
    Účastník

    Navrhni si komunikační portokol.
    asi bych šel cestou netisknutených znaků.
    Postě jeden znak bude označovat začátek komunikace, druhý konec komunikace.
    Třeba Char(1) bude začátek, char(2) bude konec. Vše mezi tím je string.

    #6593
    alan
    Účastník

    Jde o to, že ta posloupnost čísel bude vždy jiná. Takže nemůžu nastavit natvrdo o bude začátek a co konec komunikace. Jinak nevím co jste tím myslel.

    #6594
    Zbyšek Voda
    Správce

    Řekl bych, že tím Posjirka myslel to, že si vyberete dva znaky, které budou ohlašovat začátek a konec posílaného řetězce – ty budou vždy stejné, ať budete posílat cokoliv.

    Aby nemohlo dojít k tomu, že budete posílat data, která by mohla obsahovat počáteční, či koncový znak, navrhuje použít netisknutelné znaky – například ty, které mají v ASCII tabulce hodnotu 1 a 2. char(1) a char(2) tedy reprezeentují dva znaky s touto hodnotou.

    Mějme tedy dva znaky:

    char start = char(1);
    char stop = char(2);

    Obě strany pak budou vědět, že to, co přijaly mezi znaky 1 a 2 je požadovaná zpráva.
    Tedy pošlete start data stop.

    Lepší? 🙂

    #6596
    alan
    Účastník

    Abych byl upřímný, tak úplně nevím co máte namysli nebo jak to mám zakomponovat do programu. Měl bych tedy na začátku programu vytvořit, ty proměnné

    char start = char(1);
    char stop = char(2);
    

    A poté upravit to přijímání a odesílání?

    
     if(Serial.available( )){
      byteRead = Serial.read();
      Serial.write(start);
      Serial.write(byteRead);
     Serial.write(stop);
      delay(20000);
      Serial.write("e");
    
    
    #6600
    posjirka
    Účastník

    to je přesně ono …
    a na druhé straně čekáš na přijem znaku „start“, pak budeš číst všechno ve smyčce dokud nepřijmeš znak „stop“

    #6601
    Zbyšek Voda
    Správce

    Takže to bude spíš něco jako:

    if(Serial.available()){
    	prijato = Serial.read();
    	if(prijato == start){
    		prijato = Serial.read();
    		while(prijato != stop){
    			prijato = Serial.read();
    			//zpracování přijatých dat
    		}
    	}
    }
    #6602
    alan
    Účastník

    Nevím proč, ale když nechám v arduinu jen `byte byteRead;

    void setup() {
    // put your setup code here, to run once:
    Serial.begin(9600);

    }

    void loop() {
    // put your main code here, to run repeatedly:

    if(Serial.available( )){
    byteRead = Serial.read();
    Serial.write(byteRead);`
    Přečte a odešle mi to jednotlivá čísla dohromady. Tudíž, když zadám třeba i posloupnost dlouhoo(123456789), zobrazí se to i ve stejném pořadí. Když jsem zkoušel upravit kod v arduinu podle vašich rad, tak už v sériovém monitoru mi to ukazovalo ty prázdné znaky postupně „1 2 3 4“. Takže i kdyby se mi to povedlo úspěšně načíst v matlabu, tak by to odeslalo dřív další posloupnost než je potřeba. Myslím si, že je problém jen v arduinu, tam prostě potřebuji přijat ty čísla dohromady, pak je i dohromady odeslat. Počkat chvíli a odeslat nějaký indikátor, který budu schopný v matlabu načíst, když ho načtu, tak azdám další posloupnost čísel z klávesnice.
    Dám sem ještě originální kód, který používám v matlabu, ještě bez toho kroku kde má porovnat string nebo netisknutelný znak.

    
    clear all;
    clc;
    
    b=Bluetooth('HC-05', 1); %vytvoreni bluetooth objektu
    
    i = input('Zadej posloupnost: ','s'); % Zadávání číselné posloupnosti z klávesnice
    fopen(b); %otevreni komunikace
    
    fwrite(b,i); %zapis ciselne posloupnosti
    
    d = fscanf(b, '%s');   % oskenovani prijatych dat
           
       
       disp('Zadana posloupnost: '); %vypise na monitor
        disp(d);
    
        fclose(b);
        
    #6617
    alan
    Účastník

    Zkoušel jsem také přidat další funkci níže v programu poslat. Dal jsem tam pauzu 20 vteřin než se pošle „end“. Ale mám s tím podoboný problém, Tentokrát jsem schopen odeslat čísla najednou ale celý program čeká 20s. Místo toho aby mi to nejdříve odeslalo čísla 123 a pak po 20s end, tak mi to odešle end a až pak čísla a pak znovu po 20 vteřinách end. Což nechápu, protože nedjříve volám void loop a az pak void poslat.
    end
    123

    end

    
    void setup (){
      Serial.begin(9600);
      Serial.flush();
      digitalWrite (13, HIGH);      //turn on debugging LED
    }
    
    void loop (){
    
      int i=0;
      char commandbuffer[100];
    
      if(Serial.available()){
         delay(100);
         while( Serial.available() && i< 99) {
            commandbuffer[i++] = Serial.read();
         }
         commandbuffer[i++]='\0';
      }
    
      if(i>0)
         Serial.println((char*)commandbuffer);
         
    poslat();
    }
    
    void poslat(){
      
      delay(20000);
      Serial.println("end");
    
      
    }
    
    
Aktuálně je na stránce zobrazeno 10 příspěvků - 1. až 10. (celkem z 10)
  • Pro reakci na toto téma se musíte přihlásit.