<?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[Daten über RS232 empfangen]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich möchte über die Serielle Schnittstelle Schalterzustände abfragen können. Dazu habe ich das RS-232-I/O-Board IO 88 von ELV. Hardwaremässig läuft auch alles (getestet mit dem dazugehöhrigen Testprogramm). Die Serial.h Datei habe ich auch im Projektverzeichnis. Das ganze programmiere ich auf dem Bloodsheed dev c++ compiler. Nun habe ich aber probleme die Daten auszulesen (habe auch nicht sooovile kentnisse im programmieren <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="😉"
    /> )<br />
Ich dachte mit dem Befehl &quot;CharVomPortLesen ();&quot; könnte ich die Daten empfangen, aber bei mir kommt da nichts raus.</p>
<p>Ich hoffe jemand kann mir auf die Sprünge helfen. Thanks Sonic</p>
<p>meine serial.h</p>
<pre><code class="language-cpp">/*
 *  serial.h -- kleine Bibliothek fuer die Ein-/Ausgabe auf den seriellen Port
 */

#ifndef _SERIAL_H
#define _SERIAL_H

#include &lt;stdio.h&gt;
#include &quot;windows.h&quot;

#define PORTNAME  &quot;COM1&quot;
#define BAUDRATE  9600
#define BYTESIZE  8
#define PARITY    NOPARITY
#define STOPBITS  ONESTOPBIT

void *port;

/*
 * portInitalisieren() -- der Port wird mit den Grundeinstellungen initalisiert 
 */
void portInitalisieren()
  {
  DCB dcbConfig;

  // Port oeffnen
  port = CreateFile(
    PORTNAME,
    GENERIC_READ | GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    0,
    NULL);

  if (port == INVALID_HANDLE_VALUE)
    {
    printf(&quot;Fehler beim Oeffnen des Ports\n&quot;);
    exit(-1);
    }

  // Parameter des Port holen
  if (GetCommState(port, &amp;dcbConfig))
    {
    dcbConfig.BaudRate = BAUDRATE;
    dcbConfig.ByteSize = BYTESIZE;
    dcbConfig.Parity = PARITY;
    dcbConfig.StopBits = STOPBITS;
    dcbConfig.fBinary = TRUE;
    dcbConfig.fParity = TRUE;
    }
  else
    {
    printf(&quot;Fehler beim Holen der Konfiguration\n&quot;);
    exit(-1);
    }

  // Parameter des Port setzen
  if (!SetCommState(port, &amp;dcbConfig))
    {
    printf(&quot;Fehler beim Setzen der Konfiguration\n&quot;);
    exit(-1);
    }
  }

/*
 * charVomPortLesen() -- liest ein Character vom Port
 */
char charVomPortLesen()
  {
  char zeichen;
  DWORD eventMask;
  DWORD anzImBuffer;

  // Setzen der CommMask
  if (!SetCommMask(port, EV_RXCHAR))
    {
    printf(&quot;Fehler beim Setzen der CommMaske\n&quot;);
    exit(-1);
    }

  // Warten auf CommEvent
  if (WaitCommEvent(port, &amp;eventMask, NULL))
    {
    // Lesen bis was kommt
    do
      {
      ReadFile(port, &amp;zeichen, 1, &amp;anzImBuffer, NULL);
      } while (anzImBuffer == 0);
    }
  else
    {
    printf(&quot;Fehler beim Warten auf CommEvent\n&quot;);
    exit(-1);
    }

  return zeichen;
  }

/*
 * charAufPortSchreiben() -- schreibt ein Character auf den Port
 */
void charZumPortSchreiben(char zeichen)
  {
  unsigned long anzGeschrieben;

  if (WriteFile(port, &amp;zeichen, 1, &amp;anzGeschrieben, NULL) == 0)
    {
    printf(&quot;Fehler beim Schreiben auf Port\n&quot;);
    exit(-1);
    }
  }

#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/132261/daten-über-rs232-empfangen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Jul 2026 21:54:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/132261.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 09 Jan 2006 13:26:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Daten über RS232 empfangen on Mon, 09 Jan 2006 13:34:00 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich möchte über die Serielle Schnittstelle Schalterzustände abfragen können. Dazu habe ich das RS-232-I/O-Board IO 88 von ELV. Hardwaremässig läuft auch alles (getestet mit dem dazugehöhrigen Testprogramm). Die Serial.h Datei habe ich auch im Projektverzeichnis. Das ganze programmiere ich auf dem Bloodsheed dev c++ compiler. Nun habe ich aber probleme die Daten auszulesen (habe auch nicht sooovile kentnisse im programmieren <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="😉"
    /> )<br />
Ich dachte mit dem Befehl &quot;CharVomPortLesen ();&quot; könnte ich die Daten empfangen, aber bei mir kommt da nichts raus.</p>
<p>Ich hoffe jemand kann mir auf die Sprünge helfen. Thanks Sonic</p>
<p>meine serial.h</p>
<pre><code class="language-cpp">/*
 *  serial.h -- kleine Bibliothek fuer die Ein-/Ausgabe auf den seriellen Port
 */

#ifndef _SERIAL_H
#define _SERIAL_H

#include &lt;stdio.h&gt;
#include &quot;windows.h&quot;

#define PORTNAME  &quot;COM1&quot;
#define BAUDRATE  9600
#define BYTESIZE  8
#define PARITY    NOPARITY
#define STOPBITS  ONESTOPBIT

void *port;

/*
 * portInitalisieren() -- der Port wird mit den Grundeinstellungen initalisiert 
 */
void portInitalisieren()
  {
  DCB dcbConfig;

  // Port oeffnen
  port = CreateFile(
    PORTNAME,
    GENERIC_READ | GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    0,
    NULL);

  if (port == INVALID_HANDLE_VALUE)
    {
    printf(&quot;Fehler beim Oeffnen des Ports\n&quot;);
    exit(-1);
    }

  // Parameter des Port holen
  if (GetCommState(port, &amp;dcbConfig))
    {
    dcbConfig.BaudRate = BAUDRATE;
    dcbConfig.ByteSize = BYTESIZE;
    dcbConfig.Parity = PARITY;
    dcbConfig.StopBits = STOPBITS;
    dcbConfig.fBinary = TRUE;
    dcbConfig.fParity = TRUE;
    }
  else
    {
    printf(&quot;Fehler beim Holen der Konfiguration\n&quot;);
    exit(-1);
    }

  // Parameter des Port setzen
  if (!SetCommState(port, &amp;dcbConfig))
    {
    printf(&quot;Fehler beim Setzen der Konfiguration\n&quot;);
    exit(-1);
    }
  }

/*
 * charVomPortLesen() -- liest ein Character vom Port
 */
char charVomPortLesen()
  {
  char zeichen;
  DWORD eventMask;
  DWORD anzImBuffer;

  // Setzen der CommMask
  if (!SetCommMask(port, EV_RXCHAR))
    {
    printf(&quot;Fehler beim Setzen der CommMaske\n&quot;);
    exit(-1);
    }

  // Warten auf CommEvent
  if (WaitCommEvent(port, &amp;eventMask, NULL))
    {
    // Lesen bis was kommt
    do
      {
      ReadFile(port, &amp;zeichen, 1, &amp;anzImBuffer, NULL);
      } while (anzImBuffer == 0);
    }
  else
    {
    printf(&quot;Fehler beim Warten auf CommEvent\n&quot;);
    exit(-1);
    }

  return zeichen;
  }

/*
 * charAufPortSchreiben() -- schreibt ein Character auf den Port
 */
void charZumPortSchreiben(char zeichen)
  {
  unsigned long anzGeschrieben;

  if (WriteFile(port, &amp;zeichen, 1, &amp;anzGeschrieben, NULL) == 0)
    {
    printf(&quot;Fehler beim Schreiben auf Port\n&quot;);
    exit(-1);
    }
  }

#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/961705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/961705</guid><dc:creator><![CDATA[sonic 0]]></dc:creator><pubDate>Mon, 09 Jan 2006 13:34:00 GMT</pubDate></item><item><title><![CDATA[Reply to Daten über RS232 empfangen on Mon, 09 Jan 2006 13:56:59 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile.php?mode=viewprofile&amp;u=13512" rel="nofollow">c.rackwitz</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=10" rel="nofollow">ANSI C</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=4" rel="nofollow">WinAPI</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic.php?t=39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/961738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/961738</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Mon, 09 Jan 2006 13:56:59 GMT</pubDate></item><item><title><![CDATA[Reply to Daten über RS232 empfangen on Mon, 09 Jan 2006 14:00:09 GMT]]></title><description><![CDATA[<p>Das Programmieren der seriellen Schnittstelle ist nicht ganz einfach und ich Rate Dir zu einer fertigen Klasse... oder wenn Du es doch unbedingt selber machen willst, kannst Du es dort zumindest abschauen wie es geht:<br />
<a href="http://www.codeproject.com/system/serial.asp" rel="nofollow">http://www.codeproject.com/system/serial.asp</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/961744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/961744</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Mon, 09 Jan 2006 14:00:09 GMT</pubDate></item><item><title><![CDATA[Reply to Daten über RS232 empfangen on Tue, 10 Jan 2006 10:53:46 GMT]]></title><description><![CDATA[<p>Die do-while-Schleife sollte so aussehen:</p>
<pre><code class="language-cpp">DWORD         dwSetMask = EV_RXCHAR | EV_ERR; 
DWORD         dwEvtMask; 
OVERLAPPED    o;

memset (&amp;o, 0, sizeof (OVERLAPPED)); // Struktur mit 0en füllen
o.hEvent = CreateEvent (NULL, FALSE, FALSE, NULL); // einen Event setzten

SetCommMask (hCom, dwSetMask); // Empfangssignale definieren

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:
                LPVOID lpMsgBuf;
                FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | 
                FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPTSTR) &amp;lpMsgBuf, 0, NULL);
                MessageBox (NULL, (LPCTSTR)lpMsgBuf, &quot;Error: ReadFile&quot;, 
                            MB_OK | MB_ICONINFORMATION);
                LocalFree (lpMsgBuf);
            }
            else
            { // Ausgabe (oder Verarbeitung) der empfangenen Bytes:
                // ...
            }
        }
        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>CommTimeOuts und BufferSize setzen ist auch nicht verkehrt:</p>
<pre><code class="language-cpp">SetCommTimeouts (hCom, &amp;ct);
// Zwischenspeicher des serial-Drivers einstellen (für read und write):
SetupComm (hCom, COM_BUFFER_SIZE, COM_BUFFER_SIZE);
</code></pre>
<p>Das sind nur Code-Schnipsel aus einem kleinen Projekt, anpassen musst Du sie selber.</p>
<p>Die Empfangs-Schleife sollte in einem eigenen Thread laufen, sonst muss man die Funktion char charVomPortLesen() dauernd aufrufen.</p>
<p>&quot;serial.h&quot;, wozu braucht man die?</p>
<p>Blackbird</p>
]]></description><link>https://www.c-plusplus.net/forum/post/962522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/962522</guid><dc:creator><![CDATA[Blackbird]]></dc:creator><pubDate>Tue, 10 Jan 2006 10:53:46 GMT</pubDate></item><item><title><![CDATA[Reply to Daten über RS232 empfangen on Tue, 10 Jan 2006 18:21:18 GMT]]></title><description><![CDATA[<p>Danke erstmal für die Unterstützung, das Ziel soll sein dass ich 4 Schalterstellungen über die Schnittstelle einlesen kann und die dann in einem Textfile protokolliere.</p>
<blockquote>
<p>&quot;serial.h&quot;, wozu braucht man die?</p>
<p>Blackbird</p>
</blockquote>
<p>Zum den Com1 konfigurieren, kann man das einfacher lösen ?</p>
<p>Gruss Sonic</p>
]]></description><link>https://www.c-plusplus.net/forum/post/962954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/962954</guid><dc:creator><![CDATA[sonic 0]]></dc:creator><pubDate>Tue, 10 Jan 2006 18:21:18 GMT</pubDate></item><item><title><![CDATA[Reply to Daten über RS232 empfangen on Wed, 11 Jan 2006 07:46:28 GMT]]></title><description><![CDATA[<p>Deine Funktion void portInitalisieren() braucht keine &quot;serial.h&quot;. Alle Prototypen und defines werden von &quot;windows.h&quot; includiert.<br />
Vielleicht solltest Du statt void doch das HANDLE (der COM-Schnittstelle) zurueckgeben?</p>
<p>Wenn Dein Programm ein Windows-Programm sein soll, so brauchst Du folgende Funktionen:</p>
<p>int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd); // Windows erstellt damit ein Fenster</p>
<p>LRESULT CALLBACK WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); // die Prozedur, in der alle Nachrichten, auch Deine selbstdefinierten, auflaufen ... Auch kann hier eine Listbox erstellt werden. Ein Timer koennte im Sekundentakt die IO88 abfragen.</p>
<p>DWORD WINAPI ComThread (LPVOID lpParam); // ein Thread, der die COM oeffnet und eventgesteuert serielle Daten einliest.</p>
<p>Die Namen und Parameter der Thread-Funktion sind nur Beispiel. Deine Funktion portInitalisieren() und mein Code-Schnipsel koennen Teil dieser Thread-Funktion sein.<br />
Dieser Thread sendet alle empfangenen Bytes mit SendMessage zur Editbox.</p>
<p>Mehr ist nicht zu tun, der teufel steckt aber im detail.</p>
<p>Blackbird</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963247</guid><dc:creator><![CDATA[*Blackbird*]]></dc:creator><pubDate>Wed, 11 Jan 2006 07:46:28 GMT</pubDate></item><item><title><![CDATA[Reply to Daten über RS232 empfangen on Mon, 16 Jan 2006 09:33:00 GMT]]></title><description><![CDATA[<p>Hab mich mal in das Thema noch mehr vertieft und jetzt ist mir auch einiges klarer geworden, hab auch noch andere Klassen im Netz gefunden. Aber ich habe immer noch Probleme beim abfragen der Daten. Für das Interface gibt es spezielle Befehlssätze.</p>
<p>Beschreibung hier:<br />
<a href="http://www.elv-downloads.de/service/manuals/IO88/472-69.asp?&amp;%251" rel="nofollow">http://www.elv-downloads.de/service/manuals/IO88/472-69.asp?&amp;%1</a></p>
<p>mir ist aber nicht ganz klar wie ich die einbinden muss.</p>
<p>Gruss Sonic</p>
]]></description><link>https://www.c-plusplus.net/forum/post/967760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/967760</guid><dc:creator><![CDATA[sonic 0]]></dc:creator><pubDate>Mon, 16 Jan 2006 09:33:00 GMT</pubDate></item><item><title><![CDATA[Reply to Daten über RS232 empfangen on Tue, 24 Jan 2006 21:35:09 GMT]]></title><description><![CDATA[<p>So, hab nochmal ein bisschen gearbeitet, aber funktionieren tuts immer noch nicht <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>
<pre><code class="language-cpp">/* 
*  serial.h -- kleine Bibliothek fuer die Ein-/Ausgabe auf den seriellen Port 
*/ 

#ifndef _SERIAL_H 
#define _SERIAL_H 

#include &lt;stdio.h&gt; 
#include &quot;windows.h&quot; 

#define PORTNAME  &quot;COM1&quot; 
#define BAUDRATE  9600 
#define BYTESIZE  8 
#define PARITY    EVENPARITY 
#define STOPBITS  ONESTOPBIT 

void *port; 

/* 
* portInitalisieren() -- der Port wird mit den Grundeinstellungen initalisiert 
*/ 

void portInitalisieren() 
  { 
  DCB dcbConfig; 

  // Port oeffnen 
  port = CreateFile( 
    PORTNAME, 
    GENERIC_READ | GENERIC_WRITE, 
    0, 
    NULL, 
    OPEN_EXISTING, 
    0, 
    NULL); 

  if (port == INVALID_HANDLE_VALUE) 
    { 
    printf(&quot;Fehler beim Oeffnen des Ports\n&quot;); 
    exit(-1); 
    } 

  // Parameter des Port holen 
  if (GetCommState(port, &amp;dcbConfig)) 
    { 
    dcbConfig.BaudRate = BAUDRATE; 
    dcbConfig.ByteSize = BYTESIZE; 
    dcbConfig.Parity = PARITY; 
    dcbConfig.StopBits = STOPBITS; 
    dcbConfig.fBinary = TRUE; 
    dcbConfig.fParity = TRUE; 
    } 
  else 
    { 
    printf(&quot;Fehler beim Holen der Konfiguration\n&quot;); 
    exit(-1); 
    } 

  // Parameter des Port setzen 
  if (!SetCommState(port, &amp;dcbConfig)) 
    { 
    printf(&quot;Fehler beim Setzen der Konfiguration\n&quot;); 
    exit(-1); 
    } 
  } 

/* 
* byteVomPortLesen() -- liest ein Character vom Port 
*/ 

byte byteVomPortLesen() 
  { 
  byte zeichen; 
  DWORD eventMask; 
  DWORD anzImBuffer; 

  // Setzen der CommMask 
  if (!SetCommMask(port, EV_RXCHAR)) 
    { 
    printf(&quot;Fehler beim Setzen der CommMaske\n&quot;); 
    exit(-1); 
    } 

  // Warten auf CommEvent 
  if (WaitCommEvent(port, &amp;eventMask, NULL)) 
    { 
    // Lesen bis was kommt 
    do 
      { 
      ReadFile(port, &amp;zeichen, 1, &amp;anzImBuffer, NULL); 
      } while (anzImBuffer == 0); 
    } 
  else 
    { 
    printf(&quot;Fehler beim Warten auf CommEvent\n&quot;); 
    exit(-1); 
    } 

  return zeichen; 
  } 

/* 
* byteAufPortSchreiben() -- schreibt ein Character auf den Port 
*/ 

void byteZumPortSchreiben(byte zeichen) 
  { 
  unsigned long anzGeschrieben; 

  if (WriteFile(port, &amp;zeichen, 1, &amp;anzGeschrieben, NULL) == 0) 
    { 
    printf(&quot;Fehler beim Schreiben auf Port\n&quot;); 
    exit(-1); 
    } 
  } 
#endif
</code></pre>
<pre><code class="language-cpp">#include &lt;stdio.h&gt; 
#include &quot;serial.h&quot; 
byte b[10]; 
int i;
main() 
{ 
printf(&quot;Port wird initialisiert:\n&quot;); 
portInitalisieren(); 

// Protokoll absenden um den Status zu empfangen.. 
byteZumPortSchreiben(0x02); // STX 
byteZumPortSchreiben(0x49); // Kommando &quot;I&quot; 
byteZumPortSchreiben(0x05); // ENQ 
byteZumPortSchreiben(0x12); // DC2 
byteZumPortSchreiben(0x03); // ETX 

// Kurz warten.. 
sleep(50); 

// Hier muss das Antwort-Protokoll empfangen werden. 

printf(&quot;byte wird vom Port gelesen:\n&quot;); 
for( i = 0; i &lt; 10; i++) 
   { 
       b[i]=byteVomPortLesen(); 
       printf(&quot;%d Wert\n&quot;, b[i]); 
   }

getchar(); 
getchar(); 
}
</code></pre>
<p>hat jemand noch einen Tip?</p>
<p>Gruss Sonic</p>
]]></description><link>https://www.c-plusplus.net/forum/post/975403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/975403</guid><dc:creator><![CDATA[sonic 0]]></dc:creator><pubDate>Tue, 24 Jan 2006 21:35:09 GMT</pubDate></item><item><title><![CDATA[Reply to Daten über RS232 empfangen on Wed, 25 Jan 2006 08:53:54 GMT]]></title><description><![CDATA[<p>Aufruf mit: progname &lt;COM-Port-Nummer&gt;</p>
<pre><code class="language-cpp">// DOS32-Programm zum Senden/Empfangen von Bytes über COM (9600-8N1)
// Es wird Bytes als Start gesendet.
// Alle empfangenen Bytes werden zurückgesendet.
// OS: W95, W98, W98SE, WinME, WinNT, Win2000, WinXP
// Note: Fast keine Fehlerbehandlung implementiert!
#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;

#define COM_BUFFER_SIZE 256       // Read- und Write-Buffer-Size
#define BAUDRATE  CBR_9600 // 9600 Baud
#define BYTESIZE  8 
#define PARITY    EVENPARITY 
#define STOPBITS  ONESTOPBIT 
#define HELP_STRING TEXT(&quot;Aufruf mit: progname &lt;COM-Port-Nummer&gt;\r\n&quot;)
char COMMAND1[] = {(0x02), (0x49), (0x05), (0x12), (0x03)};

// Hauptprogramm: Aufruf mit: progname &lt;COM-Port-Nummer&gt;
int main (int argc, char **argv)
{
  DCB           dcb;    
  DWORD         iBytesWritten;
  BOOL          bRet      = true;
  DWORD         dwRead    = 0;
  DWORD         dwSetMask = EV_RXCHAR | EV_ERR; 
  DWORD         dwEvtMask; 
  OVERLAPPED    o;
  COMMTIMEOUTS  ct;
  unsigned char InString[COM_BUFFER_SIZE + 1];
  TCHAR         szCOM[6];

  if (argc == 2 &amp;&amp;                              // progname + COM-Port-Nummer ?
      atoi (argv[1]) &gt; 0 &amp;&amp; atoi (argv[1]) &lt; 5) // COM1 ... COM4?
    wsprintf (szCOM, TEXT(&quot;COM%s&quot;), argv[1]);   // String &quot;basteln&quot; ...
  else
  { 
    printf (TEXT(&quot;\r\nERROR:\t %s&quot;), HELP_STRING);
    return (1); // und tschüß ...
  }

  memset (&amp;o, 0, sizeof (OVERLAPPED)); // Struktur mit 0en füllen
  o.hEvent = CreateEvent (NULL, FALSE, FALSE, NULL); // einen Event setzten

  HANDLE hCom = CreateFile (szCOM, GENERIC_WRITE | GENERIC_READ, 0, NULL, 
                            OPEN_EXISTING, 0, NULL);                     

  if (hCom == INVALID_HANDLE_VALUE)
  { // Fehlerausgabe:
    LPVOID lpMsgBuf;
    FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | 
                    FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),
                    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &amp;lpMsgBuf, 0, NULL);
    MessageBox (NULL, (LPCTSTR)lpMsgBuf, &quot;Error: CreateFile&quot;, MB_OK | MB_ICONINFORMATION);
    LocalFree (lpMsgBuf);
    return (1); // und tschüß ...
  }

  dcb.DCBlength = sizeof(DCB);  // Laenge des Blockes MUSS gesetzt sein!
  GetCommState (hCom, &amp;dcb);    // COM-Einstellungen holen und aendern
  dcb.BaudRate  = BAUDRATE;     // Baudrate
  dcb.ByteSize  = BYTESIZE;     // Datenbits
  dcb.Parity    = PARITY;       // Parität
  dcb.StopBits  = STOPBITS;     // Stopbits
  SetCommState (hCom, &amp;dcb);    // COM-Einstellungen speichern

  GetCommTimeouts (hCom, &amp;ct);
  // Warte-Zeit [ms] vom Beginn eines Bytes bis zum Beginn des nächsten Bytes 
  ct.ReadIntervalTimeout         = 1000 / BAUDRATE * (dcb.ByteSize + 
                                                     (dcb.Parity == NOPARITY ? 0 : 1) + 
                                                     (dcb.StopBits == ONESTOPBIT ? 1 : 2)) * 2;
  ct.ReadTotalTimeoutMultiplier  = 0;  // [ms] wird mit Read-Buffer-Size multipliziert
  ct.ReadTotalTimeoutConstant    = 50; // wird an ReadTotalTimeoutMultiplier angehängt
  ct.WriteTotalTimeoutMultiplier = 0;
  ct.WriteTotalTimeoutConstant   = 0;
  SetCommTimeouts (hCom, &amp;ct);

  // Zwischenspeicher des serial-Drivers einstellen (für read und write):
  SetupComm (hCom, COM_BUFFER_SIZE, COM_BUFFER_SIZE);
  SetCommMask (hCom, dwSetMask); // Empfangssignale definieren

  // Byte(s) senden:
  if (!WriteFile (hCom, &amp;COMMAND1, 5, &amp;iBytesWritten, NULL)) // Senden der Bytes
  { // Fehlerausgabe:
    LPVOID lpMsgBuf;
    FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | 
                    FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),
                    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &amp;lpMsgBuf, 0, NULL);
    MessageBox (NULL, (LPCTSTR)lpMsgBuf, &quot;Error: WriteFile&quot;, MB_OK | MB_ICONINFORMATION);
    LocalFree (lpMsgBuf);
  }
  else
    printf (&quot;%d Byte(s) sent.&quot;, iBytesWritten);

  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:
          LPVOID lpMsgBuf;
          FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | 
                          FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),
                          MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                          (LPTSTR) &amp;lpMsgBuf, 0, NULL);
          MessageBox (NULL, (LPCTSTR)lpMsgBuf, &quot;Error: ReadFile&quot;, 
                      MB_OK | MB_ICONINFORMATION);
          LocalFree (lpMsgBuf);
        }
        else
        { // Ausgabe (oder Verarbeitung) der empfangenen Bytes:
          InString[dwRead] = '\0'; // in &quot;zero-ended&quot;-String verwandeln
          printf (TEXT(&quot;\r\n\tRxD (%d Byte(s)): %s&quot;), dwRead, InString);
          WriteFile (hCom, &amp;InString, dwRead, &amp;iBytesWritten, NULL); // Senden der Bytes
        }
      }

      if (dwEvtMask &amp; EV_ERR) 
      {
        MessageBox (NULL, &quot;Error empfangen&quot;, &quot;Error: ReadFile&quot;, MB_OK);
        break; // Schleifen-Abbruch
      }
    }
  }
  while (1);

  CloseHandle (hCom);     // COM schließen
  CloseHandle (o.hEvent); // Event-Handle zurückgeben

  return (0);
}
</code></pre>
<p>Den Daten-Empfang solltest Du in einen eigenen Thread packen. Öffen und Schließen des Ports irgendwo zentral. Schreiben, da wo Du willst.<br />
Die Empfangs-Daten der IO88 sind keine lesbaren ASCII-Zeichen - also vor der Ausgabe noch umwandeln.</p>
<p>Blackbird</p>
]]></description><link>https://www.c-plusplus.net/forum/post/975620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/975620</guid><dc:creator><![CDATA[*Blackbird*]]></dc:creator><pubDate>Wed, 25 Jan 2006 08:53:54 GMT</pubDate></item></channel></rss>