kostenloser Webspace werbefrei: lima-city


C/Windows: RS232 / Serielle Schnittstelle

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    kalkionline

    kalkionline hat kostenlosen Webspace.

    Hallo Zusammen,

    ich bin auf der Suche nach einem guten und verständlichen Beispiel, wie man die serielle Schnittstelle (RS232) mit C unter Windows vernünftig ansprechen kann. Konkret geht es dabei um die Kommunikation zwischen dem PC (USB<->RS232-Adapter) mit einem Mikrocontroller von Atmel. Bisher sprech ich mit dem Atmel über telnet, aber auf dauer ist das keine Lösung...

    Danke im Voraus!
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ganz einfach,
    //----------------------------------------------------------------------
    // Titel     : Mess- und Reglungstechnik (Teil 1) 
    //----------------------------------------------------------------------
    // Funktion  : Werte von einem COM-Port einlesen und in einer Textdatei speichern
    // Sprache   : C
    // Datum     : 01.12.2007
    // Version   : 1.0
    // Autor     : Stephan Schweig
    //----------------------------------------------------------------------
    #define WIN32_LEAN_AND_MEAN    // Selten verwendete Teile der Windows-Header nicht einbinden.
    #include <io.h>
    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <time.h>
    
    HANDLE hComm;
    DCB dcb;
    COMMTIMEOUTS commtimeouts;
    const char strDatei[] = "C:\\rs232_data.txt";
    
    //----------------------------------------------------------------------
    // Fehlermeldung vom System holen, ausgeben und Programm beenden
    int Fehlerausgabe(void) 
    { 
       LPVOID lpBuffer;
       DWORD dwFehlercode = GetLastError();
    
       FormatMessage(
               FORMAT_MESSAGE_ALLOCATE_BUFFER | 
               FORMAT_MESSAGE_FROM_SYSTEM,
               NULL,
               dwFehlercode,
               MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
               (LPTSTR) &lpBuffer,
               0, NULL );
    
       printf("Fehler %d: %s\r\n", dwFehlercode, lpBuffer); 
    
       LocalFree(lpBuffer);
       ExitProcess(dwFehlercode);
    
       if(hComm != NULL) CloseHandle(hComm);
       return 1;
    }
    //----------------------------------------------------------------------
    
    //----------------------------------------------------------------------
    // Hauptprogramm: COM8 öffnen und Daten vom Port in eine Datei schreiben
    int main(int argc, char* argv[])
    {
       // Port öffnen
       hComm = CreateFile( "COM8",
               GENERIC_READ | GENERIC_WRITE, 
               0, 
               NULL, 
               OPEN_EXISTING, 
               FILE_ATTRIBUTE_NORMAL, 
               NULL); 
    
       // Port geöffnet?
       if(hComm == INVALID_HANDLE_VALUE)
           return Fehlerausgabe();
    
       // IO-Buffer setzen
       if(SetupComm(hComm, 2048, 2048) == FALSE)
           return Fehlerausgabe();
    
       // COM-Port einstellen
       if(GetCommState(hComm, &dcb) == FALSE)
           return Fehlerausgabe();
    
       dcb.BaudRate = 9600; 
       dcb.ByteSize = 8;
       dcb.Parity = NOPARITY; 
       dcb.StopBits = ONESTOPBIT; 
       dcb.fRtsControl = 1;
       dcb.fOutxCtsFlow = 1;
    
       if(SetCommState(hComm, &dcb) == FALSE)
           return Fehlerausgabe();
    
       // Timout setzen
       memset(&commtimeouts, 0, sizeof(COMMTIMEOUTS)); 
       if(SetCommTimeouts(hComm, &commtimeouts) == FALSE)
           return Fehlerausgabe();
    
       // IO-Buffer leeren
       PurgeComm(hComm, PURGE_RXABORT | PURGE_TXABORT | PURGE_RXCLEAR | PURGE_TXCLEAR);
    
       printf("Zum beenden des Programms ESC druecken.\r\n\r\n");
    
       FILE* fp;
       DWORD commerr;
       COMSTAT comstat;
       DWORD bytes_read;
       UINT8 b;
    
       while(1)
       {
           b = 0;
           ClearCommError(hComm, &commerr, &comstat);
           if(comstat.cbInQue != 0)
           {
               // Wenn Bytes im Buffer vorhanden, dann lesen
               if(ReadFile(hComm, &b, 1, &bytes_read, NULL) != 0)
               {
                   printf("%c",b);
                   fp = fopen(strDatei,"a");
                   if(fp != NULL)
                   {
                       fprintf(fp,"%c",b);
                       fclose(fp);
                       fp = NULL;
                   }
               }
           }
    
           // Wenn ESC gedrückt wird, die Schleife unterbrechen.
           if(kbhit())
           {
               if(_getch() == 27)
                   break;
           }
       }
    
       // COM-Port schließen
       CloseHandle(hComm);
    
       return 0;
    }
    //----------------------------------------------------------------------


    Kommt auch von einer ATmega-Temperaturmessung: http://www-stud.uni-due.de/~sdstscwe/index.php/Artikel/1-Sonstige%20Artikel/44-Mess-%20und%20Reglungstechnik%20(Teil%201)?start=3
  4. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!