RS232 problem z tablicami - obliczanie CRC
RS232 problem z tablicami - obliczanie CRC
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.
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.
- rivui
- Posty: 27
- Rejestracja: 01 lut 2010 16:50
- Wersja środowiska: LabVIEW 8.5
- Lokalizacja: Kopenhaga
Re: RS232 problem z tablicami.
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?
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.
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 zhttp://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.
Niestety mam problem z CRC16. Porównuje wyniki zhttp://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.
- Załączniki
-
- TUTAJ.vi
- (20.24 KiB) Pobrany 257 razy
RS232 problem z tablicami.
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.
/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.
- Załączniki
-
- crc16.vi
- (10.19 KiB) Pobrany 293 razy
Ostatnio zmieniony 14 cze 2012 22:55 przez Garreth, łącznie zmieniany 3 razy.
Re: RS232 problem z tablicami.
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.
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;
}
- Pitol
- Moderator
- Posty: 984
- Rejestracja: 19 lip 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Kraków
Re: RS232 problem z tablicami.
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?nasiono pisze:Chodzi o to że potrzebuje tablice liczb HEX (NIE ASCII) policzyć tym CRC .
Re: RS232 problem z tablicami - obliczanie CRC
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.
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
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.
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.
- Pitol
- Moderator
- Posty: 984
- Rejestracja: 19 lip 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Kraków
Re: RS232 problem z tablicami - obliczanie CRC
Tak działa pętla FOR (domyślnie) ;)nasiono pisze: (...) nie wiem czemu chce mi tam tworzyć tablice.
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.Garreth pisze: (...) Możesz wyłączyć auto-indexowanie (...)
Re: RS232 problem z tablicami - obliczanie CRC
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:)Pitol pisze: To jest złym pomysłem w tym przypadku...
Re: RS232 problem z tablicami - obliczanie CRC
Początki są trudne ale dzięki Wam poradziłem sobie .
Dla tego wszystkim serdecznie dziękuje i pozdrawiam.
Dla tego wszystkim serdecznie dziękuje i pozdrawiam.
- Pitol
- Moderator
- Posty: 984
- Rejestracja: 19 lip 2007 00:00
- Wersja środowiska: LabVIEW 2019
- Lokalizacja: Kraków
Re: RS232 problem z tablicami - obliczanie CRC
I tak też sądziłem, ale żeby nie było niejasności - wyjaśniłemGarreth 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:)
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)nasiono pisze:Początki są trudne ale dzięki Wam poradziłem sobie .
Dla tego wszystkim serdecznie dziękuje i pozdrawiam.