COM-Port



  • Hallo,

    Ich bin neu im Forum und hoffe, hier einige Antworten zu finden bzw. zu bekommen... Desshalb gleich im voraus: Ich bin Anfänger, also bitte entschuldigt, wenn ich ab un zu auch mal nach "absolutem Basiswissen" frage! 😞

    Also, zur zeit Quält mich folgendes Problem:

    Ich will erstmal ein Programm "basteln", das Daten vom COM-Port abfängt und ausgieb, das wärs.

    Später - wenn ich mal kappiert habe wie 's funktioniert - soll darau ein DLL werden, mit dem ich mehrere Ports gleichzeitig öffnen kann, Daten senden, Daten laufend empfangen sowie die Settings für die einzelnen Ports manipulieren... kingt lustig, ist aber so...

    Ich hab' auch schon ein Bisschen ausprobiert, aber nur das senden klappt... teilweise... Das sieht dan ungefähr aus wie folgt:

    // Hab ich wegen des Platzverbrauche entfernt....
    

    Der gröste Teil ist übrigens schon aus dem Forum "geklaut".

    Nun die Frage noch mal konkret:

    Wie sieht eine Funktion aus, die dauernd Daten vom COM-Port abfängt, und zwar so, das ich gegebenebfalls die daten in einem Fenster oÄ. ausgeben kann, und gleichzeitig über den selben Port daten schicken?

    Besten Dank schon im Voraus
    Dan



  • Besten Dank für die zahlreichen Antworten 😉

    OK, war ne Fragenstellung à la "schreib mir mal jemand ein Programm, welchen..."

    Neuer Versuch: Ich hab selbst noch etwas recherchiert und hab es so einigermassen zun laufen gebracht, allerdings schmiert mir, wenn ich was auf den Komport sende, während das Gerät am Komport bereits sendet, dieses "Gerät" immer ab ( Testaufbau: DEV-PC <--> Null-Modem-Kabel <--> PC mit AccesPort)...

    --> AccesPort ist zu finden unter http://www.sudt.com/en/

    Währe FILE_FLAG_OVERLAPPED eine/die Lösung? Was bewirkt dieser Parameter überhaut (hab' z.Z. kein MSDN zur verfügung)?

    Hier noch mal der aktuelle Test-Code (entschuldit die "Zukleisterei" bitte, aber die letzte Version war ein etwas arter Schlag meinerseits):

    #include <cstdlib>
    #include <iostream>
    #include <windows.h>
    #include <string.h>
    #include <stdio.h>
    
    #define MAX_SEND_BYTES 50
    
    BOOL  fDebugMode = TRUE;
    
    BOOL setCOMSettings(HANDLE hPort)
    {
      DCB dcb;
      COMMTIMEOUTS cto;
    
      // set general settings
      if(GetCommState(hPort,&dcb))
      {
        dcb.BaudRate = CBR_9600;
        dcb.StopBits = ONESTOPBIT;
        dcb.Parity = NOPARITY;
        dcb.fParity = TRUE;
        dcb.ByteSize = 8;
        dcb.fBinary = TRUE;
        dcb.wReserved = 0;
        if(!SetCommState(hPort,&dcb))
          return FALSE;
      }
    
      // set timeouts
      if(GetCommTimeouts(hPort,&cto))
      {
        printf(">> %f\n",cto.ReadIntervalTimeout);
        printf(">> %f\n",cto.ReadTotalTimeoutConstant);
        printf(">> %f\n",cto.ReadTotalTimeoutMultiplier);
        /*cto.ReadIntervalTimeout = 2000;
        cto.ReadTotalTimeoutConstant = 2000;
        cto.ReadTotalTimeoutMultiplier = 2000;
        if(!SetCommTimeouts(hPort,&cto))
          return FALSE;*/
      }
      return TRUE;
    }
    
    BOOL sendDataOverCOM(char cToSend[MAX_SEND_BYTES], HANDLE hPort)
    {  
      unsigned long length = 0;
      char cByteToSend[1];
      for(int i = 0; i < MAX_SEND_BYTES; i++)
      {
        if(cToSend[i]!=NULL)
        {
          cByteToSend[0] = cToSend[i];
          if(WriteFile(hPort, cByteToSend, 1, &length, NULL) == 0)
          {
            return FALSE;
          }
        }
        else
        {
          break;
        }
      }
      return TRUE;
    }
    
    BOOL getDataOverCOM(HANDLE hPort, int iLoops)
    {
      char cBuffer[1000];
      DWORD dwLen;
      int i = 0;
    
      while(i<iLoops)
      {       
        if(!ReadFile(hPort, cBuffer, 100, &dwLen, 0))
          return FALSE;
        else
        {
          printf("%s", &cBuffer);
          i++;
        }
      }
      printf("\n");
      return TRUE;
    }
    
    int main(int argc, char *argv[])
    {
      // open port
      HANDLE hCom;
      hCom = CreateFile(
          "COM1", 
          GENERIC_READ | GENERIC_WRITE, 
          0, 
          NULL, 
          OPEN_EXISTING,
          // 0, 
          FILE_ATTRIBUTE_NORMAL, 
          // FILE_FLAG_OVERLAPPED,
          NULL);
      if(hCom == INVALID_HANDLE_VALUE)
        printf("Could not open port!\n");
      else
        printf("COM-Port is open...\n");
    
      // create overlapped structure
      OVERLAPPED overlapped;
      memset(&overlapped, 0, sizeof(overlapped));
      overlapped.hEvent = CreateEvent(
          NULL,
          TRUE,
          FALSE,
          NULL);
    
      // apply some settings
      if(!setCOMSettings(hCom))
        printf("Could not apply settings!\n");
      else
        printf("Settings are done...\n");
    
      // send a string 
      if(!sendDataOverCOM("test", hCom))
        printf("Could not send string!\n");
      else
        printf("String sent...\n");
    
      // recieve some char signs
      if(!getDataOverCOM(hCom, 20))
        printf("Could not recieve data!\n");
      else
        printf("Data recieved...\n");
    
      // close port
      CloseHandle(hCom);
    
      // wait for keyboard
      getchar();
    
      return EXIT_SUCCESS;
    }
    

    Danke
    Dan


Anmelden zum Antworten