logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C++] Jak wystawić bajt na porcie LPT w Windows 98 za pomocą WinAPI?

super_sonic 08 Sty 2004 12:06 5909 14
REKLAMA
  • #1 466949
    super_sonic
    Poziom 17  
    Posty: 307
    Pomógł: 7
    Ocena: 6
    czy ktos wie jak korzystajac z WinApi wystawic bajt na porcie LPT?czy moglby ktos mnei poratowac kawalkiem kodu?

    Temat zamykam. - arnoldziq
  • REKLAMA
  • #2 466958
    mmm777
    Poziom 31  
    Posty: 1824
    Pomógł: 98
    Ocena: 240
    Jeżeli to NT+, to system do portów nie dopuszcza programów użytkowych, trzeba mieć driver np. GiveIO (http://www.geocities.com/Miroslaw_Maczka/winnt/), a potem po prostu in i out instrukcje maszynowe...
  • #3 467927
    super_sonic
    Poziom 17  
    Posty: 307
    Pomógł: 7
    Ocena: 6
    program bedzie chodzil na win98 , a moglbys mnie poratowac przykladowym kodem?bylbym wdzieczny:)
  • #4 467944
    mmm777
    Poziom 31  
    Posty: 1824
    Pomógł: 98
    Ocena: 240
    Niestety, moje doświadczenia są poniekąd odwrotne, przerabiałem tylko programator do Atmeli (Spider Brain) z Win9x tak, by chodził pod NT. Poszukaj po forum, były tu jakieś przykłady. Jeżeli kompilator ma funkcje inp i out, to nie będzie problemów.
  • REKLAMA
  • #5 468215
    super_sonic
    Poziom 17  
    Posty: 307
    Pomógł: 7
    Ocena: 6
    Dziekuje Ci
  • REKLAMA
  • #6 468491
    powerm
    Poziom 23  
    Posty: 631
    Pomógł: 43
    Ocena: 43
    Nie wiem czemu utrudniasz sobie zycie.
    Wyslanie bajtu to wyslanie jednej litery ASCII.
    Wiec zaloz sobie driver Generic Text i kopiuj do niego litera po literze np type a > lpt1:
  • REKLAMA
  • #7 469259
    super_sonic
    Poziom 17  
    Posty: 307
    Pomógł: 7
    Ocena: 6
    no tyle ze musze sobie utrudniac zycie bo to czesc mojaj pracy dyplomowej:(musze sam to napisac, ale dzieki
  • #8 501058
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    eh.. jak lpt to czyli port 378:

    zapisz:
    asm
    mov dx,0378h
    mov al,dana
    out dx,al
    end;

    odczyt:
    asm
    mov dx,0378h
    in al,dx
    mov dana,al
    end;

    na necie roji sie od opisów lpt..
  • #9 501068
    super_sonic
    Poziom 17  
    Posty: 307
    Pomógł: 7
    Ocena: 6
    a jak to wstawic do c++ zeby sie z nim nie zagryzlo? mozna zrobic to np tak :
    #include < iostream.h>

    main(){
    int dana;
    _asm {
    mov dx,0378h
    mov al,dana
    out dx,al
    }
    return(0);
    }

    ??
    jestem lewy jesli chodzi o asembler:(
  • #10 502160
    h-doc
    Poziom 27  
    Posty: 1208
    Pomógł: 57
    Ocena: 21
    w VC++ dyrektywa asm musi miec podwojne podkreslenie (czyli __asm)
  • #11 502229
    super_sonic
    Poziom 17  
    Posty: 307
    Pomógł: 7
    Ocena: 6
    zrobilem tak:

    __asm{
    mov dx,0378h
    mov al,dana
    out dx,al
    }

    i przy "out dx,al " dostalem komunikat : " error C2443 : operand size conflict"
    co jest nie tak??

    jakiego typu musi byc zmienna dana? za kazdym razem gdy daje int wyskakuje mi powyzszy kominkat:(
  • #12 502322
    Gavian
    Poziom 14  
    Posty: 83
    Pomógł: 1
    Ocena: 2
    Dana musi byc 8 bitowa, a więc typ char.

    Pozdrawiam
  • #13 502328
    super_sonic
    Poziom 17  
    Posty: 307
    Pomógł: 7
    Ocena: 6
    #include <iostream.h>
    #include <stdlib.h>

    void zapisz(char dana);

    main(){
    char liczba;
    cout<<"Wpisz wartosc do wystawienia na porcie...";
    cin>>liczba;
    zapisz(liczba);
    return(0);
    }

    void zapisz(char dana){
    __asm{
    mov dx,0378h
    mov al,dana
    out dx,al
    }
    system("pause");
    }

    czy to bedzie dzialac pod 98? ja mam xp i za bardzo nei dziala:(
  • #14 502439
    praw
    Poziom 17  
    Posty: 192
    Pomógł: 17
    Ocena: 10
    Powinno chodzic pod 98, a zeby chodzilo pod XP nalezy doinstalowac driver odblokowujacy porty (chodzi o te wstawki asemblerowe) - gdzies na elektrodzie sie paletal, ale jak na zlosc nie pamietam nazwy (chyba cos w rodzaju userport) - poszukaj na forum programowania mikrokontrolerow - tam powinno byc

    pozdro
  • #15 507671
    super_sonic
    Poziom 17  
    Posty: 307
    Pomógł: 7
    Ocena: 6
    dzieki wam wszystkim, chodzi jak marzenie:)

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy sposobu wystawienia bajtu na porcie LPT w systemie Windows 98 przy użyciu WinAPI i asemblera w C++. Podkreślono, że na systemach NT (np. Windows XP) dostęp do portów jest zablokowany dla aplikacji użytkowych i wymaga sterownika odblokowującego, np. GiveIO lub userport. W Windows 98 bezpośredni dostęp do portu LPT (adres 0x378) jest możliwy poprzez instrukcje asemblerowe inp i out. Przykładowy kod w C++ wykorzystuje dyrektywę __asm do wysłania bajtu (typu char) na port LPT. Zwrócono uwagę, że zmienna z danymi musi być 8-bitowa (char), aby uniknąć błędu operand size conflict. Podano prosty przykład funkcji zapisz(char dana), która wysyła bajt na port 0x378. Wskazano również alternatywne metody, jak użycie sterownika Generic Text i kopiowanie danych do lpt1: za pomocą polecenia typu "type a > lpt1:". Dyskusja kończy się potwierdzeniem działania rozwiązania pod Windows 98.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA