Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C++] RS232 - Odbieranie i interpretacja ramki w postaci binarnej.

Arkain 09 Lut 2012 10:58 8364 69
  • #1 09 Lut 2012 10:58
    Arkain
    Poziom 10  

    Witam serdecznie ;]

    Piszę w Borland C++ i obsługę com oparłem na WinAPI (obsługa com jak plik binarny). Zrobiłem już sprawnie działające nadawanie i odbieranie ramki. Ramka jeśli jest poprawna to jest zapisywana do vectora unsigned char (miałem problemy z dynamiczna tablicą unsigned char bo gdy tworzyłem ją np przez "new" to jeśli w pakiecie występował bajt 0x00 to wszystko się sypało bo C++ tak wykrywa C-stringi).

    Program ten będzie się komunikował z urządzeniem opartym o ATMege128 (obecnie testy na ATMega8). Urządzenie to będzie zbierało kilka informacji w jednym czasie i wysyłało je przez RS232 do PC gdzie te dane będą wyświetlane na kilku wykresach TChar. (ktory_pomiar,dane_wykres1,dane_wykres2,... - który_pomiar służy do synchronizacji ich na wykresach bo wszystkie dane mogą nie zmieścić się w jednej ramce)
    Przejdę od razu do rzeczy.
    Mam ramkę która wygląda tak:

    START - 1-bajt
    ADRES - 1 - bajt
    FUNKCJA - 1 bajt
    DANE - 64 bajty
    CRC - 2 bajty
    STOP - 1 bajt

    I tu pojawia się moje pytanie.

    Jak dane z wektora przypisać do konkretnych zmiennych/struktury?

    Starałem się znaleźć jakiekolwiek informacje na ten temat tu na forum lecz były one raczej szczątkowe :( (jeśli jednak ktoś zna tu temat o powyższym zagadnieniu którego się nie doszukałem to przepraszam i uprzejmie proszę o podanie linku do niego)

    W zależności jaka to funkcja aktualnie jest wybrana to DANE mogą to być np kolejno po sobie zapisane liczby int float itp... (w jednej ramce mogą być jednocześnie ułożone dane różnych typów).

    Oczywiście wiem że będę miał tu problem ze znakiem "-" itp ale tym będę martwił się potem.

    Jeszcze nie ustaliłem czy najpierw będą przesyłane młodsze bity liczby a potem starsze czy odwrotnie...

    Jak jednak takie dane "wyłuskiwać" z tej tablicy...
    Na początek chciałem zrobić to na osobnych zmiennych do których jakoś wskaźnikiem i rzutowaniem wpisuje dane...

    Potem przyszło chyba nierealne marzenie o tym by stworzyć strukturę której zmienne odpowiadałby kolejnym zmiennym zapisanym w DANYCH. Zrobienie wskaźnika do tej struktury i nakładanie go na DANE. (Coś jak nakładanie szablonu na ciąg bajtów i odczytywanie konkretnych zmiennych)...

    Lecz nie mam pojęcia jak to zrealizować :( Proszę doświadczonych kolegów o pomoc w naprowadzeniu na rozwiązanie.
    Może są na to gotowe rozwiązania które stosuje się np w przemyśle a ja po prostu ich nie znam?

    Jeśli ktoś poświęci swój czas i np napisze rozwiązanie mojego problemu to będę mu bardzo wdzięczny i jeśli jest to możliwe to poprosiłbym o to by pokazać mi metodę odwrotną czyli jak taka strukturę zamienić na ciąg bajtów... (Przepraszam jeśli mam zbyt duże wymagania)

    Dziękuję z góry za pomoc i czekam na wasze odpowiedzi...

    0 29
  • Pomocny post
    #2 09 Lut 2012 13:41
    C0FFEE
    Poziom 14  

    Nie wczytuj do wektora, tylko do struktury.

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #3 09 Lut 2012 14:35
    Arkain
    Poziom 10  

    Dzięki serdeczne za odpowiedz!!!

    Problem polega na tym że poprawne dane (te które przeszły CRC) muszą trafiać do jakiegoś bufora... następnie mając całą poprawną ramkę w buforze chciałbym po rozpoznaniu funkcji (odczytanie która to funkcja to banał wystarczy odczytać ramka[2] i porównać ze wcześniej zdefiniowanymi stałymi) WYŁUSKAĆ z pola "DANE" odpowiednie zmienne...

    Podany przez ciebie kod sugeruje mi żeby oprzeć obsługę tego na jakimś tymczasowym pliku na dysku a wolałbym tego uniknąć :/

    Ramkę przechowuje obecnie w 70 bajtowym wektorze bo mogę go obsługiwać jak tablicę.

    Problem w tym że nie umiem tych danych wyłuskać.

    Przykład:
    Powiedzmy że w DANE są zapisane rozbite na bajty liczby w takiej kolejności:

    START-ADRES-FUNKCJA-[int,int,BYTE,float]-CRCA-CRCB-STOP

    START-ADRES-CRCA-CRCB-STOP <- odpadają bo zostały już zweryfikowane przy odbiorze (lecz są zapisywane w buforze gdyby były do czegoś potrzebne)

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    lub myślałem o wskaźniku na strukturę i nakładaniu go na całą ramkę lub na całe pole DANE i następnie przekazywanie wartości odpowiednich pól struktury dalej do funkcji lub przepisanie ich do zmiennych.

    Obecnie próbuję zrozumieć przesuwania bitów w zmiennych i w ten sposób wpisywać zawartość ramki do zmiennych... Ale czy jest coś prostszego i równie szybkiego?

    To czego szukam chyba nazywa się "parser" tak? Ale jak coś takiego zrobić (jak wyłuskiwać dane z bufora)?

    0
  • #4 09 Lut 2012 15:11
    C0FFEE
    Poziom 14  

    Cytat:
    Podany przez ciebie kod sugeruje mi żeby oprzeć obsługę tego na jakimś tymczasowym pliku na dysku

    Nie. Napisałeś, że obsługujesz com jak plik binarny. Nie czytaj z niego danych do wektora, tylko do struktury. Zapewne nie używasz fstream, tylko ReadFile - na jedno wychodzi, po prostu jako bufor podajesz strukturę. W strukturze zamiast 'BYTE dane[64]' możesz równie dobrze umieścić co Ci się tylko podoba.

    0
  • #5 09 Lut 2012 15:20
    Arkain
    Poziom 10  

    Hmmm... Odczyt odbywa się bajt po bajcie. Jeśli wykryto początek to zapis do bufora (tablicy/wektora) i jednoczesne liczenie CRC. Jeśli nie wykryto końca w odpowiednim momencie (ramka o stałym rozmiarze) lub nie zgadza się CRC to ramka jest olewana. Jeśli ok to w buforze znajduje się poprawna ramka.

    A co zyskuję mając zapis do struktury skoro i tak dostaję na końcu tablicę 64 bajtów danych z których nie umiem ich wyciągnąć? :(

    (zapewne z braku doświadczenia nie dostrzegam tego co chcesz mi pokazać)

    0
  • #6 09 Lut 2012 16:17
    C0FFEE
    Poziom 14  

    Cytat:
    Odczyt odbywa się bajt po bajcie.

    A to trzeba było tak od razu. A najlepiej wkleić kod.
    W takim razie, faktycznie struktura ramki niewiele daje, ale wciąż możesz użyć struktury do danych. Jak napisałem w poprzedniej wiadomości - zamiast dane[64] tworzysz sobie dowolną strukturę (np. BYTE x, WORD y, BYTE nieuzywane[61]) i wczytujesz do niej zamiast do wektora.

    0
  • #7 09 Lut 2012 16:52
    Arkain
    Poziom 10  

    ;]

    Obecnie jestem na etapie:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Kod oczywiście jest poglądowy ;]
    Czy jest jakiś łatwiejszy sposób rozwiązania tego problemu? Jakaś maska wskaźników nakładana na Ramkę?
    Bo taki kod jest trudno rozbudowywać...Np. za 2 miesiące będę chciał dołożyć jeszcze jeden wykres i przesyłać jeszcze jedne dane i będę musiał wnikać w kod bardzo dogłębnie a przyznam że liczyłem że uda mi się wykonać takie rozwiązanie:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Przepraszam za błędy składniowe ale piszę to na forum a nie w IDE ;]

    W takim przypadku byłoby wszystko o wiele czytelniejsze i sprowadzało się do kosmetyki ;D Ale chyba nie da się tego tak wykonać? (chociażby z powodu iż program jest 32bit a procek 8 bit)

    0
  • Pomocny post
    #8 09 Lut 2012 22:30
    LED5W
    Poziom 32  

    Może zastosuj coś takiego:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    Dane może być strukturą. Jeśli będą tam różne typy zmiennych w zależności od funkcji to możesz zastosować dziedziczenie z takiej (choćby pustej) struktury.

    0
  • #9 09 Lut 2012 23:04
    Arkain
    Poziom 10  

    Dzięki za odpowiedz.

    Hmmm ciekawe z tym dziedziczeniem struktury...
    Postaram się temu przyjrzeć... Bo nie podoba mi się operowanie na samych bajtach :/ bo łatwo jest coś skopać.

    Pytanie co jest szybsze i bardziej wydajne?

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    czy

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    lub nawet pominięcie temp i kopiowanie bezpośrednio do Ramka z uwzględnieniem indeksu (oczywiście większych elementów niż short)?

    0
  • #10 09 Lut 2012 23:35
    LED5W
    Poziom 32  

    Arkain napisał:
    Hmmm ciekawe z tym dziedziczeniem struktury...
    Postaram się temu przyjrzeć... Bo nie podoba mi się operowanie na samych bajtach :/ bo łatwo jest coś skopać.
    Dokładnie.

    Arkain napisał:
    Pytanie co jest szybsze i bardziej wydajne?
    To pierwsze. W drugim zmienna temp jest nie potrzebna, bo... można to napisać tak jak w tym pierwszym. ;)

    Arkain napisał:
    lub nawet pominięcie temp i kopiowanie bezpośrednio do Ramka z uwzględnieniem indeksu (oczywiście większych elementów niż short)?
    Prawdopodobnie przejdzie nawet
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    ale po co komplikować sobie życie jeśli całość można załatwić rzutowaniem w jednej linii, a później używać dającej obraz danych struktury?

    0
  • #11 10 Lut 2012 00:00
    Arkain
    Poziom 10  

    Właśnie chciałem edytować poprzedni post ale zobaczyłem odpowiedz ;]

    Cytat:
    To pierwsze. W drugim zmienna temp jest nie potrzebna, bo... można to napisać tak jak w tym pierwszym.

    Chodziło mi tylko o to czy szybciej komputer przesunie bity i pomnoży ileś tam razy czy wykona kopiowanie pamięci?

    Cytat:
    ale po co komplikować sobie życie jeśli całość można załatwić rzutowaniem w jednej linii, a później używać dającej obraz danych struktury?

    Właśnie w międzyczasie wymodziłem coś podobnego tylko bez rzutowania:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    I to działa ;] Przynajmniej na razie.
    Pewnie rzutowanie jest lepsze szczególnie przy użyciu _cast bo kompilator próbowałby cokolwiek nadzorować a tu sam muszę pilnować by sizeof b było mniejsze od 64.

    0
  • #12 10 Lut 2012 00:46
    LED5W
    Poziom 32  

    Arkain napisał:
    Chodziło mi tylko o to czy szybciej komputer przesunie bity i pomnoży ileś tam razy czy wykona kopiowanie pamięci?
    To już raczej komputera się pytaj. :D

    Arkain napisał:
    Pewnie rzutowanie jest lepsze szczególnie przy użyciu _cast bo kompilator próbowałby cokolwiek nadzorować a tu sam muszę pilnować by sizeof b było mniejsze od 64.
    Taa, ciekawe, który _cast? Tutaj akurat nie ma i nie będzie, żadnego nadzorowania, bo trzeba przekształcić tablicę bajtów na strukturę. Rzutowanie ma tą zaletę, że nie trzeba niczego kopiować.

    0
  • #13 10 Lut 2012 12:57
    Arkain
    Poziom 10  

    LED5W napisał:
    Taa, ciekawe, który _cast? Tutaj akurat nie ma i nie będzie, żadnego nadzorowania, bo trzeba przekształcić tablicę bajtów na strukturę. Rzutowanie ma tą zaletę, że nie trzeba niczego kopiować.


    Hmmm masz rację po głębszej analizie nadaje się chyba do tego tylko reinterpret_cast? Co prawda nic nie będzie nadzorował ale łatwiej go odnaleźć w programie jakby co ;]

    Dodano po 51 [minuty]:

    Dzięki waszym pomysłom udało mi się otrzymać coś takiego ;D

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Fajnie bo dzięki temu unikam jakiegokolwiek kopiowania wektora ;D

    Czy dobrze się orientuje?
    Typy danych w AVR-ach to:
    (testowy program pisany w BASCOM AVR ale docelowy będzie w C)

    Code:
    Bascom AVR                         C++ 32bit
    
    Bit - 0 lub 1                      bool - 0 lub 1
    Byte                               unsigned char
    Word                               unsigned short int
    Integer                            short int
    Long                               long int
    Single                             float
    Double                             double


    Zastanawiam się jeszcze tylko nad tym że PC ma kolejność little endian a avr chyba też prawda?

    0
  • #14 10 Lut 2012 17:44
    LED5W
    Poziom 32  

    Arkain napisał:
    LED5W napisał:
    Taa, ciekawe, który _cast? Tutaj akurat nie ma i nie będzie, żadnego nadzorowania, bo trzeba przekształcić tablicę bajtów na strukturę. Rzutowanie ma tą zaletę, że nie trzeba niczego kopiować.

    Hmmm masz rację po głębszej analizie nadaje się chyba do tego tylko reinterpret_cast? Co prawda nic nie będzie nadzorował ale łatwiej go odnaleźć w programie jakby co ;]
    Tak.

    Arkain napisał:
    Dzięki waszym pomysłom udało mi się otrzymać coś takiego ;D

    [kod]
    Fajnie bo dzięki temu unikam jakiegokolwiek kopiowania wektora ;D
    No i o to chodzi. :) Tylko jak tak patrzę na ten kod, to vector będzie miał stały rozmiar (zawierał jedną ramkę)? Jeśli tak to wystarczy zwykła (w dodatku szybsza) tablica.

    Arkain napisał:
    Czy dobrze się orientuje?
    Typy danych w AVR-ach to:
    (testowy program pisany w BASCOM AVR ale docelowy będzie w C)

    Code:
    Bascom AVR                         C++ 32bit
    
    Bit - 0 lub 1                      bool - 0 lub 1
    Byte                               unsigned char
    Word                               unsigned short int
    Integer                            short int
    Long                               long int
    Single                             float
    Double                             double
    Tak. Chociaż ja się tak nie "rozpisuję" i piszę int (wiadomo gdzie ;)). W razie wątpliwości zawsze pomocą służy sizeof.

    Arkain napisał:
    Zastanawiam się jeszcze tylko nad tym że PC ma kolejność little endian a avr chyba też prawda?
    Pytanie: Skoro mikrokontroler jest 8-bitowy to jakiej kolejności bitów używa? Czyli co jest pierwsze: pierwszy bajt, czy pierwszy bajt? :D

    0
  • #15 10 Lut 2012 18:02
    Arkain
    Poziom 10  

    LED5W napisał:
    No i o to chodzi. :) Tylko jak tak patrzę na ten kod, to vector będzie miał stały rozmiar (zawierał jedną ramkę)? Jeśli tak to wystarczy zwykła (w dodatku szybsza) tablica.

    Niby tak ale to jest tak że ten wektor jest globalny (i obecnie przechowuje jedną ramkę) a funkcja która pobiera dane z Com ma swój wektor (temp) i wczytując do tego temp, liczy crc i jak crc zgodne to przepisuje do globalnego (kopiowanie pamięci), a jeżeli nie to olewa i pobiera następny itd...

    Gdy robiłem tak że temp nie był wektorem tylko dynamiczna tablica unsigned char to jeżeli gdzieś w tej tablicy był bajt 0x00 to wszystko trafiał szlag - rozpoznawanie jako C-String - (nawet zapis do następnych komórek pamięci :/) a na wektorze jest ok. Nie chciałem dawać też sztywnych tablic by móc z poziomu programu zmieniać rozmiar ramki np.

    Nie wiem też czy nie zrobię jakiejś kolejki programowej bo bufor sprzętowy 4MB jest (sprzętowy czy systemowy bo używam przejściówki FTDI i Win7 Pro?).

    0
  • #16 10 Lut 2012 18:30
    LED5W
    Poziom 32  

    Arkain napisał:
    Gdy robiłem tak że temp nie był wektorem tylko dynamiczna tablica unsigned char to jeżeli gdzieś w tej tablicy był bajt 0x00 to wszystko trafiał szlag - rozpoznawanie jako C-String - (nawet zapis do następnych komórek pamięci :/) a na wektorze jest ok.
    Pokaż jak to odbierasz.

    Arkain napisał:
    Nie chciałem dawać też sztywnych tablic by móc z poziomu programu zmieniać rozmiar ramki np.
    Ale nie zmienisz struktury. :P

    0
  • #17 10 Lut 2012 19:04
    Arkain
    Poziom 10  

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Nie zamieszczam tu pełnego kodu bo jest on zbyt obszerny. Chodzi jedynie o sytuację taką:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Może mam coś w Borlandzie ustawione ale na VS też sprawdzałem i też tak miałem :/

    0
  • #18 10 Lut 2012 19:25
    LED5W
    Poziom 32  

    Arkain napisał:
    Chodzi jedynie o sytuację taką:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Może mam coś w Borlandzie ustawione ale na VS też sprawdzałem i też tak miałem :/
    A co znaczą te gwiazdki przed tab (za wyjątkiem 1. linii)? Wygląda jak dereferencja, ale tablica nie zawiera wskaźników. Mój VS też nie wie o co chodzi...

    0
  • #19 10 Lut 2012 21:32
    Arkain
    Poziom 10  

    LED5W napisał:
    A co znaczą te gwiazdki przed tab (za wyjątkiem 1. linii)? Wygląda jak dereferencja, ale tablica nie zawiera wskaźników. Mój VS też nie wie o co chodzi...

    Błąd ;D

    Pisałem tu na forum a nie w IDE i u siebie w programie miałem zrobione to w stylu *(wsk+i) a nie wsk[i] i strzeliłem byka bo połączyłem te dwie formy tworząc absurd w postaci *wsk[i] ;P

    Najciekawsze jest to że jak zrealizowałem już odbiór danych na wektorze to wywaliłem ten kod z tablicą dynamiczną ale w wolnym czasie zrobię to jeszcze raz i sprawdzę ;D

    Pamiętam że jak chciałem wykonywać program krok po kroku (by znaleźć przyczynę) i podglądać co jest wpisywane do tablicy dynamicznej to jej rozmiar był deklarowany np 70 elementów to podczas podglądania były elementy od 0 do 69 i ELEMENT 70 o kodzie 0x00! I gdy np do 45 elementu trafiła liczba 0x00 to nagle w "Local Variables" tablica skracała się do 45 elementów który był zakończony 0x00 i jak został wpisany kolejny element 46 przy następnym obiegu pętli to w LV już nie było go widać :/ Czy LV wyświetla zawartość tablic jako string?

    Gdzieś na http://stackoverflow.com/ (nie mogę teraz tego znaleźć :( ) przeczytałem że dynamiczna tablica char z 0x00 będzie traktowana jak C-String i lepiej użyć wektorów :/

    LED5W napisał:
    Ale nie zmienisz struktury.

    Hmm musi się jakoś dać :P...

    I zastanawiam się co z tym buforem :/ czy zrobić jakieś FIFO struktur ramek? Czy tablic ramek hmmm. Jak coś takiego powinno się rozwiązywać?

    0
  • #20 10 Lut 2012 23:04
    LED5W
    Poziom 32  

    Arkain napisał:
    LED5W napisał:
    A co znaczą te gwiazdki przed tab (za wyjątkiem 1. linii)? Wygląda jak dereferencja, ale tablica nie zawiera wskaźników. Mój VS też nie wie o co chodzi...

    Błąd ;D

    Pisałem tu na forum a nie w IDE i u siebie w programie miałem zrobione to w stylu *(wsk+i) a nie wsk[i] i strzeliłem byka bo połączyłem te dwie formy tworząc absurd w postaci *wsk[i] ;P
    Tak myślałem. Tylko, że i tak zwrócenie false przez
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    jest niemożliwe.

    Arkain napisał:
    Pamiętam że jak chciałem wykonywać program krok po kroku (by znaleźć przyczynę) i podglądać co jest wpisywane do tablicy dynamicznej to jej rozmiar był deklarowany np 70 elementów to podczas podglądania były elementy od 0 do 69 i ELEMENT 70 o kodzie 0x00!
    No to jest bardzo ciekawe. :D

    Arkain napisał:
    I gdy np do 45 elementu trafiła liczba 0x00 to nagle w "Local Variables" tablica skracała się do 45 elementów który był zakończony 0x00 i jak został wpisany kolejny element 46 przy następnym obiegu pętli to w LV już nie było go widać :/ Czy LV wyświetla zawartość tablic jako string?
    Tablica nie może się skrócić. Nie wiem jak jest w Borlandzie, ale pewnie masz podgląd właśnie jako string, który niewiele mówi, gdy masz tam dane inne niż znaki. Jedna z wad braku typu byte. Jest takie coś co w VS nazywa się watch i tam możesz wklepać dowolne wyrażenie, np. tab[56] a obok będziesz mieć podgląd wartości.

    0
  • #21 11 Lut 2012 10:21
    Arkain
    Poziom 10  

    Dzięki za odpowiedzi i poświęcany czas ;]

    Ponawiam pytanie:

    Arkain napisał:
    I zastanawiam się co z tym buforem :/ czy zrobić jakieś FIFO struktur ramek? Czy tablic ramek hmmm. Jak coś takiego powinno się rozwiązywać?


    Obecnie kończę sesję ;] (jutro ostatni egzamin ;P) i zaraz po sesji wracam do projektu.

    0
  • #22 11 Lut 2012 19:02
    LED5W
    Poziom 32  

    Nie wiem po co Ci dodatkowy bufor (oprócz bufora pojedynczej ramki)...

    W sumie to najpierw chciałem wyjaśnić sprawę z tą tablicą, bo dziwne rzeczy piszesz. ;)

    0
  • #23 11 Lut 2012 19:23
    Arkain
    Poziom 10  

    LED5W napisał:
    Nie wiem po co Ci dodatkowy bufor (oprócz bufora pojedynczej ramki)...

    Hmm a to nie będzie mało? A jak program się z jakiś powodów przytnie (wątek odbioru)? Hmmm... Myślałem że zawsze się robi bufory programowe :/
    LED5W napisał:
    W sumie to najpierw chciałem wyjaśnić sprawę z tą tablicą, bo dziwne rzeczy piszesz. ;)

    O tej dynamicznej i problemach z 0x00? Sprawdzę to jeszcze raz po egzaminie ;D

    Mały OT:
    Dziś chciałem sprawdzić ile wątków ma mój program (powinno być okno główne 1 wątek, obsługa com 2 wątki czyli razem 3). Wchodzę do "Menadżer zadań Windows" i dodaje kolumnę z wątkami a tu zaskoczenie bo pokazuje że 7 ???

    Stworzyłem nowy projekt "VCL Forms Application" i takie puste okno skompilowałem. W "Menadżer zadań Windows" pokazuje że wątków jest 3 gdy inne okno np przeglądarki jest aktywne a gdy focus wraca na okno programu to 5 :/

    System Win7 Pro x64
    IDE Embarcadero RAD Studio XE2 - Borland C++

    Kiedyś w pracy mieliśmy starego Borlanda 6 ale w styczniu firma zakupiła nam XE2 a mam wrażenie że na 6-ce było normalnie z wątkami... Ale nie mam już jak tego sprawdzić. Jeżeli ktoś orientuje się w tym temacie to proszę o info ;]

    0
  • #24 12 Lut 2012 18:40
    LED5W
    Poziom 32  

    Arkain napisał:
    LED5W napisał:
    Nie wiem po co Ci dodatkowy bufor (oprócz bufora pojedynczej ramki)...

    Hmm a to nie będzie mało? A jak program się z jakiś powodów przytnie (wątek odbioru)? Hmmm... Myślałem że zawsze się robi bufory programowe :/
    Jeśli program się na chwilę przytnie to powinno wystarczyć to co jest, a jeśli pójdzie w krzaki to mu nic nie pomoże. Zależy też ile tych danych przesyłasz.


    Arkain napisał:
    LED5W napisał:
    W sumie to najpierw chciałem wyjaśnić sprawę z tą tablicą, bo dziwne rzeczy piszesz. ;)

    O tej dynamicznej i problemach z 0x00? Sprawdzę to jeszcze raz po egzaminie ;D
    Tak. Ok.

    Odnośnie wątków pewnie są to wątki związane z środowiskiem .NET. Polecam używanie Process Explorer (najlepiej zaznaczyć uruchamianie z uprawnieniami administratora, co umożliwi podejrzenie pełnych informacji).

    0
  • #25 12 Lut 2012 20:25
    Arkain
    Poziom 10  

    LED5W napisał:
    Odnośnie wątków pewnie są to wątki związane z środowiskiem .NET.

    Borland i .NET ???

    Sprawdziłem z tymi dynamicznymi tablicami i działa ;D i już wiem co było przyczyną...Nie jestem do końca teraz pewien bo nie mam już tamtego kodu ale coś mi się kojarzy że pośredniczył tam string i chyba jemu przeszkadzało 0x00 i ucinał dane... Teraz działa więc zmieniam na dynamiczne tablice ;]

    0
  • #26 12 Lut 2012 20:56
    LED5W
    Poziom 32  

    Nie mam Borlanda, więc się nie bardzo orientuję. Może raczej VCL, choć .NET'a też podobno obsługuje. Uruchom Process Explorer -> dwuklik na program -> Threads. Zobaczysz co tam konkretnie jest.

    0
  • #27 12 Lut 2012 23:16
    Arkain
    Poziom 10  

    Inne wątki należą do ntdll.dll i tak:

    ntdll.dll! RtlMoveMemory+0x5a5
    ntdll.dll! TpCallbackIndependent+0x238 <-- kilka wywołań :/

    Do czego to służy?
    (Przepraszam z góry jeśli jest to banalne pytanie ale nie jestem jeszcze doświadczonym programistą a przynajmniej nie w takim stopniu najwidoczniej ;])

    0
  • #28 13 Lut 2012 00:45
    LED5W
    Poziom 32  

    ntdll.dll to biblioteka związana z funkcjami systemowymi. Link. Jeśli Cię interesują szczegóły, będziesz musiał poszukać...

    0
  • #29 13 Lut 2012 10:18
    Arkain
    Poziom 10  

    Ok. Dzięki. Teraz muszę napisać program na ATMege8 i sprawdzić jak się sprawuje ten wskaźnik na strukturę ;]

    Pytanie czemu w VS mogę używać wskaźników tak:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Muszę jeszcze sprawdzić bo piszę teraz z głowy ale chodzi mi o priorytet "*" i "="...

    I pytanie co lepiej używać by dostać się do składnika pokazywanego przez wskaźnik na strukturę "." czy "->"? To takie pytanie praktyczne czy któreś ze sposobów jest lepsze/gorsze?

    0
  • #30 13 Lut 2012 23:46
    LED5W
    Poziom 32  

    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    Coś mi mówi, że znowu jakieś cuda się dzieją. :D Jeśli coś nie działa wklej błąd, kod (z edytora, nie z głowy), a nie tak, że "nie idzie". ;)

    Arkain napisał:
    I pytanie co lepiej używać by dostać się do składnika pokazywanego przez wskaźnik na strukturę "." czy "->"? To takie pytanie praktyczne czy któreś ze sposobów jest lepsze/gorsze?
    Praktycznie to lepiej użyć ->, bo z takie (*coś). nic nie daje poza tym, że trzeba dwa znaki więcej wstukać (w tym co najmniej jeden z shiftem :P). A w ogóle, to jeśli wskaźnik nie jest potrzebny (np. struktura o zasięgu lokalnym) lepiej go nie używać i wtedy masz przyjemną kropkę. ;)

    0