Forum Ruda Śląska Strona Główna Ruda Śląska
Nieoficjalne forum miasta Ruda Śląska


Sprawdzenie sygnału CTS w VC++

 
Napisz nowy temat   Odpowiedz do tematu    Forum Ruda Śląska Strona Główna -> Komputer | Internet
Zobacz poprzedni temat :: Zobacz następny temat  
nekrosoft




Dołączył: 07 Sie 2006
Posty: 3
Przeczytał: 0 tematów

Ostrzeżeń: 0/3

 PostWysłany: Pon 11:51, 07 Sie 2006    Temat postu: Sprawdzenie sygnału CTS w VC++ Back to top

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 Wink - KiRi]


Post został pochwalony 0 razy
 
Zobacz profil autora
KiRi
Administrator
Administrator



Dołączył: 25 Lut 2006
Posty: 267
Przeczytał: 0 tematów

Ostrzeżeń: 0/3
Skąd: Niebieskie dachY

 PostWysłany: Nie 20:20, 20 Sie 2006    Temat postu: Back to top

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... Smile


Post został pochwalony 0 razy
 
Zobacz profil autora
KiRi
Administrator
Administrator



Dołączył: 25 Lut 2006
Posty: 267
Przeczytał: 0 tematów

Ostrzeżeń: 0/3
Skąd: Niebieskie dachY

 PostWysłany: Nie 21:00, 20 Sie 2006    Temat postu: Back to top

Ok, można by to zrobić tak:

Pobierasz zawartość 06h, i umieszczasz ją np. w rejestrze AL:

[1]
Kod:
mov AL, 06h


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]
Kod:
and al, 00010000b


a następnie przestawić dane tak, żeby intersujący na bit poszedł na skraj rejestru (bit czwarty przesunąć na bit 0):

[3]
Kod:
shr al, 4


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
 
Zobacz profil autora
nekrosoft




Dołączył: 07 Sie 2006
Posty: 3
Przeczytał: 0 tematów

Ostrzeżeń: 0/3

 PostWysłany: Pon 11:47, 21 Sie 2006    Temat postu: Back to top

Dzieki. Zaraz sie wezme za testowanie.
Pijany nie jestes bo to Visual C++


Post został pochwalony 0 razy
 
Zobacz profil autora
jacinho




Dołączył: 31 Mar 2006
Posty: 67
Przeczytał: 0 tematów

Ostrzeżeń: 0/3
Skąd: Bykowina

 PostWysłany: Pon 15:26, 21 Sie 2006    Temat postu: Back to top

kurcze, skomplikowane to Razz

Post został pochwalony 0 razy
 
Zobacz profil autora
KiRi
Administrator
Administrator



Dołączył: 25 Lut 2006
Posty: 267
Przeczytał: 0 tematów

Ostrzeżeń: 0/3
Skąd: Niebieskie dachY

 PostWysłany: Pon 16:12, 21 Sie 2006    Temat postu: Back to top

Do dupy... jak wstawisz do AL 06h, to assembler wstawi tam chyba liczbę "6" Sad 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
 
Zobacz profil autora
nekrosoft




Dołączył: 07 Sie 2006
Posty: 3
Przeczytał: 0 tematów

Ostrzeżeń: 0/3

 PostWysłany: Wto 19:43, 29 Sie 2006    Temat postu: Back to top

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
 
Zobacz profil autora
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum Ruda Śląska Strona Główna -> Komputer | Internet Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1

 
Skocz do:  
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