Pointer in hohen Speicherbereich



  • Hallo,

    ich möchte gerne Wissen auf welchem Port meine COM1 ist. Die Adresse
    steht in den ersten 64Kb des Hauptspeichers auf 0x0400 und 0x0401 aber
    warum funktioniert das nicht:

    char *ZeigerHByte;
    char *ZeigerLByte;
    
    ZeigerHByte = 0x0400;
    ZeigerLByte = 0x0401;
    
    printf( "%d - %d", *ZeigerHByte, *ZeigerLByte );
    

    Das Programm stürzt nicht mal ab bei mir. Es passiert einfach garnichts.
    printf wird aufgerufen aber es passiert nichts auf der Konsole.

    danke im vorraus



  • %c ist fuer char

    auf welcher Plattform soll das denn laufen?
    uU werden eigene funktionen angeboten um COM1 anzusprechen

    uU ist auch 0x0400 nicht richtig, sondern du musst da noch einen offset addieren/subtrahieren...



  • Klar gibt es dafür OS spezifische funktionen aber das wäre ja zu einfach ;).

    Und einen Offset gibt es nicht bzw ist 0x00.



  • Shade Of Mine schrieb:

    %c ist fuer char

    unsigned char. Aber egal, weil bei printf sowieso immer Integer übergeben werden (variable Argumentenleiste). Die Zeile mit printf im Code ist mEn tadellos.



  • Kann es vielleicht sein, dass die Zeile nicht ausgegeben wird, wenn das die letzte Zeile der gesamten Ausgabe ist, und nicht mit \n abgeschlossen ist? Egal, das Programm hat noch ein paar mehr Macken. Ich weiß nicht, ob die direkte Zuweisung eines ints an einen Pointer legal ist, aber ich bezweifle es. Besser so:

    /* compilerabhängig, so funktionierts mit Borland C++ 2.0 */
    #include <dos.h>
    #include <stdio.h>
    
    int main() {
        unsigned short far * ports = MK_FP(0x40, 0);
        int i;
        for (i = 0; i < 4; ++i)
          printf("Portadresse von COM%d: %#hX\n", i + 1, ports[i]);
        return 0;
    }
    

    Das gehört übrigens nicht hierher, aber wird sicher bald verschoben ...



  • Das Schlüßelwort far kann ich mir doch schenken da unter 32Bit System
    Pointer sowieso far sein müssen, oder?

    Funktioniert übrigens nicht unter Borland C++ 3.0



  • 32bit? Ich denke es wird mal Zeit dass wir mit den Ratespielchen aufhören. Welches OS, welcher Compiler?



  • Auch wieder war.

    Windows 2000 und VC++ 6.0.



  • Kurze Antwort: Du kannst in der Konfiguration nicht direkt auf Ports zugreifen. Es sei denn du versuchst einen Treiber zu schreiben, aber das glaub ich nicht.



  • im konsolenfaq steht ein beitrag: ströme lenken..

    http://www.c-plusplus.net/forum/viewtopic.php?t=39312&start=0

    da gehts um win32 und com ports..

    ansonsten nimm den djgpp oder nen älteren borländer



  • Richtig, und wenn du einen DOS-Compiler hernimmst, dann nimm auch bitte die Funktionen inp() und outp() her, um auf den Speicherbereich der COM-Schnittstellen zuzugreifen. Übrigens musst du dann auch die Baudrate und die sog. UART-Parameter einstellen. Dafür brauchst du dann Offsets von der Anfangsadresse der COM-Schnittstelle.

    Daten der COM-Schnittstellen im Normalfall:

    COM1 -> IRQ = 4 ; Adresse = 0x3F8
    COM2 -> IRQ = 3 ; Adresse = 0x2F8
    COM3 -> IRQ = 15 ; Adresse = 0x3E8
    COM4 -> IRQ = 5 ; Adresse = 0x2E8

    PS: Das mit der Einstellerei der Baudrate usw. ist etwas kompliziert. Wenn du aber wissen willst wie das funktioniert, dann poste deswegen nochmal. Ich geb dir dann ein Codebeispiel. Vielleicht kann man auch einen Thread in der Konsolen-FAQ machen, wenn SideWinder mitspielt.



  • Die fragen über das UART und die Einstellung der Baudrate wären gleich im
    anschluß gekommen. Ich würde gerne dein Beispielcode mal sehen wollen



  • Werde in den nächsten Tagen im Konsolenforum den Thread für die Ansteuerung der Comports unter native DOS erstellen.



  • Der Thread ist jetzt erstellt im Konsolen-Forum. Viel Spaß damit.



  • thx, werde ich auf trollson (486) probieren 🙂


Anmelden zum Antworten