Comm-Port lesen und schreiben



  • Hallo zusammen,

    ich hab schon mit Google und hier im Forum gesucht, aber nichts gefunden. Folgendes Problem:

    Ich soll für ein Projekt in meiner Schule eine DLL schreiben, mit der man die IDs von Unique-Transponderkarten lesen kann.
    Der Leser wird dabei über den Comm-Port angeschlossen, die ID kann man dann auch schon über ein entsprechendes Terminal-Programm auslesen (ich habe HTerm verwendet). Soweit kein Problem.

    Allerdings habe ich in meinem Programm das Problem, dass ich den Port nicht gleichzeitig zum Lesen und zum Schreiben öffnen kann. Ich habe es folgendermaßen versucht:

    DCB dcb;
    
      ZeroMemory(&dcb,sizeof(DCB));
    
      dcb.DCBlength = sizeof(DCB);
      dcb.BaudRate = iBaudrate;
      dcb.ByteSize = 8;
      dcb.Parity = NOPARITY;
      dcb.StopBits = ONESTOPBIT;
      dcb.XonLim = 2048;
      dcb.XoffLim = 512;
      dcb.ErrorChar = 0;
      dcb.EofChar = 0;
      dcb.EvtChar = 0;
      dcb.fBinary = 4481;
    
      HANDLE hCommFile = CreateFile(lpCommPort,GENERIC_READ || GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
      if(hCommFile == INVALID_HANDLE_VALUE)
      {
        creWriteToLog("ERROR: Could not open Port %s!",lpCommPort);
        return FALSE;
      }
    
      if(!SetCommState(hCommFile,&dcb))
      {
        creWriteToLog("ERROR: Could not set Comm-State!");
        CloseHandle(hCommFile);
        return FALSE;
      }
    
      if(!SetCommMask(hCommFile,EV_RXCHAR))
      {
        creWriteToLog("ERROR: Could not set Comm-Mask!");
        CloseHandle(hCommFile);
        return FALSE;
      }
    
      COMMTIMEOUTS cto;
    
      cto.ReadIntervalTimeout = 200;
      cto.ReadTotalTimeoutMultiplier = 0;
      cto.ReadTotalTimeoutConstant = 0;
      cto.WriteTotalTimeoutMultiplier = 0;
      cto.WriteTotalTimeoutConstant = 0;
    
      if(!SetCommTimeouts(hCommFile,&cto))
      {
        creWriteToLog("ERROR: Could not set Comm-Timeouts!");
        CloseHandle(hCommFile);
        return FALSE;
      }
    

    Danach kann ich lesen, aber dem Kartenleser keine Befehle senden, was ich wie folgt versucht habe:

    char Buf[255] = "@\r";
      DWORD NOBW;
      WriteFile(hCommFile,Buf,strlen(Buf),&NOBW,NULL);
    
      if(NOBW < strlen(Buf))
      {
        creWriteToLog("ERROR: Opened Comm-Port successfully, but cannot send command!");
        CloseHandle(hCommFile);
        return FALSE;
      }
    

    NOBW ist danach 0, und GetLastError() liefert ERROR_ACCESS_DENIED.

    Was mache ich falsch?

    Danke für die Hilfe
    Thomas



  • GENERIC_READ || GENERIC_WRITE

    🙄 🙄 🙄 🙄 🙄



  • Abgesehen von dem Fehler empfehle ich Dir eine fertige Klasse zu verwenden umd mit der serielle Schnittstelle zu kommunizieren:
    http://www.codeproject.com/system/serial.asp
    Es hört sich zwar zuerst mal einfach an, ist es aber nicht.



  • Erst mal danke für die schnellen Antworten.

    Mit der Klasse wird es sicher um einiges einfacher 🙂
    Allerdings würde mich trotzdem interessieren, wieso man die serielle Schnittstelle nicht mit "GENERIC_READ || GENERIC_WRITE" zum Lesen und Schreiben öffnen kann.
    Bei Dateien geht das ja auch, zmd. bei der C-Funktion fopen.



  • || ➡ |



  • || ist ein LOGISCHES oder (also Ergebnis ist "true" oder "false")
    während
    | ein BITWEISE oder ist (was hier benötigt wird)

    Siehe:

    Bitwise Inclusive OR Operator: |
    http://msdn.microsoft.com/library/en-us/vclang/html/_pluslang_bitwise_inclusive_or_operator.asp

    Logical OR Operator: ||
    http://msdn.microsoft.com/library/en-us/vclang/html/_pluslang_logical_or_operator.asp



  • thommy88 schrieb:

    Bei Dateien geht das ja auch, zmd. bei der C-Funktion fopen.

    hab's zwar noch nie probiert aber ich glaube das geht auch mit z.b. "COM1:" usw. ich glaube nicht, dass mickeyweich das vergessen hat.



  • oh, stimmt 😮
    der quelltext-teil war aus einem delphi-beispiel übersetzt/kopiert, da hab ich ned so genau aufgepasst, und compiler-fehler gabs ja keinen 🙄


Anmelden zum Antworten