Serielle Schnittstelle Com1 ansteuern



  • was hängt denn an deiner seriellen schnittstelle?

    einfach was hinsenden und empfangen, geht glaub ich nicht. zumindest mussten irgendwelche pins miteinander verbunden werden (pin 2 und 3?). das machste zum beispiel mit ner büroklammer oder nem anderen stück draht. dann kannste deine eigenen gesendeten daten empfangen...



  • An meiner seriellen Schnittstelle hängt eine C-Control2.
    Das ist ein Steuercompter für diverse Steuer und Regel Aufgaben.
    Wenn ich per Hyper Terminal sende, funktioniert es tadellos.
    Am Anschluß liegt es also nicht-.

    MfG ACU



  • was liefert den GetLastError fuer ne fehlermeldung?



  • Das mit LeastError probiere ich nachher nochmnal aus.
    Die auf seite 2 von mir geposteten Quellcodeauszuäge sind aber grundsätzlich richtig oder?
    Nicht das bei der Umwandlung in char oder so schon der Fehler sitzt.

    Die Konfiguration für die Schnittstelle (Geschwindigkeit etc.) muß ich vor oder nach dem öffnen der Schnittstelle aufrufen?

    Das komische ist ja, dass schon irgendwas gesendet wird.
    Wenn ich eine längere String "versuche zu" senden, dann bekomme ich auch mehr Zeichen als bei einer kurzen.
    Deshalb dachte ich an einen Umwandlungsfehler.

    MfG ACU



  • Ich habe gerade nochmal ausprobiet:
    Wenn ich die konfiguriere, bevor die Schnittstelle geöffnet ist, kommen 2 Fehler (Fehler beim lesen und Fehler beim schreiben), wenn ich jedoch die Schnittstelle vorher öffne, kommt nur: "Fehler beim schreiben".

    MfG ACU



  • die schnittstelle muss geöffnet sein, bevor du sie konfigurieren kannst.

    // Timeouts fuer Port setzen
    void SetReadTimeouts(HANDLE hCom)
    {
      COMMTIMEOUTS timeouts;
    
      timeouts.ReadIntervalTimeout         = 100; // Zeit zwischen 2 Zeichen
      timeouts.ReadTotalTimeoutMultiplier  = 0;   // pro Zeichen
      timeouts.ReadTotalTimeoutConstant    = 1;
      timeouts.WriteTotalTimeoutConstant   = 0;   // kein Timeout beim Schreiben
      timeouts.WriteTotalTimeoutMultiplier = 0;
    
      if (!::SetCommTimeouts(hCom, &timeouts))
      {
        // ... Fehler
      }
    }
    
    // hCom ist im Header definiert (HANDLE hCom)
    void __fastcall TForm1::OpenComPort(char *Port)
    {
      if ((hCom = OpenComm(Port)) != INVALID_HANDLE_VALUE)
      {
        // mit default-Werten initialisieren
        SetDeviceControlBlock(hCom, CBR_9600, 8, NOPARITY, ONESTOPBIT);
    
        // Timeouts setzen
        SetReadTimeouts(hCom);
      }
    }
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      OpenComPort("COM1");
    }
    

    wenn du auf Button1 klickst, solltest du schonmal keine fehler bekommen, es sein denn deine Com existiert nicht.



  • statt char in SendData und ReceiveData könnteste auch unsigned char nehmen. vlei liegts daran...

    int SendData(HANDLE hCom, unsigned char *Data, int Length) { ... }
    


  • Danke für die Tipps, aber ich komme einfach nicht weiter.
    Ich hänge mein Projekt mal an, vielleicht findet ja noch jemand nen Fehler.

    Download der Datei

    MfG ACU



  • bloss mal so:

    #define ONESTOPBIT          0
    #define ONE5STOPBITS        1
    #define TWOSTOPBITS         2
    

    COM1 hat sicherlich nie 1.5 stopbits! da bekomme ich auch fehler.

    du solltest das schon so hinschreiben wie ich dir das vorgegeben habe und ausserdem die globalen windows-konstanten verwenden und dir nicht irgendetwas ausdenken!

    siehe Win32-SDK unter DCB oder in die MSDN

    zu deinem code.

    warum stehen die ganzen funktionen in nem header?
    warum bindet der header die vcl-unit ein?
    -> bau dir ne klasse fuer das serielle zeugs.



  • Vielen Dank, jetzt funktioniert es.
    Was meinst du damit, dass ich mir keine eigenen Konstanten ausdenken soll?

    Was spricht gegen das auslagern in eine Header Datei?
    Ich dachte das macht man so.

    Eine Klasse zu schreiben, werde ich sowieso bald noch machen.

    1,5 Stopbits gibt es, aber das war in meinem Fall nicht gewünscht ;).

    Dann möchte ich nur noch wissen, wie ich eine ANSIString wieder in eine normale Borland String umwandeln kann, bitte nicht schimpfen, ich habs nicht gefunden.
    MfG ACU



  • Ich bin jetzt etwas weitergekommen.
    Einzelne Bytes empfange ich jetzt über die Schnittstelle.
    Diesen Code verwende ich:

    char *Empfang = new char[1];
    ReceiveData(Schnittstelle,Empfang,1);
    Memo1->Lines->Add(Empfang);
    

    Dummerweise kommt nicht nur mein einzelnes Zeichen sondern hinter dem Zeichen meist noch ein || oder ein |+.
    Kann mir jemand sagen, wie ich das wegbekomme?

    MfG ACU



  • char OneByte;
    
    ReceiveData(Schnittstelle, &OneByte, 1);
    
    Memo1->Lines->Add(AnsiString(OneByte));
    

    oder:

    char *OneByte = new char[2];
    OneByte[1]    = '\0';
    
    ReceiveData(Schnittstelle, OneByte, 1);
    
    Memo1->Lines->Add(AnsiString(OneByte));
    


  • Super, danke für die Hilfe!
    Jetzt bin ich ein ganzes Stück weiter.
    Ich habe nach einer Funktion gesucht, die mir zurückliefert, ob bereits Daten zum Empfang im Puffer bereitstehen.
    Leider war ich noch nicht so erfolgreich.

    Im MSDN Artikel wird ein Pameter Namens EV_RXCHAR beschrieben.
    Zur Funktion steht:

    A new character was received and placed in the input buffer.

    Das klang mir genau nach dem, dass ich suche.
    Ich habs deshalb mal das probiert:

    if (!SetCommMask(hComm, EV_RXCHAR))
    

    Irgendwie macht der Code leider nicht, was er soll.
    Auf neue Zeichen reagiert er nicht.
    Nur eine gewisse Abhängigkeit, ob die Serielle Schnittstelle geöffnet oder geschloßen ist, wurde von mir beobachtet.

    Wie muß der Code richtig heißen?

    MfG ACU



  • Kann mir den keiner helfen?
    SOllte doch für die Profis eigentlich nicht so schwer sein oder?

    MfG ACU



  • schon was von wochenende gehört?! 🕶



  • Dagegen ist nichts einzuwenden, wäre aber trotzdem schön, wenn jemand helfen könnte, da ich ohne die Abfrage nicht weiterkomme.

    Weißt du nicht zufällig was? Du scheinst ja Ahnung zu haben.

    MfG ACU





  • ACU schrieb:

    Dagegen ist nichts einzuwenden, wäre aber trotzdem schön, wenn jemand helfen könnte, da ich ohne die Abfrage nicht weiterkomme.

    Äh ja, ... leider sind die 50 Spezialisten meines unterirdischen Labors in der Gewerkschaft, und die verbietet Sonntagsarbeit ausdrücklich. Aber heute arbeiten sie wieder mit Hochdruck einzig an der Lösung deines Problems. Ich schätze heute Abend dürfte eine Lösung vor Feierabend ausfallen...

    ...wobei ich schon irgendwas gehört habe von einem Wissenschaftler, das er sich in der Art geäussert hat wie "Soll er die Doku doch selber lesen". Aber der Kerl wird natürlich sofort von mir freigestellt. Ist ja ne Frechheit, sowas!



  • So ich habe bei meinem Programm weitergemacht.
    Leider komme ich immernoch nicht weiter.
    Ich habe einiges aus den MSDN Beispielen schon probiert, aber leider funktioniert alles nicht.
    Was ich will ist eigentlich nur ein Code, der mir zurückliefert, ob Daten von der Seriellen Schnittstelle im Puffer bereitliegen. Das kann doch nicht so schwer sein oder?

    Da junix ja lieber intelligente seine Zeit mit intelligenten Texten verschwendet, hoffe ich auf die Hilfe Anderer.



  • 1.) Für was sind eigentlich die Timeouts gut.
    2.) Wie macht man eigentlich das Empfangen am besten. Ich weis ja nicht wann von dem externen Gerät etwas zu meinem PC geschickt wird. Ich dachte mir, dass ich hierfür einen Thread starte indem ich immer abfrage bis etwas zum PC kommt. Oder gibt es noch eine andere Möglichkeit?


Anmelden zum Antworten