Strona 1 z 1
RS232 problem z tablicami - obliczanie CRC
: 14 cze 2012 13:55
autor: nasiono
Witam. Próbuje uruchomić komunikacje LabView z stm32 za pomocą RS232. Po stronie mikroprocesora wszystko działa . Wysyłam testową ramke:
AA 00 01 00 02 00 03 00 04 FF EA 82 . W LV bufor ustawiony jest na 1 znak jesli będzie nim 'AA' bufor przyjmuje nową wartość 11. Będą to interesujące mnie dane.
Do tego momentu wszytko wydaje się działać bardzo dobrze. Teraz mam problem z tablicami mianowicie jak zgodnie ze sztuką powinno się wpisywać dane do tablicy bo nie wydaje mi się rozsądnym zrobienie tego tak jak ja to uczyniłem tzn. reczne numerowanie kazdego elementu.
Następne pytanie potrzebuje wyliczyć CRC16 elementów od 0-8 i porównać to z liczbą będącą połączeniem elementu 9-10 i nie wiem jak to zrobić
W LV jestem jak widać początkujący.
Re: RS232 problem z tablicami.
: 14 cze 2012 14:55
autor: rivui
Jezeli uzyjesz Index Array i chcesz miec w pierwszym terminalu pierwszy element to nie musisz jej numerowac wcale. Wystarczy ze ja rozciagniesz aby miec tyle wyjsc ile chcesz i wtedy wyjscie numer 1 bedzie zwracac element numer 1 etc. Takze powinno dzialac dokladnie tak samo jak po prostu usuniesz constanty numerowan.
Natomiast twoj sposob odczytu przez RS232 wydaje sie dziwny. Czy na koniec ramki stm32 dodaje jaksi termination character ? Taki jak Carriage Return czy Line Feed?
Re: RS232 problem z tablicami.
: 14 cze 2012 15:21
autor: nasiono
Co do ramki to nie potrzebuje znaku końca gdyż jej długość jest zawsze stały. Stm wysyła znaki w hex . LV po kazdej odebranej ramce czeka na AA potem na dane , następnie mam zamiar sprawdzać CRC.
Niestety mam problem z CRC16. Porównuje wyniki z
http://www.lammertbies.nl/comm/info/crc ... ation.html dla
HEX : 0,1,2 mikroprocesor liczy sume prawidłowo tzn jest taka sama jak z kalkulatora online niestety LV sobie z tym nie radzi . Prawidłowo podaje wartości dla pojedynczych cyfr ale dla ciągu już nie. Gdzie leży problem.
PS.
Znalazłem kilka innych VI z CRC16 niektóre liczą dobrze tekst w ASCII (tzn wyniki odpowiadają kalkulatorowi) Mnie zależy na tym bym mógł policzyć zawartość arraya z liczbami jesli ktoś dysponuje sprawdzonym działającym kodem operującym na hexach bardzo bym prosił o pomoc.
Stanąłem na tym i nie wiem jak to przeskoczyć w C wszytko działa od kopa. Teraz próbuje walczyć z LabView ale wszystko idzie strasznie topornie jakieś głupie problemy cały czas.
Wrzucam VI z działającym CRC tzn działa tylko w trybie ASCII.
RS232 problem z tablicami.
: 14 cze 2012 22:24
autor: Garreth
a tak? przy takim układzie wychodzą mi wyniki takie, jak w kalkulatorze który podałeś. Natomiast gdy 0 przed pierwszym (lewym) XORem zastąpisz przez FFFF, to dostaniesz CRC-16 modbusowe. Nie wiem dlaczego ten oryginalny plik zamieniał kolejność bajtów, ale żeby było zgodnie z kalkulatorem to z tej zamiany kolejności należy zrezygnować.
/edit:
Nie zauważyłem pierwszego pytania. Co próbujesz zrobić z tą tablicą? Bo używając funkcji index array w taki sposób jak Ty to zrobiłeś, to otrzymujesz elementy 9 i 10 z tablicy. Podejrzewam, że próbujesz osiągnąć coś takiego:
. Przy takim zastosowaniu funkcji Delete from array, usuwasz z tablicy 2 ostatnie elementy i zwracasz dwie tablice - jedną z usuniętymi dwoma końcowymi elementami oraz drugą zawierającą tylko usunięte elementy.
Re: RS232 problem z tablicami.
: 15 cze 2012 09:17
autor: nasiono
Aktualny problem mam z CRC , tablicami zajme się później. Niestety ten plik z VI CRC nadal działa na stringach problem z odwruconym wynikiem jest tu nie istotny .
Chodzi o to że potrzebuje tablice liczb
HEX (NIE ASCII) policzyć tym CRC . Wyniki dla obliczonych ASCII i HEX są różne. Niestety ten program który dołączyłem radzi sobie tylko z ASCII po niewielkich przeróbkach HEX radzi sobie tylko z pojedynczymi cyframi.
Na dole dołączam kod w C który działa na mikroprocesorze a wyniki są takie same jak w kalkulatorze dla liczb HEX.
Kod: Zaznacz cały
unsigned int Calculate_CRC16(unsigned int crc, char a) {
int i;
crc ^= a;
for (i = 0; i < 8; ++i) {
if (crc & 1) crc = (crc >> 1) ^ 0xA001;
else crc = (crc >> 1);
}
return crc;
}
Re: RS232 problem z tablicami.
: 15 cze 2012 09:38
autor: Pitol
nasiono pisze:Chodzi o to że potrzebuje tablice liczb HEX (NIE ASCII) policzyć tym CRC .
A jaki jest problem zamienić tablicę ASCII na HEX (lub odwrotnie)? Skoro masz VI, który liczy dobrze na tablicy liczb w postaci stringów, to jaki problem zamienić tablicę liczb w postaci integer na tablicę stringów?
Re: RS232 problem z tablicami - obliczanie CRC
: 15 cze 2012 09:52
autor: nasiono
Doszedłem do wniosku że najlepiej było by mi zaadaptować funkcję z C ponieważ ona działa na 100% w C i wiem jak jej używać.
Czy mógł bym prosić o sprawdzenie i poprawki szczególnie z wynikiem nie wiem czemu chce mi tam tworzyć tablice.
Kod: Zaznacz cały
unsigned int Calculate_CRC16(unsigned int crc, char a) {
int i;
crc ^= a;
for (i = 0; i < 8; ++i) {
if (crc & 1) crc = (crc >> 1) ^ 0xA001;
else crc = (crc >> 1);
}
return crc;
RS232 problem z tablicami - obliczanie CRC
: 15 cze 2012 10:29
autor: Garreth
Hmm.... Po lewej HEX i po prawej HEX, wynik taki sam dla czystego CRC-16, więc nie do końca rozumiem w czym problem:
A Twój For loop chce Tworzyć tablice, ponieważ po 8 jego iteracjach masz 8 wyników na tamtym terminalu. LV nie może zakładać, że życzysz sobie aby te 8 wyników było zlepionych w jednego integera, więc Tworzy tablicę. Możesz wyłączyć auto-indexowanie (prawy klawisz na terminal->disable auto-indexing), wtedy nie dostaniesz tablicy na wyjściu, lecz wynik z ostatniego obrotu pętli.
Re: RS232 problem z tablicami - obliczanie CRC
: 15 cze 2012 14:28
autor: Pitol
nasiono pisze: (...) nie wiem czemu chce mi tam tworzyć tablice.
Tak działa pętla FOR (domyślnie) ;)
Garreth pisze: (...) Możesz wyłączyć auto-indexowanie (...)
To jest złym pomysłem w tym przypadku, ponieważ jak widać na podstawie kodu z C, do obliczeń powinna być brana aktualna wartość CRC. Rozwiązaniem jest zastosowanie rejestru przesuwnego, w którym będzie trzymana aktualna wartość CRC. Jak? Prawym przyciskiem myszy na lewej krawędzi pętli FOR i wybierz
Add Shift Register, podepnij do niego to, co wychodzi z bloczka AND przed pętlą. Wewnątrz pętli to już sobie poradzisz.
Re: RS232 problem z tablicami - obliczanie CRC
: 15 cze 2012 14:50
autor: Garreth
Pitol pisze:
To jest złym pomysłem w tym przypadku...
To oczywiste mi się wydawało, dlatego się skupiłem tylko na wyjaśnieniu do czego ta funkcja służy i dlaczego działa jak działa:)
Re: RS232 problem z tablicami - obliczanie CRC
: 15 cze 2012 17:09
autor: nasiono
Początki są trudne ale dzięki Wam poradziłem sobie .
Dla tego wszystkim serdecznie dziękuje i pozdrawiam.
Re: RS232 problem z tablicami - obliczanie CRC
: 15 cze 2012 18:29
autor: Pitol
Garreth pisze:To oczywiste mi się wydawało, dlatego się skupiłem tylko na wyjaśnieniu do czego ta funkcja służy i dlaczego działa jak działa:)
I tak też sądziłem, ale żeby nie było niejasności - wyjaśniłem
nasiono pisze:Początki są trudne ale dzięki Wam poradziłem sobie .
Dla tego wszystkim serdecznie dziękuje i pozdrawiam.
Cieszy nas to niezmiernie, że sobie poradziłeś!
teraz możesz odkryć inne narzędzie forum - przycisk POCHWAL, co by wszystkim, którzy Ci pomogli, poprawić humor (i statystyki)