|
|
Ruda Śląska Nieoficjalne forum miasta Ruda Śląska
|
|
|
|
|
|
|
|
|
|
|
nekrosoft
Dołączył: 07 Sie 2006
Posty: 3
Przeczytał: 0 tematów
Ostrzeżeń: 0/3
|
Wysłany: Pon 11:51, 07 Sie 2006 Temat postu: Sprawdzenie sygnału CTS w VC++ |
|
|
Witam.
Dopiero zaczynam zabawe z programowaniem a w szczegolności z portami.
Mam pod RS232 podpięte urządzonko które zmienia stan na sygnale CTS(pin8) z 0 na 1 log.
Programik pisze w MFC AppWizard(exe) Dialog Based.
Problem mój polega na tym że niewiem jak ten sygnał z czytać, a nie jestem pewien czy zmiana tego sygnału jest zapisywana w stukturze DCB, bo jak tak to niebyło by problemu wystarczy pobrac odpowiedni składnik tej struktury i sprawdzić.
Dowiedziałem się że jest on kontrolowany przez rejestr MSR
Kod: |
MSR (Modem Status Register) - 06h
Rejestr jest wykorzystywany do odczytu linii kontrolnych modemu:
bit 7 stan linii DCD (Data Carrier Detect)
bit 6 stan linii RI (Ring Idicator)
bit 5 stan linii DSR(neg)
bit 4 stan linii CTS(neg)
bit 3 zawiadamia o zmianie częstotliwości nośnej
bit 2 zawiadamia o zmianie stanu linii RI
bit 1 zawiadamia o zmianie stanu linii DSR(neg)
bit 0 zawiadamia o zmianie stanu linii CTS(neg) |
To teraz kwestia jak odczytać ten rejestr a w szczególności bit 0 i bit 4??
Proszę o pomoc.
Z góry dzięki.
[przyklejam - laurynz]
[a niech wisi - KiRi]
Post został pochwalony 0 razy
|
|
|
|
|
|
|
|
|
|
|
|
|
KiRi
Administrator
Dołączył: 25 Lut 2006
Posty: 267
Przeczytał: 0 tematów
Ostrzeżeń: 0/3 Skąd: Niebieskie dachY
|
Wysłany: Nie 20:20, 20 Sie 2006 Temat postu: |
|
|
ehhh... długo mnie tu nie było, i jeszcze długo mnie tu nie będzie - ale pierwsze co mi przyszło do głowy to Assembler. Jeżeli znasz się na assemblerze, to zapewne możesz wstawić do kodu programu wstawki assemblera, a w nim łatwo dostać się do poszczególnych bitów rejestru. O ile dobrze pamiętam, to robiliśmy kiedyś na jakiejś laborce sterowanie za pośrednictwem właśnie RS-232 - wystarczyło znaleźć rejestr odpowiedzialny za ten port i po sprawie. Jak będę miał chwilę czasu to poszukam, ale najważniejsza kwestia to jak u Ciebie z assemblerem?
Druga rzecz - za cholere nie wiem co to za program w którym to kodujesz. To coś opartego na C++? jeśli tak, to napewno da się tam wstawić assemblera, od biedy można poszukać jak za pośrednictwem C dostać się do bebechów komputera.
Poszukam...
Post został pochwalony 0 razy
|
|
|
|
|
|
|
|
|
|
|
KiRi
Administrator
Dołączył: 25 Lut 2006
Posty: 267
Przeczytał: 0 tematów
Ostrzeżeń: 0/3 Skąd: Niebieskie dachY
|
Wysłany: Nie 21:00, 20 Sie 2006 Temat postu: |
|
|
Ok, można by to zrobić tak:
Pobierasz zawartość 06h, i umieszczasz ją np. w rejestrze AL:
[1]
Interesuje Cię czwarty bit - trzeba więc wywalić pozostałe (bo 06h da nam chyba 8b danych - trzeba to sprawdzić). Najprościej wymnożyć każdy bit niepotrzebny przez 0, a potrzebny (u nas czwarty) przez 1:
[2]
a następnie przestawić dane tak, żeby intersujący na bit poszedł na skraj rejestru (bit czwarty przesunąć na bit 0):
[3]
W tej chwili rejestr AL zawiera interesującą Cię wartość - czyli wartość bitu 4 z 06h.
***
Sprawdzimy to krok po kroku na przykładzie: zakładamy że w 06h mamy 10110011b (a więc bit 4 to "1"):
[1] przenosimy zawartość 06h do AL, a więc w AL mamy 10110011b;
[2] wykonujemy operację logiczną AND na AL i liczbie 00010000b - w efekcie zerujemy wszystkie wartości oprócz bitu 4, i mamy a AL 00010000b;
[3] przesuwamy wszystkie bity o 4 miejsca w prawo - w efekcie w AL mamy 00000001b, co odpowiada wartości 1d - a więc wynik jest poprawny.
W ten sposób możesz odczytać dowolny bit z rejestru. Jeśli chcesz odczytać równocześnie i zerowy, i czwarty bit, to na koniec otrzymasz np. wartość 00001001b - musisz sprawdzić więcej warunków i znać dokładne odpowiedniki dzisiętne każdego przypadku, więc wydaje mi się, że lepiej sprawdzić osobno bit czwarty i bit zerowy. W zasadzie to nie musisz sprawdzać obydwóch bitów - możesz zrobić tak, że program cyklicznie "odświerza" stan bitu czwartego, ale sprawdzać tylko bit zerowy tak aby jego zmiana generowała przerwanie - tu już zależy od architektury Twojego programu.
Reszta, czyli powiązanie assemblera z Twoim językiem programowania należy już do Ciebie - jak coś to pisz, jeśli będę potrafił to pomogę.
________
Edit: wszystko co tu napisałem jest czysto hipotetyczne - niestety mam w domu tylko WinXP, i nie jestem w stanie sprawdzić jak to działa... musisz sam potestować.
________
Edit2: chyba jestem pijany - pisze jak byk w temacie że to VisualC++
Post został pochwalony 0 razy
|
|
|
|
|
|
|
|
|
|
|
nekrosoft
Dołączył: 07 Sie 2006
Posty: 3
Przeczytał: 0 tematów
Ostrzeżeń: 0/3
|
Wysłany: Pon 11:47, 21 Sie 2006 Temat postu: |
|
|
Dzieki. Zaraz sie wezme za testowanie.
Pijany nie jestes bo to Visual C++
Post został pochwalony 0 razy
|
|
|
|
|
|
|
|
|
|
|
jacinho
Dołączył: 31 Mar 2006
Posty: 67
Przeczytał: 0 tematów
Ostrzeżeń: 0/3 Skąd: Bykowina
|
Wysłany: Pon 15:26, 21 Sie 2006 Temat postu: |
|
|
kurcze, skomplikowane to
Post został pochwalony 0 razy
|
|
|
|
|
|
|
|
|
|
|
KiRi
Administrator
Dołączył: 25 Lut 2006
Posty: 267
Przeczytał: 0 tematów
Ostrzeżeń: 0/3 Skąd: Niebieskie dachY
|
Wysłany: Pon 16:12, 21 Sie 2006 Temat postu: |
|
|
Do dupy... jak wstawisz do AL 06h, to assembler wstawi tam chyba liczbę "6" cholera, za późno się zorientowałem - chyba trzeba będzie szukać dalej... ale daj znać co Ci wyszło z "testów".
Post został pochwalony 0 razy
|
|
|
|
|
|
|
|
|
|
|
nekrosoft
Dołączył: 07 Sie 2006
Posty: 3
Przeczytał: 0 tematów
Ostrzeżeń: 0/3
|
Wysłany: Wto 19:43, 29 Sie 2006 Temat postu: |
|
|
Problem rozwiązałem w inny sposób. Poprzez kontrolowanie zdarzen. KiRi dzięki za pomoc, napewno sie przyda ta wstawka assemblerowa tylko zamiast 06h wstawic trzeba 3feh jest to adres do rejestru MSR Com-a 1.
Post został pochwalony 0 razy
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach
|
|
|
|