Komunikacja telefonu z AVR.

0

Tworzę sobie pewien projekt. Telefon ma za zadanie wysyłać kilka liczb, AVR poprzez moduł bluetooth i UART je odbierać, i w drugą stronę też tzn. wysyłanie kilku liczb z AVR do telefonu. Czasami te liczby będą jednocyfrowe, czasami dwu lub trzy cyfrowe. Jak to zrobić aby zapewnić poprawną komunikację?
Zrobiłem coś takiego:
Android

 String s="<"; //znak < to tak początek ramki.
//Narazie dwie liczby , docelowo bedzie więcej.
 x = (int) sensorEvent.values[2];
 y = (int) sensorEvent.values[1];
 if(x<10) s+= "00"+x;
 else if(x<100) s+= "0"+x;
 else s+= x+"";
 if(y<10) s+= "00"+y;
 else if(y<100) s+= "0"+y;
 else s+= y+"";
 send(s);
public void send(String s)
    {
        byte[] toSend = s.getBytes();
        try {
            mmOutputStream.write(toSend);
            //Toast.makeText(this, "Data sent successfully", Toast.LENGTH_SHORT).show();
        }
        catch (IOException e){
            Toast.makeText(this, "ERROR", Toast.LENGTH_SHORT).show();
        }
    }

i w mikrokontrolerze odbieram w przerwaniu:

ISR(USART0_RX_vect)
{
	static int i;
	znak = UDR0;
	if(flag)
	{
               //Zapis znaków do 6 znakowej tablicy char
		tab[i++] = znak;
		if(i==6)
		{
			uart_get();
			i = 0;
			flag = 0;
		}
	}
	if(znak == '<') 
	{
		flag = 1;
	}
}

void uart_get()
{
        //Pierwsze 3 znaki to liczba x, kolejne trzy to liczba y;
	for(int i=0; i<3; i++)
	{
		tab_x[i] = tab[i];
		tab_y[i] = tab[i+3];
	}
	_x = atoi(tab_x);
	_y = atoi(tab_y);
}

Nawet to działa, ale co jak będę chciał wysyłać większe ilości danych?
Jak najlepiej wysyłać i odbierać dane pomiędzy telefonem a mikrokontrolerem?

0

Ktoś zna się na komunikacji bluetooth? Zauważyłem, jeszcze taki problem, że czasami funkcja atoi, źle konwertuje char na int np. char="250" a int 2500.

0

Wołanie atoi w przerwaniu to taki sobie pomysł...

0
alagner napisał(a):

Wołanie atoi w przerwaniu to taki sobie pomysł...

Dlaczego? dlatego że długo zajmuje konwersja z char do int?

0

Długo-nie długo, kwestia oczekiwań, tam leci coś na kształt fora, dokładna implementacja jest tu:
http://svn.savannah.nongnu.org/viewvc/trunk/avr-libc/libc/stdlib/atoi.S?revision=1944&root=avr-libc&view=markup

Jak Ci się to wyrabia to ok, ale wyobraź sobie, że tekst Ci się wydłuża i pojawia się wąskie gardło. Druga rzecz - wiesz, że atoi wymaga zakończenia łańcucha znaków nullem? Nie wiem jak wygląda Twój tab_x i tab_y.

Trzecia rzecz - może jakiś bufor kołowy do odbioru danych?

0

Właśnie o '\0' zapomniałem i stąd była błędna konwersja o której pisałem. O buforze kołowym na początku myślałem, ale wydawał mi się zbędny. Jeśli tak mówisz to chyba zrobię bufor kołowy do odbioru znaków.

0

Czy rozwiązałeś swój problem?
Ze swojej strony mogę dodać że jeśli telefon wysyła te liczby w postaci znaków ascii (stringi zakończone nullem) a nie w postaci binarnej to nie powinno być problemu z ich przechwytywaniem do bufora kołowego, ponieważ ten znak null na końcu każdego "stringa" jest separatorem kolejnych liczb więc przekonwertowanie ich nie powinno być problemem.
Jeśli zaś dostajesz je w postaci binarnej to powinieneś wiedzieć na ilu bitach są one zapisywane (raczej to musisz z góry wiedzieć) - tylko wtedy uda Ci się je po stronie procesora dekodować (np. na znaki) i robić z nimi co tam chcesz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1