serielle schnitstelle zum x-ten mal!



  • Hallo alle zusammen!

    Mein Problem ist folgend:

    Ich habe ein einfaches Programm wo zwei Rechner mit einander kommunizieren über die COM 1 Schnittstelle;

    #include <stdio.h>
    #include <conio.h>

    #define PORT 0x3F8 /* COM1 */

    /* Defines Serial Ports Base Address
    COM1 0x3F8
    COM2 0x2F8
    COM3 0x3E8
    COM4 0x2E8
    */

    int main(void)
    {
    int checkBuffer;
    int c;
    _outp(PORT + 1 , 0); /* Turn off interrupts */
    /* PORT - Communication Settings /
    _outp(PORT + 3 , 0x80); /
    SET DLAB ON /
    _outp(PORT + 0 , 0x0C); /
    Set Baud rate - Divisor Latch Low Byte */
    /* Default 0x03 = 38,400 BPS */
    /* 0x01 = 115,200 BPS */
    /* 0x02 = 56,700 BPS */
    /* 0x06 = 19,200 BPS */
    /* 0x0C = 9,600 BPS */
    /* 0x18 = 4,800 BPS */
    /* 0x30 = 2,400 BPS /
    _outp(PORT + 1 , 0x00); /
    Set Baud rate - Divisor Latch High Byte /
    _outp(PORT + 3 , 0x03); /
    8 Bits, No Parity, 1 Stop Bit /
    _outp(PORT + 2 , 0xC7); /
    Configure FIFO Control Register /
    _outp(PORT + 4 , 0x0B); /
    Turn on DTR, RTS, and OUT2 */
    printf("\nSample Comm's Program. Press ESC to quit \n");

    do {

    checkBuffer = _inp(PORT + 5);
    if (checkBuffer & 1) {
    c = _inp(PORT);
    printf("%c", c);
    if (c == 13) printf("\n");
    _outp(PORT, c);
    }
    if (kbhit()) {
    c = getch();
    _outp(PORT, c);
    }
    } while (c !=27);

    return 0;
    }

    Hier ist die Schnittstelle schon vorgegeben mit allen Einstellungen;
    #define PORT 0x3F8 /* COM1 /
    _outp(PORT + 1 , 0); /
    Turn off interrupts */
    /* PORT - Communication Settings /
    _outp(PORT + 3 , 0x80); /
    SET DLAB ON /
    _outp(PORT + 0 , 0x0C); /
    Set Baud rate - Divisor Latch Low Byte */
    /* Default 0x03 = 38,400 BPS */
    /* 0x01 = 115,200 BPS */
    /* 0x02 = 56,700 BPS */
    /* 0x06 = 19,200 BPS */
    /* 0x0C = 9,600 BPS */
    /* 0x18 = 4,800 BPS */
    /* 0x30 = 2,400 BPS /
    _outp(PORT + 1 , 0x00); /
    Set Baud rate - Divisor Latch High Byte /
    _outp(PORT + 3 , 0x03); /
    8 Bits, No Parity, 1 Stop Bit /
    _outp(PORT + 2 , 0xC7); /
    Configure FIFO Control Register /
    _outp(PORT + 4 , 0x0B); /
    Turn on DTR, RTS, and OUT2 */

    Eigentlich sollte ich eine Funktion dazu schreiben die eine INI Datei öffnet -> komm.ini
    und die Werte ausliest, entsprechen den Variablen übergibt und weiterverarbeitet in dem Programm;

    Die komm.ini Datei Sieht so aus:

    Aktuelleschnitstelle=COM1
    Baudrate=9600
    Datenbits=8
    Parität=Keine
    Stopbits=1
    Datenfluss=ON

    Dazu habe ich diese stück Programm geschrieben, aber ich komme nicht weiter, d.h. ich kriege es hin nur denn ersten Wert auszulesen:

    int ini(void)

    {

    FILE *File;
    char msg[50];
    char wert[50];
    int i;
    int PORT;

    File = fopen("c:\\Projekt\\komm.ini","r");
    if (File != NULL)
    {
    fgets(msg,LINESIZE,File);

    for (i=0;i<4;i++)
    {
    wert[i] = msg[strlen(msg)-4+i];
    }
    wert[4]='\0';

    if (strcmp(wert,"COM1")==0) {PORT=0x3F8;}
    printf("\n Der Port ist: %s", wert);

    fclose(File);
    }
    else
    {
    printf("Datei nicht vorhanden!");
    }

    return 0;
    }

    Die Idee ist das man nur Änderungen in der ini Datei vornimmt, ohne jedes mal das Programm übersetzen zu müssen;

    Ich wäre schon glücklich wenn ich die einzelne Werte bekommen werde, die weitere Bearbeitung kriege ich schon hin (glaube ich)!

    Kann mir jemand weiter helfen oder sagen ob es so was schon gibt (bestimmt, oder?);

    Danke im voraus!



  • Hi,

    irre ich mich oder liest Du auch nur einmal. Da fehlt doch eine Schleife. Du öffnest, liest, verarbeitest und schließt die Datei wieder. Klar, dass Du nur einen Wert bekommst.

    Gruß

    Oliver 🙂



  • Ja, das Problem habe ich auch erkannt, aber komme nicht weiter;
    Ich weiss nicht wie ich zu der zweite Zeile der INI Datei kommen soll;
    Es ist mir klar das ich zum Beispiel char bau[50] brauche um den Wetrt vom Baudrate zu speichern, und weis das die Abfrage enlich wie bei wert sein soll, aber ich habe das Problem in die zweite Zeile zu kommen; 😞



  • Hi nochmal,

    einfach "fgets" in einer Schleife solange ausführen, bis das Ende der Datei erreicht ist. Innerhalb der Schleife jeweils die Verarbeitung der for-Schleife, wie Du sie schon programmiert hast, ausführen und das für jeden gelesenen String der Datei.

    Sorry, mehr kann ich erst heute abend schreiben, wenn es dann noch notwendig ist. Such einfach mal in der MSDN nach while, eof oder FILE, dann findest Du bestimmt ein Beispiel, wenn nicht, melde Dich nochmal :p

    Gruß

    Oliver

    [ Dieser Beitrag wurde am 16.01.2003 um 14:05 Uhr von oj0169 editiert. ]



  • Ich versuche es und wenn es nicht klappt melde ich mich heute Abend noch mal!

    Danke!



  • Hallo,

    ich bin dran, es dauert einen Moment ...

    Gruß

    Oliver 🕶



  • Hi,

    also hier jetzt der mögliche Code: (Vors.: Jede Zeile der Datei wird mit ";" abgeschlossen!!)
    Sorry, aber der eine Free()-Befehl führt zum Absturz, vielleicht hat einer eine Idee, warum?

    Aber so kann man es grundsätzlich machen. 🙂
    Gruß

    Oliver

    So sieht die Datei aus:

    Aktuelleschnitstelle=COM1;
    Baudrate=9600;
    Datenbits=8;
    Parität=Keine;
    Stopbits=1;
    Datenfluss=ON;

    #include "stdafx.h"
    #include <stdio.h>
    #include <string.h>
    #include <malloc.h>
    #include <stdlib.h>
    
    int ini(void)
    
    {
    
        FILE *File;
        char *msg;
        char *wert;
        int PORT;
        int BAUD;
    
        msg  = (char *) malloc(80);
        wert = (char *) malloc(80);
    
        File = fopen("c:\\Projekt\\komm.ini","r");
        if (File != NULL)
        {
            while(!feof(File))
            {
                fgets(msg,80,File);
    
                wert = strtok((char *) msg, (const char *) "=");
    
                if (strcmp(wert,"Aktuelleschnitstelle")==0)
                {
                    wert = strtok((char *) NULL, (const char *) ";");
                    PORT=0x3F8;
                    printf("\n Der Port ist: %s", wert);
                } 
    
                if (strcmp(wert,"Baudrate")==0)
                {
                    wert = strtok((char *) NULL, (const char *) ";");
                    BAUD=atoi(wert);
    
                    printf("\n Die Baudrate ist: %s", wert);
                } 
    
                if (strcmp(wert,"Datenfluss")==0)
                {
    
                    wert = strtok((char *) NULL, (const char *) ";");
                    printf("\n Der Datenfluss ist : %s", wert);
                } 
            }
    
            fclose(File);
        }
        else
        {
            printf("Datei nicht vorhanden!");
        }
    
        //free( wert );
        free( msg );
    
        printf("\n\n");
        gets(wert);
    
        return 0;
    } 
    
    int main(int argc, char* argv[])
    {
        int retcode = ini();
        return 0;
    }
    


  • moin meister ...

    strtok liefert einen Zeiger auf den Beginn der gefundenen Zeichenfolge in s1 zurück. Wenn keine weitere Zeichenfolge gefunden wird, ist der Rückgabewert NULL.

    ....
    while(!feof(File))
    {
        fgets(msg,80,File);
        wert = strtok((char *) msg, (const char *) "=");
        ....
    

    ich vermute mal, dass in der ini-Datei als auch nach der letzen Zeile ein
    Zeilenumbruch steht.
    Wenn das so ist liest du die letzte Zeile ein, das Dateiende ist aber noch nicht
    erreicht, weil fgets bis zum Zeilenumbruch liest, es müsste aber praktisch weiter lesen um festzustellen, dass das Dateiende erreicht ist.

    Also wird die Schleife nach der letzen Zeile nicht abgebrochen, und fget wird wieder aufgerufen, jetzt wird das Dateiende erreicht, was in msg steht weiss ich nicht w*****einlich NULL. Daraufhin wird strtok((char*) 'NULL', ...); aufgerufen, was wiederum zur Folge hat, dass wert = NULL gesetzt wird.

    Die Schleife wird nun abgebrochen weil eof erreicht und
    free(wert) oder free(NULL) ! aufgerufen -> Absturtz.

    ohne die Schleifenlogik zu ändern würde ich einen BackupZeiger für wert einrichten und wie folgt verwenden ...

    char *wert_bup;
    ....
    while(!feof(File))
    {
        fgets(msg,80,File);
    
        wert_bup = wert;
    
        wert = strtok((char *) msg, (const char *) "=");
    
        if(wert == NULL) wert = wert_bup;
    
        ....            
    }
    free(wert);
    


  • N'Abend größter aller Meister,

    Ah jetzt ja! Das könnte eine mögliche Erklärung sein! Hmmmhh, aber ganz verstanden habe ich das noch nicht. Also, der Wert von "Wert" ist zuletzt "Null"? Und deswegen kann ich den mit malloc allokierten Datenspeicher nicht über free freigeben 😕 ?? Könnte der größte aller Meister dazu vielleicht noch was sagen? 🙂

    Danke!

    Oliver 😃

    [ Dieser Beitrag wurde am 18.01.2003 um 21:15 Uhr von oj0169 editiert. ]



  • hi, warum so umstaendlich........ um eine .ini datei auszulesen brauchst du nur folgende funktion GetPrivateProfileString()



  • Hi,

    weil ich die Funktion nicht kannte!!??!! 😃

    [ Dieser Beitrag wurde am 20.01.2003 um 07:00 Uhr von oj0169 editiert. ]



  • @toom

    Danke für die Lösung..

    Mensch da bekommt man ja echt kopfschmerzen sorry aber wenn ich schon INI Dateien verwende, dann nimm bitte auch die dazugehörigen Informationen wie GetPrivateProfileString etc. (siehe toom)
    Da kannst du dir das ganze Parsen der Datei sparen..

    Das tut wirklich weh....

    Sorry nicht persönlich nehmen..



  • Danke leute!(OLIVER)
    Ihr hat mir echt geholfen!

    :)!



  • Hallo,

    ja, Ihr habt mir auch geholfen. Ich brauche dasselbe nämlich auch demnächst.

    Vielen Dank.

    Oliver 😉



  • moin meister ...

    Ich glaube das Problem mit den Ini´s hat sich gelöst ...

    Zu dem Problem mit dem free ... kurz nochmal:

    main()
    {
    char* szWert = (char*) malloc(80);
    szWert = NULL;
    free(szWert); // *knall*
    return 0;
    }

    und nicht anderes macht dein Programm beim lesen der letzen Zeile, weil in der letzen Zeile offensichtlich nichts mehr drinn steht, weil die vorletzte Zeile mit einen '\n' endet.

    mfg
    RB


Anmelden zum Antworten