COM Port ansprechen



  • Die WinAPI ist ja auch in/für C geschrieben, also wo ist das Problem? (falls du wirklich nur mit ANSI-C arbeiten willst, wirst du hier nicht weit kommen - C kennt keine RS232-Schnittstellen, wird also auch keine Funktionen bieten, um die anzusprechen)



  • Ok, das wusste ich nicht das C keine RS232-Schnittstellen ansprechen kann. Wie sehe dann eine main aus die CreateFile benutzt. Ein Codeschnippsel würde reichen.

    danke
    mfg,



  • das könntest du als vorlage nehmen...

    HANDLE g_hcomm;                 // COMM handle
    unsigned char g_rxframe[1500];  // Rx frame buffer
    
    ///////////////////////////////// COMM I/O functions ///////////////////////////////
    
    void COMM_Init (char *comport, DWORD baudrate)
    {
       COMMTIMEOUTS commtimeouts;
       DCB dcb;
    
       g_hcomm = CreateFile (comport,
          GENERIC_READ | GENERIC_WRITE,
          0,
          NULL,
          OPEN_EXISTING,
          FILE_ATTRIBUTE_NORMAL,
          NULL);	
    
       /* Is it open? */
       if (g_hcomm == INVALID_HANDLE_VALUE)
          ERREXIT ("Cannot open COM port");
    
       /* Adjust buffer */
       if (SetupComm (g_hcomm, 10000, 10000) == FALSE)
          ERREXIT ("Cannot set COM buffers");
    
       /* Set speed, flow control,  etc */
       GetCommState (g_hcomm, &dcb);
       dcb.BaudRate = baudrate;
       dcb.ByteSize = 8;
       dcb.Parity = NOPARITY;
       dcb.StopBits = ONESTOPBIT;
       dcb.fRtsControl = 1;   /* Set to 0 if RTS not needed */
       dcb.fOutxCtsFlow = 1;  /* Also set 0 if CTS not needed */ 
       if (SetCommState (g_hcomm, &dcb) == FALSE)
          ERREXIT ("Cannot configure COMM");
    
       /* No time-outs */
       memset (&commtimeouts, 0, sizeof(commtineouts));
       if (SetCommTimeouts (g_hcomm, &commtimeouts) == FALSE)
          ERREXIT ("Cannot set COMMTIMEOUTS");
    
       /* Drain driver's FIFOs .... */
       PurgeComm (g_hcomm, 
          PURGE_RXABORT | 
          PURGE_TXABORT |
          PURGE_RXCLEAR |
          PURGE_TXCLEAR);
    
       printf ("COM port initialized\n");
    }
    
    /* Writes single byte */
    #define COMM_Write(c) \
        while (0 == TransmitCommChar (g_hcomm, (c))) \
            Sleep(1);
    
    /* Reads one byte or -1 if nothing available'
    int COMM_Read (void)
    {
       DWORD commerr;
       COMSTAT comstat;
       DWORD bytes_read;
       UINT8 b;
    
       ClearCommError (g_hcomm, &commerr, &comstat);
       if (comstat.cbInQue == 0)
          return -1;
    
       ReadFile (g_hcomm, &b, 1, &bytes_read, NULL);	
       return b;
    }
    

    🙂



  • hab versucht den Code zu kompilieren mit Visual Studio 2005 und bekomme folgende Fehlermeldungen:

    Fehler	1	error C2061: Syntaxfehler: Bezeichner 'g_hcomm'	
    Fehler	2	error C2059: Syntaxfehler: ';'	
    Fehler	3	error C2146: Syntaxfehler: Fehlendes ')' vor Bezeichner 'baudrate'	rld 2.c	6	
    Fehler	4	error C2081: 'DWORD': Name in der formalen Parameterliste ist ungültig	2.c	6	
    Fehler	5	error C2061: Syntaxfehler: Bezeichner 'baudrate'	6	
    Fehler	6	error C2059: Syntaxfehler: ';'	world 2.c	6	
    Fehler	7	error C2059: Syntaxfehler: ')'	world 2\hello world 2\hello world 2.c	6	
    Fehler	8	error C2449: '{' auf Dateiebene gefunden - fehlt der Funktionskopf?	2.c	7	
    Fehler	9	error C2059: Syntaxfehler: '}'	d:\samir\erste schritte\hello 51	
    Fehler	10	fatal error C1071: Unerwartetes Dateiende innerhalb eines Kommentars	2.c	73
    


  • du solltest vielleicht <windows.h> includen?
    🙂



  • Ok danke das hätte ich wohl machen sollen, aber habe immer noch Fehlermeldungen:

    Warnung	1	warning C4133: 'Funktion': Inkompatible Typen - von 'char *' zu 'LPCWSTR'	13	
    Warnung	2	warning C4013: 'ERREXIT' undefiniert; Annahme: extern mit Rückgabetyp int		23	
    Fehler	3	error C2065: 'commtineouts': nichtdeklarierter Bezeichner		41	
    Fehler	4	fatal error C1071: Unerwartetes Dateiende innerhalb eines Kommentars	75
    


  • mrsplinter schrieb:

    Warnung	1	warning C4133: 'Funktion': Inkompatible Typen - von 'char *' zu 'LPCWSTR'	13	
    Warnung	2	warning C4013: 'ERREXIT' undefiniert; Annahme: extern mit Rückgabetyp int		23	
    Fehler	3	error C2065: 'commtineouts': nichtdeklarierter Bezeichner		41	
    Fehler	4	fatal error C1071: Unerwartetes Dateiende innerhalb eines Kommentars	75
    

    das hab ich schlecht zusammengestückelt, sorry.
    1. projekteinstellungen auf ANSI, nicht UNICODE stellen
    2.

    void ERREXIT (char *str)
    {
        printf ("ERROR: %s\n", str);
        exit (0);
    }
    

    3. muss commtimeouts heissen
    4. in zeile 58 das letzte ' gegen */ tauschen oder ganz vorne // hin
    🙂



  • erstmal brauchst du dich nicht entschuldigen den ich bin für jeden Beitrag dankbar.

    1. projekteinstellungen auf ANSI, nicht UNICODE stellen
    

    das versteh ich nicht ganz??? Wo stell ich das bei Visiual Studio ein?

    bei 2.

    void ERREXIT (char *str)
    {
        printf ("ERROR: %s\n", str);
        exit (0);
    }
    

    Soll ich den Code noch in die Datei einfügen?

    mfg,



  • mrsplinter schrieb:

    1. projekteinstellungen auf ANSI, nicht UNICODE stellen
    

    das versteh ich nicht ganz??? Wo stell ich das bei Visiual Studio ein?

    irgend so'n projektweites #define, _MBCS oder so hiess das. schau mal in die doku oder frag im winapi-forum o.ä.

    mrsplinter schrieb:

    bei 2.

    void ERREXIT (char *str)
    {
        printf ("ERROR: %s\n", str);
        exit (0);
    }
    

    Soll ich den Code noch in die Datei einfügen?

    ja, oder sowas ähnliches.
    🙂



  • DAU Jones schrieb:

    mrsplinter schrieb:

    1. projekteinstellungen auf ANSI, nicht UNICODE stellen
    

    das versteh ich nicht ganz??? Wo stell ich das bei Visiual Studio ein?

    irgend so'n projektweites #define, _MBCS oder so hiess das. schau mal in die doku oder frag im winapi-forum o.ä.

    Du kannst entweder _UNICODE (UNICODE-Stringverarbeitung auf wchar_t-Basis), _MBCS (Multi-Byte Stringverarbeitung auf char-Basis) oder gar keins der Makros (ANSI-Stringverarbeitung auf char-Basis) angeben - das wirkt sich dann auf die verwendeten Zeichentypen aus. Für Erklärungen wie empfehle ich die MSDN.

    (um das projektweit einzustellen, trägst du die entsprechenden Namen unter Project->Settings->C/C++ als "Preprocessor definitions" ein)


Anmelden zum Antworten