<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[COM Schnittstelle]]></title><description><![CDATA[<p>Hallo,<br />
ich versuche ein über RS-232 / COM1 angeschlossenes Gerät anzusprechen.<br />
Muss ein Kommando senden und die binären Daten die zurück kommen speichern.</p>
<p>Habe mir von folgender homepage</p>
<p><a href="http://www.fh-luebeck.de/content/01_33_02_10_07/6/0.html" rel="nofollow">http://www.fh-luebeck.de/content/01_33_02_10_07/6/0.html</a></p>
<p>ein Beispiel geholt, aber ..</p>
<blockquote>
<p>Die Dateien ab Version 5 sind nicht mehr auf dem C++Builder 4 und niedriger compilierbar.</p>
</blockquote>
<p>Natürlich habe ich diesen C++Builder 4 ... Habe es probiert und bekomme immer den Fehler,<br />
das der HANDLE nicht OK ist?!?</p>
<pre><code>HANDLE OpenComm(char* Port) { // Öffnet den Port und gibt ein Handle zurück

        HANDLE hCom = CreateFile(Port,// z.B. &quot;COM1&quot;,
        GENERIC_READ|GENERIC_WRITE,//zum Senden und Empfangen
        0, // Für comm devices exclusive-access notwendig
        0, // Keine security attributes
        OPEN_EXISTING, // Für comm devices notwendig
        0, // Kein overlapped I/O
        0); // Für comm devices muss hTemplate NULL sein

     if (hCom == INVALID_HANDLE_VALUE)
       ShowLastError(&quot;CreateFile: &quot;+AnsiString(Port));
     return hCom;
}
</code></pre>
<p>Kann mir da jemand helfen?</p>
<p>Besten Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/134866/com-schnittstelle</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 04:52:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/134866.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 29 Jan 2006 12:42:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to COM Schnittstelle on Sun, 29 Jan 2006 12:42:45 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich versuche ein über RS-232 / COM1 angeschlossenes Gerät anzusprechen.<br />
Muss ein Kommando senden und die binären Daten die zurück kommen speichern.</p>
<p>Habe mir von folgender homepage</p>
<p><a href="http://www.fh-luebeck.de/content/01_33_02_10_07/6/0.html" rel="nofollow">http://www.fh-luebeck.de/content/01_33_02_10_07/6/0.html</a></p>
<p>ein Beispiel geholt, aber ..</p>
<blockquote>
<p>Die Dateien ab Version 5 sind nicht mehr auf dem C++Builder 4 und niedriger compilierbar.</p>
</blockquote>
<p>Natürlich habe ich diesen C++Builder 4 ... Habe es probiert und bekomme immer den Fehler,<br />
das der HANDLE nicht OK ist?!?</p>
<pre><code>HANDLE OpenComm(char* Port) { // Öffnet den Port und gibt ein Handle zurück

        HANDLE hCom = CreateFile(Port,// z.B. &quot;COM1&quot;,
        GENERIC_READ|GENERIC_WRITE,//zum Senden und Empfangen
        0, // Für comm devices exclusive-access notwendig
        0, // Keine security attributes
        OPEN_EXISTING, // Für comm devices notwendig
        0, // Kein overlapped I/O
        0); // Für comm devices muss hTemplate NULL sein

     if (hCom == INVALID_HANDLE_VALUE)
       ShowLastError(&quot;CreateFile: &quot;+AnsiString(Port));
     return hCom;
}
</code></pre>
<p>Kann mir da jemand helfen?</p>
<p>Besten Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/979732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/979732</guid><dc:creator><![CDATA[daMike]]></dc:creator><pubDate>Sun, 29 Jan 2006 12:42:45 GMT</pubDate></item><item><title><![CDATA[Reply to COM Schnittstelle on Sun, 29 Jan 2006 19:08:59 GMT]]></title><description><![CDATA[<p>was sagt denn <strong>GetLastError</strong>? Anzeigbar zum Beispiel so:</p>
<pre><code class="language-cpp">void ShowLastError()
{
  LPVOID lpMsgBuf;

  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                FORMAT_MESSAGE_FROM_SYSTEM,
                0,
                GetLastError(),
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPTSTR) &amp;lpMsgBuf,
                0,
                0);

  ShowMessage((LPCTSTR) lpMsgBuf);

  // Speicher freigeben
  LocalFree(lpMsgBuf);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/980292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/980292</guid><dc:creator><![CDATA[Sunday]]></dc:creator><pubDate>Sun, 29 Jan 2006 19:08:59 GMT</pubDate></item><item><title><![CDATA[Reply to COM Schnittstelle on Mon, 13 Feb 2006 13:30:58 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>auch ich habe Probleme mit dem COM Port...<br />
Obwohl ich nun schon alle Beiträge dazu gelesen habe, besteht mein Problem noch immer.</p>
<p>HyperTerminal reicht mir nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> , somit soll mein Programm folgende können:<br />
- lesen an einem COM Port und ausgeben der Daten in ein Memo (Die Daten werden mit einem Dollarzeichen 0x24 eingeleitet und enden mit einem Carriage Return 0x0d)<br />
dazu will ich folgende Funktionalitäten implementieren:<br />
- setzen des COM Ports 1..9<br />
- setzen der Baudrate 1200...57600<br />
- setzen des Parityflag<br />
- setzen der Stopbits</p>
<p>Nach der M$ Platform Reference bzw. M$ Visualstudio Express Hilfe und dem BCB Buch von Herrn Kaiser habe ich Createfile verwendet. (die Reference war nur Nachschlagewerk, ich nutze BCB!)</p>
<p>Problem ist, ich kann das Handle nicht schließen. Dies versuche ich in meiner Funktion Receive(). BCB 6 gibt mir den Fehler &quot;unresolved external&quot; zum CloseHandle(). Ohne das CloseHandle() kann ich den COM Port ja nur ein mal ansprechen (sicher wird er Programmende autom. geschlossen, aber ich will nicht für jede Einstellung das Programm neu starten).<br />
Ein weiterer Fehler ist, dass die zu empfangenden Zeichen in unregelmäßigen Zeitabständen in das Memo geschrieben werden, so als gäbe es Probleme mit dem Puffer.<br />
Die Funktion ReceiveData() versuche ich mit einem Timer zu steuern.<br />
Den Timer1 habe ich schon versucht mit Werten zw. 10ms und 1000ms zu betrieben. Das es an meiner Abfrage der o.g. Steuerzeichen liegt kann ich ausschließen. Auch wenn ich sie weg lasse bleibt das Ergebnis im Grunde gleich, nur die Anzeige ändert sich (es wird nicht der gewünschte Datensatz ausgegeben, sondern Teile von ihm, wahlos zerstückelt). Die Länge der Daten zw. den Steuerzeichen liegt immer unter 100 Byte.<br />
Eigentlich möchte ich fortwärend Daten an der RS-232 lesen. Also immer wenn ein neues Paket im Eingangspuffer landet würde ich es gern holen. Dies mit einem Timer zu lösen gefällt mir dabei nicht wirklich gut.</p>
<p>Im folgenden ist mein Quellcode dagestellt, u.U. bin ich schon erblindet und jem. von euch sieht meinen Fehler.</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------

#include &lt;vcl.h&gt;
#pragma hdrstop

#include &quot;UnitRS232win.h&quot;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource &quot;*.dfm&quot;

TFormRS232win *FormRS232win;
HANDLE hComReceive;
int len;
char *reccom;

//---------------------------------------------------------------------------
__fastcall TFormRS232win::TFormRS232win(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TFormRS232win::FormCreate(TObject *Sender)
{
reccom=&quot;COM1&quot;;
}

void ShowLastError(AnsiString where)
{
MessageBox(NULL,SysErrorMessage(GetLastError()).c_str(),
where.c_str(),MB_OK|MB_ICONERROR);
}

HANDLE OpenComm(char* Port)
{ // Öffnet den Port und gibt ein Handle zurück
  HANDLE hCom;
  hCom = CreateFile(
    Port,                          // z.B. &quot;COM1&quot;,
    GENERIC_READ|GENERIC_WRITE,    //zum Senden und Empfangen
    0,                             // Für comm devices exclusive-access notwendig
    NULL,                          // Keine security attributes
    OPEN_EXISTING,                 // Für comm devices notwendig
    0,                             // Kein overlapped I/O
    NULL                           // Für comm devices muss hTemplate NULL sein
    );

if (hCom == INVALID_HANDLE_VALUE)
       ShowLastError(&quot;CreateFile: &quot;+AnsiString(Port));
return hCom;
}

DWORD ReceiveData(char* Data, int n)
{
DWORD NumberOfBytesRead; // Anzahl der gelesenen Bytes
   bool b=ReadFile(hComReceive, // handle des Com-Ports
     Data, // Adresse des Datenpuffers
     n, // Anzahl der zu lesenden Bytes
     &amp;NumberOfBytesRead, // Adresse übergeben
     0); // kein overlapped I/O
   if (!b) ShowLastError(&quot;ReadFile&quot;);
return NumberOfBytesRead;
}

void SetDCB(HANDLE hCom)
{
  int port = FormRS232win-&gt;CB_Port-&gt;ItemIndex;
  switch (port)
  {
    case 0 :reccom = &quot;COM1&quot;; break;
    case 1 :reccom = &quot;COM2&quot;; break;
    case 2 :reccom = &quot;COM3&quot;; break;
    case 3 :reccom = &quot;COM4&quot;; break;
    case 4 :reccom = &quot;COM5&quot;; break;
    case 5 :reccom = &quot;COM6&quot;; break;
    case 6 :reccom = &quot;COM7&quot;; break;
    case 7 :reccom = &quot;COM8&quot;; break;
    case 8 :reccom = &quot;COM9&quot;; break;
  }

  DCB dcb; // Device Control Block
  BOOL fSuccess = GetCommState(hCom, &amp;dcb); // DCB lesen
   if (!fSuccess) ShowLastError(&quot;GetCommState&quot;);
     dcb.BaudRate = StrToInt(FormRS232win-&gt;CB_Baud-&gt;Text);    //Baudrate
     dcb.ByteSize = StrToInt(FormRS232win-&gt;CB_Data-&gt;Text); //Datenbits

     int parity = FormRS232win-&gt;CB_Parity-&gt;ItemIndex;
     switch (parity)
     {
       case 0 :dcb.Parity = NOPARITY ;break;
       case 1 :dcb.Parity = EVENPARITY ;break;
       case 2 :dcb.Parity = MARKPARITY ;break;
       case 3 :dcb.Parity = ODDPARITY ;break;
     }

     int stop = FormRS232win-&gt;CB_Stop-&gt;ItemIndex;
     switch (stop)
     {
       case 0 :dcb.StopBits = ONESTOPBIT; break;
       case 1 :dcb.StopBits = TWOSTOPBITS; break;
     }
  //setzen der datenpuffer
  SetupComm(hCom, // Handle der Schnittstelle
  2048,           // Größe des Eingabepuffers
  2048);          // Größe des Ausgabepuffers

// SetCommState konfiguriert die serielle Schnittstelle
  fSuccess = SetCommState(hCom, &amp;dcb);
  if (!fSuccess) ShowLastError(&quot;SetCommState&quot;);
}

void SetReadTimeouts(HANDLE hCom)
{
COMMTIMEOUTS t;
// Alle Wert in Millisekunden
// Werte für ReadFile:
   t.ReadIntervalTimeout=100; // Zeit zwischen zwei Zeichen
   t.ReadTotalTimeoutMultiplier=0; // pro Zeichen
   t.ReadTotalTimeoutConstant=1;
     // Werte für WriteFile: wenn beide 0 sind, kein Timeout
     // beim Schreiben
   t.WriteTotalTimeoutMultiplier=0;
   t.WriteTotalTimeoutConstant=0;
 if (!SetCommTimeouts(hCom,&amp;t)) ShowLastError(&quot;SetCommTimeouts&quot;);
}

void __fastcall TFormRS232win::ConnectRS232winClick(TObject *Sender)
{
  Receive();
  if (Timer1-&gt;Enabled)
  {
   ConnectRS232win-&gt;Caption = &quot;Disconnect&quot;;
   ConnectRS232win-&gt;Hint = &quot;Close COM port&quot;;
  }
  else
  {
   ConnectRS232win-&gt;Caption = &quot;Connect&quot;;
   ConnectRS232win-&gt;Hint = &quot;Open COM port&quot;;
  }
}

void __fastcall TFormRS232win::Receive()
{ //open COM and start timer1

   if (Timer1-&gt;Enabled)
   {
     CloseHandle(hComReceive); //Schließen des Handles &lt;&lt;&lt;--- FEHLER (unresolved external
     if (!CloseHandle(hComReceive)) ShowLastError(AnsiString(reccom));
     Timer1-&gt;Enabled=false;
    }
   else
   {
     hComReceive =OpenComm(reccom);
     SetReadTimeouts(hComReceive);
     SetDCB(hComReceive);
     Timer1-&gt;Enabled=true;
   }
}

void __fastcall TFormRS232win::Timer1Timer(TObject *Sender)
{
const int BufSize = 2048;
int i, len;
bool enable = false;
char Buffer[BufSize]; // Puffer für die empfangenen Daten

  DWORD NumberOfBytesRead=ReceiveData(Buffer,BufSize);
  if (NumberOfBytesRead &gt; 20)
  {
    AnsiString s;
    for (DWORD i = 0; i &lt; NumberOfBytesRead; i++)
    {
      if (Buffer[i] == 0x24) //start with $
        enable = true;
      if (Buffer[i] == 0x0d) //end with CR
        enable = false;

      if (enable == true)
        s=s+Buffer[i];

      if (enable == false &amp;&amp; s != &quot;&quot;)      //auf Enter testen
      {
        FormMain-&gt;Memo_Text-&gt;Lines-&gt;Add(s);
        s=&quot;&quot;;
      }
    }
  }
  /*else
    FormMain-&gt;Memo_Text-&gt;Lines-&gt;Add(&quot;error&quot;); */
}
</code></pre>
<p>Danke für eure Hilfe.</p>
<p>Wenn gar nichts mehr hilft versuche ich mal die Einbindung von Ramon de Klein's Serial-Klasse (<a href="http://www.codeproject.com/system/serial.asp" rel="nofollow">http://www.codeproject.com/system/serial.asp</a>).</p>
<p>MfG M</p>
]]></description><link>https://www.c-plusplus.net/forum/post/993053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/993053</guid><dc:creator><![CDATA[macsmac]]></dc:creator><pubDate>Mon, 13 Feb 2006 13:30:58 GMT</pubDate></item><item><title><![CDATA[Reply to COM Schnittstelle on Mon, 13 Feb 2006 13:30:37 GMT]]></title><description><![CDATA[<p>1. bevor du weitermachst, erstelle dir eine eigene klasse zum handle der schnittstelle<br />
2. dort fügst du alle jetzigen globalen funktionen wie (OpenComm, Receive, usw. als Member ein)<br />
3. die globalen variablen sind dann die membervariablen deiner klasse.<br />
4. lass den timer weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/993065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/993065</guid><dc:creator><![CDATA[Sunday]]></dc:creator><pubDate>Mon, 13 Feb 2006 13:30:37 GMT</pubDate></item><item><title><![CDATA[Reply to COM Schnittstelle on Tue, 14 Feb 2006 12:44:35 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habs nicht so mit Klassen...<br />
Vor so zwei Jahren hab ich da noch was gekonnt und mich später immer schön drum gedrückt.<br />
Also ich habe jetzt mal was anderes ausprobiert und rufe dabei die Empfangsprozedur in einer do-while Schleife mit Events auf (hier im Forum abgeschaut).</p>
<pre><code class="language-cpp">do // in Endlos-Schleife auf Empfangssignale warten:
  {
    WaitCommEvent (hCom, &amp;dwEvtMask, &amp;o); // Event mit Empfangssignalen verknüpfen
    if (WAIT_OBJECT_0 == WaitForSingleObject (o.hEvent, INFINITE)) // warten bis Event
    {
      if (dwEvtMask &amp; EV_RXCHAR) // Zeichen an RxD empfangen:
      {
        bRet = ReadFile (hCom, &amp;InString, sizeof (InString), &amp;dwRead, NULL);
        if (!bRet)
        { // Fehlerausgabe:
        ShowLastError(&quot;Error: ReadFile&quot;+AnsiString(Port));
        }
        else
        { // Ausgabe (oder Verarbeitung) der empfangenen Bytes:
          for (DWORD i=0;i&lt;dwRead;i++)
          {
            if (InString[i] == 0x24) //start with $
              enable = true;
            if (InString[i] == 0x0d) //end with CR
              enable = false;

            if (enable == true)
              s = s + InString[i];

            if (enable == false &amp;&amp; s != &quot;&quot;)      //fill Memo
            {
              FormMain-&gt;Memo_Text-&gt;Lines-&gt;Add(s);
              s=&quot;&quot;;
            }
          }
        }
      }
      if (dwEvtMask &amp; EV_ERR)
      {
        MessageBox (NULL, &quot;Error empfangen&quot;, &quot;Error: ReadFile&quot;, MB_OK);
        break; // Schleifen-Abbruch
      }
    }
  }
  while (1);
</code></pre>
<p>Prinzipiell funktioniert das jetzt prima und ich erhalte alle Daten ohne Fehler, allerdings würde ich das Programm gern weiter laufen lassen... Die Schleife ist endlos und stoppt den Rest des Programms.<br />
Sie im Hintergrund laufen zu lassen geht ja nicht.<br />
Irgend wie habe ich mich jetzt verrant und seh momentan keine ordentliche Lösung des Problems. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>MfG M</p>
]]></description><link>https://www.c-plusplus.net/forum/post/993822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/993822</guid><dc:creator><![CDATA[macsmac]]></dc:creator><pubDate>Tue, 14 Feb 2006 12:44:35 GMT</pubDate></item><item><title><![CDATA[Reply to COM Schnittstelle on Tue, 14 Feb 2006 15:33:21 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>zB versuchs mit &quot;Thread&quot;</p>
<p>Mfg<br />
Klaus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/994060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/994060</guid><dc:creator><![CDATA[KlausB]]></dc:creator><pubDate>Tue, 14 Feb 2006 15:33:21 GMT</pubDate></item></channel></rss>