<?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[Problem mit Serieller Schnitstelle]]></title><description><![CDATA[<p>Hallo Leute, meine Kommunikation über eine Serielle Schnittstelle habe ich eigentlich schon, aber jetzt habe ich gemerkt, dass es da ein kleines Problem gibt. Wenn ich mein Programm starte und sofort in den Empfangsmodus gehe, dann hängt sich das Programm auf. Beim Debuggen habe ich festgestellt, dass er bei der ReadFile() hängenbleibt.<br />
Das Lustige: Wenn ich bei Programm-Start zweimal die Open_Com-Funktion aufrufe, dann funktioniert es einwandfrei?!</p>
<p>Kann mir bitte jemand helfen.</p>
<pre><code class="language-cpp">#include &quot;S_Kommunikation.h&quot;
#include &quot;Eingabefenster.h&quot;
#include &lt;iostream.h&gt;
#include &lt;windows.h&gt;
#include &lt;conio.h&gt;

extern HANDLE com_status_h;
extern char portnr_c;         // stores COM-Port number
extern int baudrate;          // stores baudrate
extern char databits_c;       // stores number if data bits
extern char stopbits_c;       // stores number of stop bits
extern char paritbit_c;       // stores type of parity bit
extern char protocol_c;       // stores protokol type
extern bool par_enable_b;     // flag if parity is enabled
extern bool open_com_b;       // flag if COM is open
extern char InString[22];
extern bool empfangen;
extern DWORD dwRead;

//---------------------------------------------------------------------------
int Open_Comport()
{
   AnsiString temp=&quot;COM&quot;+(AnsiString)portnr_c;
   DCB           dcb;
   com_status_h = CreateFile (temp.c_str(), GENERIC_WRITE | GENERIC_READ, 0, NULL,
   OPEN_EXISTING, 0, NULL);
   // setzen der Blocklaenge, muss erfolgen--------------------------
   dcb.DCBlength = sizeof(DCB);
   SetupComm (com_status_h, 1024, 1024);
   // COM-Einstellungen laden----------------------------------------
   GetCommState (com_status_h, &amp;dcb);
   // Baudrate einstellen--------------------------------------------
   dcb.BaudRate  = baudrate;
   // Datenbits einstellen, hier 8-----------------------------------
   dcb.ByteSize  = databits_c;
   // Paritaet einstellen, hier keine Paritaet-------------------------
   dcb.Parity    = paritbit_c;
   // Stopbits einstellen, hierv1------------------------------------
   dcb.StopBits  = stopbits_c;
   // COM-Einstellungen speichern------------------------------------
   if (par_enable_b)
   {
     dcb.fParity = 1;
   }
   else
   {
     dcb.fParity = 0;
   }
   if (protocol_c == 0x00)
   {
     dcb.fDtrControl = DTR_CONTROL_ENABLE;
   }
   else
   {
     dcb.fDtrControl = DTR_CONTROL_DISABLE;
   }
   SetCommState (com_status_h,&amp;dcb);

  if (com_status_h == 0)    // error in opening port
  {
    Befehlsauswahl-&gt;StatusBar-&gt;Panels-&gt;Items[0]-&gt;Text = &quot;COM&quot; + (AnsiString)portnr_c+&quot; wurde erfolgreich geöffnet!&quot;;
  }
  else
  {
    Befehlsauswahl-&gt;StatusBar-&gt;Panels-&gt;Items[0]-&gt;Text = &quot;COM&quot; + (AnsiString)portnr_c+&quot; konnte nicht geöffnet werden!&quot;;
  }
   return 0;
}
//---------------------------------------------------------------------------
int Close_Comport(void)
{
   CloseHandle (com_status_h);
   return (0);
}
//---------------------------------------------------------------------------
void Write_Comport(char b_daten[22],int length)
{
  Open_Comport();
  DWORD iBytesWritten;
  char temp[22]=&quot;&quot;;
  for(int i=0;i&lt;length;i++)
    temp[i]=b_daten[i];
  WriteFile (com_status_h, &amp;temp, length, &amp;iBytesWritten, NULL);
  if(iBytesWritten == (unsigned int)length)
    Befehlsauswahl-&gt;StatusBar-&gt;Panels-&gt;Items[0]-&gt;Text=&quot;Übertragung erfolgreich!&quot;;
  else
    Befehlsauswahl-&gt;StatusBar-&gt;Panels-&gt;Items[0]-&gt;Text=&quot;Übertragung nicht erfolgreich!&quot;;
  Close_Comport();
}
//---------------------------------------------------------------------------
void Read_Comport()
{
  Befehlsauswahl-&gt;StatusBar-&gt;Panels-&gt;Items[0]-&gt;Text=&quot;Empfangsmodus gestartet.&quot;;
  Befehlsauswahl-&gt;StatusBar-&gt;Update();
  int i=0;
  empfangen=false;
  dwRead=0;
  while(!empfangen &amp;&amp; i&lt;50)
  {
    dwRead = 0;
    ReadFile (com_status_h, &amp;InString, sizeof (InString), &amp;dwRead, NULL);
    if (dwRead &gt; 0)
    {
      empfangen=true;
    }
    Sleep(200);
    i++;
  }
  if(empfangen)
    Befehlsauswahl-&gt;StatusBar-&gt;Panels-&gt;Items[0]-&gt;Text=&quot;Empfangsmodus beendet.&quot;;
  else
    Befehlsauswahl-&gt;StatusBar-&gt;Panels-&gt;Items[0]-&gt;Text=&quot;Empfangsmodus beendet. (Es wurden keine Daten empfangen.)&quot;;
}
//---------------------------------------------------------------------------
</code></pre>
<p>...und im Main-Prog mache ich bloß diesen Aufruf:</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------
void __fastcall TBefehlsauswahl::EmpfangenExecute(TObject *Sender)
{
  Open_Comport();
//  Open_Comport();  //wie gesagt, wenn ich hier Open_Comport() zweimal aufrufe, dann gehts.
  Read_Comport();
  Close_Comport();
}
//---------------------------------------------------------------------------
</code></pre>
<p>Gruß Kiki</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/158061/problem-mit-serieller-schnitstelle</link><generator>RSS for Node</generator><lastBuildDate>Mon, 10 Aug 2026 14:40:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/158061.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 Sep 2006 05:45:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Serieller Schnitstelle on Fri, 01 Sep 2006 05:45:24 GMT]]></title><description><![CDATA[<p>Hallo Leute, meine Kommunikation über eine Serielle Schnittstelle habe ich eigentlich schon, aber jetzt habe ich gemerkt, dass es da ein kleines Problem gibt. Wenn ich mein Programm starte und sofort in den Empfangsmodus gehe, dann hängt sich das Programm auf. Beim Debuggen habe ich festgestellt, dass er bei der ReadFile() hängenbleibt.<br />
Das Lustige: Wenn ich bei Programm-Start zweimal die Open_Com-Funktion aufrufe, dann funktioniert es einwandfrei?!</p>
<p>Kann mir bitte jemand helfen.</p>
<pre><code class="language-cpp">#include &quot;S_Kommunikation.h&quot;
#include &quot;Eingabefenster.h&quot;
#include &lt;iostream.h&gt;
#include &lt;windows.h&gt;
#include &lt;conio.h&gt;

extern HANDLE com_status_h;
extern char portnr_c;         // stores COM-Port number
extern int baudrate;          // stores baudrate
extern char databits_c;       // stores number if data bits
extern char stopbits_c;       // stores number of stop bits
extern char paritbit_c;       // stores type of parity bit
extern char protocol_c;       // stores protokol type
extern bool par_enable_b;     // flag if parity is enabled
extern bool open_com_b;       // flag if COM is open
extern char InString[22];
extern bool empfangen;
extern DWORD dwRead;

//---------------------------------------------------------------------------
int Open_Comport()
{
   AnsiString temp=&quot;COM&quot;+(AnsiString)portnr_c;
   DCB           dcb;
   com_status_h = CreateFile (temp.c_str(), GENERIC_WRITE | GENERIC_READ, 0, NULL,
   OPEN_EXISTING, 0, NULL);
   // setzen der Blocklaenge, muss erfolgen--------------------------
   dcb.DCBlength = sizeof(DCB);
   SetupComm (com_status_h, 1024, 1024);
   // COM-Einstellungen laden----------------------------------------
   GetCommState (com_status_h, &amp;dcb);
   // Baudrate einstellen--------------------------------------------
   dcb.BaudRate  = baudrate;
   // Datenbits einstellen, hier 8-----------------------------------
   dcb.ByteSize  = databits_c;
   // Paritaet einstellen, hier keine Paritaet-------------------------
   dcb.Parity    = paritbit_c;
   // Stopbits einstellen, hierv1------------------------------------
   dcb.StopBits  = stopbits_c;
   // COM-Einstellungen speichern------------------------------------
   if (par_enable_b)
   {
     dcb.fParity = 1;
   }
   else
   {
     dcb.fParity = 0;
   }
   if (protocol_c == 0x00)
   {
     dcb.fDtrControl = DTR_CONTROL_ENABLE;
   }
   else
   {
     dcb.fDtrControl = DTR_CONTROL_DISABLE;
   }
   SetCommState (com_status_h,&amp;dcb);

  if (com_status_h == 0)    // error in opening port
  {
    Befehlsauswahl-&gt;StatusBar-&gt;Panels-&gt;Items[0]-&gt;Text = &quot;COM&quot; + (AnsiString)portnr_c+&quot; wurde erfolgreich geöffnet!&quot;;
  }
  else
  {
    Befehlsauswahl-&gt;StatusBar-&gt;Panels-&gt;Items[0]-&gt;Text = &quot;COM&quot; + (AnsiString)portnr_c+&quot; konnte nicht geöffnet werden!&quot;;
  }
   return 0;
}
//---------------------------------------------------------------------------
int Close_Comport(void)
{
   CloseHandle (com_status_h);
   return (0);
}
//---------------------------------------------------------------------------
void Write_Comport(char b_daten[22],int length)
{
  Open_Comport();
  DWORD iBytesWritten;
  char temp[22]=&quot;&quot;;
  for(int i=0;i&lt;length;i++)
    temp[i]=b_daten[i];
  WriteFile (com_status_h, &amp;temp, length, &amp;iBytesWritten, NULL);
  if(iBytesWritten == (unsigned int)length)
    Befehlsauswahl-&gt;StatusBar-&gt;Panels-&gt;Items[0]-&gt;Text=&quot;Übertragung erfolgreich!&quot;;
  else
    Befehlsauswahl-&gt;StatusBar-&gt;Panels-&gt;Items[0]-&gt;Text=&quot;Übertragung nicht erfolgreich!&quot;;
  Close_Comport();
}
//---------------------------------------------------------------------------
void Read_Comport()
{
  Befehlsauswahl-&gt;StatusBar-&gt;Panels-&gt;Items[0]-&gt;Text=&quot;Empfangsmodus gestartet.&quot;;
  Befehlsauswahl-&gt;StatusBar-&gt;Update();
  int i=0;
  empfangen=false;
  dwRead=0;
  while(!empfangen &amp;&amp; i&lt;50)
  {
    dwRead = 0;
    ReadFile (com_status_h, &amp;InString, sizeof (InString), &amp;dwRead, NULL);
    if (dwRead &gt; 0)
    {
      empfangen=true;
    }
    Sleep(200);
    i++;
  }
  if(empfangen)
    Befehlsauswahl-&gt;StatusBar-&gt;Panels-&gt;Items[0]-&gt;Text=&quot;Empfangsmodus beendet.&quot;;
  else
    Befehlsauswahl-&gt;StatusBar-&gt;Panels-&gt;Items[0]-&gt;Text=&quot;Empfangsmodus beendet. (Es wurden keine Daten empfangen.)&quot;;
}
//---------------------------------------------------------------------------
</code></pre>
<p>...und im Main-Prog mache ich bloß diesen Aufruf:</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------
void __fastcall TBefehlsauswahl::EmpfangenExecute(TObject *Sender)
{
  Open_Comport();
//  Open_Comport();  //wie gesagt, wenn ich hier Open_Comport() zweimal aufrufe, dann gehts.
  Read_Comport();
  Close_Comport();
}
//---------------------------------------------------------------------------
</code></pre>
<p>Gruß Kiki</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1128786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1128786</guid><dc:creator><![CDATA[kiki_666]]></dc:creator><pubDate>Fri, 01 Sep 2006 05:45:24 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Serieller Schnitstelle on Fri, 01 Sep 2006 13:43:24 GMT]]></title><description><![CDATA[<p>...ich bins nochmal. Also ich hab jetzt den ganzen Tag daran herum gemacht. Noch vor ein paar Tagen hat das Programm funktioniert.<br />
Und seit heute (hab die letzten Tage nicht an der COM-Funktion gearbeitet) funktioniert die ganze Funktion nicht mehr.</p>
<p>Früher konnte ich genau vier Datenelemente senden und habe am Empfangs-PC auch genau 4 Elemente empfangen.<br />
Jetzt funktioniert nur noch, wenn ich während der Empfangsschleife vom Sende-PC mindestens 22 Daten versende.<br />
Der Empfangs-PC kann dann diese Daten empfangen, was ja leider dann viel zu viele sind. (da ich ja nur 4 empfangen will)</p>
<p>Im Debbug-Modus bleibt er immer bei der Read-File stehen und springt da nicht weiter.</p>
<p>Edit:<br />
Und wenn ich jetzt zweimal die Open_Comport() aufrufe, dann macht er zwar die Schleife richtig (also arbeitet das ReadFile() immerwieder ab) aber er kann leider auch nur 22 (also maximale Datengröße) emppfangen.</p>
<p>Hoffe mir kann jemand helfen.</p>
<p>Gruß Kiki</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1129157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1129157</guid><dc:creator><![CDATA[kiki_666]]></dc:creator><pubDate>Fri, 01 Sep 2006 13:43:24 GMT</pubDate></item></channel></rss>