Daten von seriellen Schnittstelle empfangen klappt nicht !



  • Hi,

    habe folgendes Problem. Ich öffne die serielle Schnittstelle und schreibe darauf Daten. Funzt auch super, nur bei Daten empfangen hab ich meine Probleme.
    Wollte mit dem Hyper-Terminal eine Antwort schicken, aber ich krieg die Daten nicht eingelesen mit meinem C-Programm

    Vielleich kann mir ja jemand helfen !

    #include <windows.h>
    #include <stdio.h>
    
    main()
    {
    char buffer[5];
    HANDLE hKommunikation; 
    DCB dcb;   
    DWORD dwRead;
    
      // Öffnen der Kommunikation ///////////////////////////////////////////////////// 
     hKommunikation = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL); 
     GetCommState(hKommunikation, &dcb);  /* Datenstruktur mit den aktuellen Werten fuellen (WICHTIG!!) */   
    
      // Spezielle Werte Initialisieren 
      dcb.BaudRate    = CBR_1200; 
      dcb.ByteSize    = 8;   
      dcb.Parity      = 0;   
      dcb.StopBits    = ONESTOPBIT; 
      dcb.fDtrControl = DTR_CONTROL_DISABLE; 
      dcb.fInX        = FALSE;   
      SetCommState(hKommunikation, &dcb); // Initialisieren mit den geaenderten Werten
    
    WriteFile(hKommunikation, "Hallo", 5, &dwRead, 0); // Schreibt auf die Schnittstelle  
    
    length = ReadFile(hKommunikation, buffer, 4, &dwRead, NULL);   // Liest von der Schnittstelle             
    
    printf(buffer);
    CloseHandle(hKommunikation);
    }
    

    Vielen Dank schonmal im Voraus !

    MfG

    MTC

    P.S.: Kann mir jemand sagen, wo ich das SDK "Device I/O" in Deutsch herbekomme?



  • ReadFile wartet nicht. Die serielle Schnittstelle ist schon geschlossen, bevor Du im HyperTerminal was gesendet hast. Entweder Schleife, Thread oder WaitCommEvent oder eine Kombination davon verwenden.

    Blackbird



  • Danke schonmal für die Antwort, aber versteh ich dich richtig, dass ich einfach in einer FOR Schleife immer nur 1 Zeichen einlese und dieses dann in BUFFER[i++] speichere?
    Oder kann ich auch eine WHILE DO Schleife machen und warten bis die Anzahl eingelesener Daten = bestimmter Wert ist ?

    for (i=0; i<86; i++)
    {
    ReadFile(hKommunikation, buffer[i], 1, &dwRead, NULL);   
    };
    

    oder

    i=0;
    while (i<87) do
    {
    ReadFile(hKommunikation, buffer[i++], 1, &dwRead, NULL);
    }
    

    Ich hoffe das geht so!
    Aber wie ich das mit dem Thread oder WaitCommEvent machen soll weiss ich nicht.

    MfG

    MTC



  • Aber wie ich das mit dem Thread oder WaitCommEvent machen soll weiss ich nicht.

    Frage: Wenn du vor ner roten Ampel steht, was machst du?
    a) Du fährst so lange mit vollgas um den Block bis sie grün ist
    b) Du wartest davor bis sie grün wird



  • Ja okay, habs ja kapiert. 😉

    Hab es aber auch mit einer WHILE Schleife hinbekommen.

    Nur leider passiert bei der Datenübertragung immer ein Fehler und zwar wird als erstes empfangenes Zeichen immer eine Hexadezimal 00 empfangen, obwohl ich die gar nicht sende vom Remote Rechner.

    Keine Ahnung warum, vielleicht könnt ihr mir ja helfen, wie ich das wegbekomme.

    MfG

    MTC



  • Du mußt den DCB vollständig initialisieren, bevor Du sendest/ empfängst. Es durchaus löblich, daß Du Dir zunächst die momentane Einstellung mit GetCommState besorgst. Aber wie ist denn bitte diese Einstellung? Alles so, wie Du es gebrauchen kannst?



  • Mit dem vollständigen initialisieren meinst du damit, dass ich alle Werte neu setzen muss ?

    Und außerdem weiss ich gar nicht genau, was alle Werte aus dem DCB bedeuten.

    Gibt es denn dazu nicht eine deutsche Erklärung ???



  • Mit vollständig meine ich vollständig, das hast Du richtig verstanden. Und Deutsch gibt's hier.


Anmelden zum Antworten