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 8 roky a 8 měsíci.
-
AutorPříspěvky
-
17.4.2016 v 17:01 #6590alanÚč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"); } }
17.4.2016 v 17:04 #6591alanÚčastníkJeš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 arduina17.4.2016 v 21:08 #6592posjirkaÚčastníkNavrhni 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.18.4.2016 v 6:01 #6593alanÚčastníkJde 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.
18.4.2016 v 8:30 #6594Zbyšek VodaÚčastníkŘ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ší? 🙂
18.4.2016 v 19:36 #6596alanÚčastníkAbych 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");
18.4.2016 v 23:24 #6600posjirkaÚčastníkto 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“19.4.2016 v 10:46 #6601Zbyšek VodaÚčastníkTakž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 } } }
19.4.2016 v 16:37 #6602alanÚčastníkNeví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);
20.4.2016 v 17:10 #6617alanÚčastníkZkouš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
123end
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"); }
-
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.