Przecież podałem jak można to ładnie i składnie wysłać
Najlepiej zamiast tablicy na żywca w formie bajtów wysyłać stringi i je analizować.
Na przykład zamiast wysłać ciąg z wartościami 0x70,0x20... proponowałbym wysyłać stringa w formie : "A=112,B=32...\r\n", na końcu stringa dajemy \r\n żeby dać znać mikrokontrolerowi, że jest to koniec transmisji.
Wówczas mikrokontroler może dowolnie obrabiać te dane a wystarczy tylko najpierw odpowiednio zapisać wszystko do bufora:
SIGNAL (SIG_UART_RECV)
{
odebranyZnak=UDR;
if ( (odebranyZnak!='\r') && (odebranyZnak!='\n') )
{
bufor[i++]=odebranyZnak;
}
else
{
bufor[i]='\0'; i=0;// zakończenie słowa - dodanie znaku końca stringa
**ANALIZA CIAGU ODEBRANEGO LUB USTAWIENIE FLAGI SYGNALIZUJACEJ NOWE DANE**
}
}
Jeżeli wyślemy przed transmisją \r\n bufor zostanie wyzerowany, i jeżeli były jakieś dane w tym buforze lecz błędne to zostaną one usunięte (można dodać bardzo łatwo sumę kontrolną..). Mamy wtedy spokojną głowę że bufor będzie zapełniony od pierwszej pozycji i wiemy że jak wyślemy znak \r lub \n to damy znać mikrokontrolerowi o tym, że ma się zająć przyjętymi danymi i je odpowiednio rozdzielić.
W zasadzie rozpoznawanie danych można zrealizować na różne sposoby i pozostawię to twórcy tematu
Dodano po 5 [minuty]:
Przykładowo wyciągnięcie wartości B przy założeniu że każdy ciąg w buforze będzie miał taką samą postać ("A=...,B=... "):
void GetB(int8 *s1, int8 *s2)
{
int8 x=2; //numer znaku wybranego po którym ma zostać przepisany ciąg znaków
while(x)
if(*s1++ == '=') x--; //po znalezieniu znaku zmniejsza wartość x - znaleziono znak =
while(*s1 >= '0' && *s1 <= '9') //następnie przepisuje wszystkie znaki które są liczbami, jeżeli natrafi jakikolwiek inny, kończy przepisywanie
*s2++=*s1++;
*s2='\0'; //zamknięcie string'a znakiem "zerowym"
}
Ale można to na prawdę na wiele sposobów zrealizować..
Można też zrobić rozpoznawanie zmiennej, czyli tego co jest zapisane między przecinkiem a znakiem "=". i wówczas możliwe by było wysyłanie tylko tego co się zmieniło i wymaga aktualizacji.