Logik?? Von allem Glauben daran Verlassen.



  • Hallo zusammen,

    Eigentlich sind ja nur 4 Zeilen Code notwendig, um einen Pin einer RS232 Schnittstelle in Griff zu bekommen, dachte ich.

    Ich habe dazu mal etwas gezaubert, von dem ich der Überzeugung war, es müsse funktionieren. Also, DTR HI, DTR LO, Ende:

    (geschrieben unter WIN 3.11 mit Microsoft Visual C++ in C)

    /* Prozedurkopf */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <direct.h>
    #include <io.h>
    #include <conio.h>
    #include <decl.h>
    
    /* Programm */    
    
    main()
    {
    
    __asm  /* DTR einschalten */
    {
    mov dx, 0x3fc
    in al, dx
    or al, 1
    out dx, al
    }              
    
    printf("warte...");    
    getch();
    
    __asm /* DTR ausschalten */  
    {
    mov dx, 0x3fc
    in al, dx
    xor al, 1
    out dx, al
    }  
    
    printf("warte auf ENDE");      
    getch();
    

    So, fehlerfrei compiliert wurde es schon mal, jedoch Will der DTR-Pin seinen Zustand nicht ändern, wenn das Programm ausgeführt wird.

    Nun habe ich ein wenig rum gespielt, und habe letztendlich den DTR in den Griff bekommen, aber mit einem Code, der für mich nicht mehr logisch ist, und dessen Verhalten nach dem Compilieren etwas merkwürdig ist.
    Das Hi-Lo schalten des Pins funktioniert schon mal wie gewünscht, ich habe zwischen den Schritten noch getch()-Zeilen eingefügt, um zu sehen wo das Programm was macht.

    Nun Funktioniert das Programm, wenn ich die Tastaturabfrage mit RETURN bestätige, aber mit SPACE z.B. reagiert der Pin nicht, und bleibt aut seinem HI:

    #include <stdio.h>
    #include <stdlib.h>
    #include <direct.h> 
    #include <io.h>
    #include <conio.h>
    #include <decl.h>
    /* Variablenbelegung */                 
    
    int horiz;                         
    
    /* Programm */    
    
    main() 
    {
    
    printf("... und los gehts...");
    getch();  
    
    __asm  /* DTR ausschalten */
    {
    xor al, 1
    mov dx,0x3fc 
    //in al, dx
    out dx,al
    }                
    printf("\nAus_1");
    getch();
    
    __asm  /* DTR einschalten */
    {
    mov dx,0x3fc 
    // in al, dx
    // al, 1
    out dx,al
    } 
    printf("\nAn_1");
    getch();
    
    printf("\nwarte auf ENDE");       
    getch();
    
    return(0);
    

    Reagiert getch nicht auf alle Tasten gleich? passiert irgend etwas mit den verwendeten Registern durch die Tastatureingabe? Warum funktioniert der erste Code nicht?

    Für Antworten wäre ich sehr dankbar Leute. Sonst schönes WE!

    Christian



  • Tja, sieht fast so aus, als wuerde dir der Windows-Treiber dazwischenfunken.

    Das Verhalten der RS232 haengt in deinem Code von der gedrueckten Taste ab, weil getch seinen Rueckgabewert in eax liefert und du al jeweils nicht komplett neu setzt.

    Also sollte auch das high-Setzen von DTR sich aendern, je nachdem, ob du Space (Bit0 = 0) oder Enter (Bit0 = 1) drueckst.
    Demnach *sollte* der Pin nur high gehen, wenn du das Erste mal Space weiterschaltest. Beim 2. mal geht er natuerlich nur mit space (oder jeder anderen Taste, die Bit0=0 zurueckliefert) auf low zurueck.

    Versuch's mal so:

    mov dx, 03FCh
    in al, dx
    push eax ; ggF. sicherer, eine Variable zum Sichern anzulegen.
    mov al, 1
    out dx, al
    
    ... Was auch immer du dazwischen machen willst...
    
    mov dx, 03FCh
    pop eax ; siehe oben
    and al, not 1
    out dx, al
    

    Sonst steht hier alles nochmal ganz genau zur Seriellen Schnittstelle:
    http://www.nondot.org/sabre/os/files/Communication/ser_port.txt

    PS:
    Mh... Hättest auch in deinem alten Thread posten koennen... Na egal. 😉


Anmelden zum Antworten