RS232 problem z tablicami - obliczanie CRC

Jeśli masz coś do powiedzenia w sprawie LabVIEW napisz. Tutaj są tematy, których nie można uściślić do innych działów.
nasiono
Posty: 21
Rejestracja: 11 sty 2012 22:44
Wersja środowiska: LabVIEW 2011

RS232 problem z tablicami - obliczanie CRC

Post 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.
Załączniki
schemat
schemat
Awatar użytkownika
rivui
Posty: 27
Rejestracja: 01 lut 2010 16:50
Wersja środowiska: LabVIEW 8.5
Lokalizacja: Kopenhaga

Re: RS232 problem z tablicami.

Post 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?
nasiono
Posty: 21
Rejestracja: 11 sty 2012 22:44
Wersja środowiska: LabVIEW 2011

Re: RS232 problem z tablicami.

Post 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 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 258 razy
Garreth
Posty: 74
Rejestracja: 28 gru 2011 14:13
Wersja środowiska: LabVIEW 2011

RS232 problem z tablicami.

Post 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: Obrazek . 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.
nasiono
Posty: 21
Rejestracja: 11 sty 2012 22:44
Wersja środowiska: LabVIEW 2011

Re: RS232 problem z tablicami.

Post 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;
}
Awatar użytkownika
Pitol
Moderator
Posty: 984
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Re: RS232 problem z tablicami.

Post 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?
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
nasiono
Posty: 21
Rejestracja: 11 sty 2012 22:44
Wersja środowiska: LabVIEW 2011

Re: RS232 problem z tablicami - obliczanie CRC

Post 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;
CRC DIY.png
Garreth
Posty: 74
Rejestracja: 28 gru 2011 14:13
Wersja środowiska: LabVIEW 2011

RS232 problem z tablicami - obliczanie CRC

Post 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:
Obrazek


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.
Awatar użytkownika
Pitol
Moderator
Posty: 984
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Re: RS232 problem z tablicami - obliczanie CRC

Post 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.
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
Garreth
Posty: 74
Rejestracja: 28 gru 2011 14:13
Wersja środowiska: LabVIEW 2011

Re: RS232 problem z tablicami - obliczanie CRC

Post 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:)
nasiono
Posty: 21
Rejestracja: 11 sty 2012 22:44
Wersja środowiska: LabVIEW 2011

Re: RS232 problem z tablicami - obliczanie CRC

Post autor: nasiono »

Początki są trudne ale dzięki Wam poradziłem sobie .
Dla tego wszystkim serdecznie dziękuje i pozdrawiam.
Awatar użytkownika
Pitol
Moderator
Posty: 984
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Re: RS232 problem z tablicami - obliczanie CRC

Post 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) :D
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
ODPOWIEDZ