<?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[kann nicht alle Zeichen seriell lesen]]></title><description><![CDATA[<p>hallo,</p>
<p>mit folgenden Konstrukt lese ich in einem thread vom seriellen port, das klappt auch soweit ganz gut, jedoch das er ab bestimmten telegrammgrössen ein einzelnes zeichen aus der mitte des telegramms &quot;verschluckt&quot;.</p>
<pre><code>//Thread .h
#define BUFSIZE 251
unsigned char Buffer[BUFSIZE];      

// Thread .cpp
int n2bytes;
  int nbytes; 		/* nbytes read */
  char *bufptr; 	/* Current char in buffer */

  //While the thread is not terminated
  fcntl( fd, F_SETFL, FNDELAY);
  while (!Terminated)
  {
        Sleep(100);
    //Initialize the buffer
        Buffer[0] ='\0';
        nbytes=0;
        n2bytes=0;
    //Start a pending read operation

         bufptr = Buffer;

         while ((nbytes = read(fd, bufptr, Buffer + sizeof(Buffer) - bufptr -1 ) ) &gt; 0)
         {
         	n2bytes=n2bytes + nbytes;
         	bufptr += nbytes;
                GBytes=n2bytes;

/* Abbruch-Bedingung: telegramm 0x10-Beginnend und fuenf zeichen lang 
 oder 0x68-beginnend plus n-zeichen lang und endet mit 0x16 */ 
        if (    ((Buffer[0]==0x10) &amp;&amp; (n2bytes == 5)) )
                        {
                		break;
                        }
                else
                        if((Buffer[0]==0x68) &amp;&amp; (Buffer[StrToInt(Buffer[2])+5] == 0x16))
                	{
                        	break;
                        }
//falls mehr als 80zeichen bisher gelesen wurden abbrechen
                else if(n2bytes &gt; 80) break;

         }
         *bufptr='\0';
         // TEST
         if(nbytes &gt; 4){

    		frmMain-&gt;AddTelegrammData(&quot;!in: &quot; +AnsiString( nbytes) + &quot; Bytes empfangen&quot; ,true );

         //If there is some data in the buffer
...
</code></pre>
<p>Habt ihr eine idee, wo ich meinen fehler gemacht habe?</p>
<p>Gruss xFoRce</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/79695/kann-nicht-alle-zeichen-seriell-lesen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 30 Jun 2026 03:28:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/79695.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 13 Jul 2004 18:47:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to kann nicht alle Zeichen seriell lesen on Tue, 13 Jul 2004 18:47:59 GMT]]></title><description><![CDATA[<p>hallo,</p>
<p>mit folgenden Konstrukt lese ich in einem thread vom seriellen port, das klappt auch soweit ganz gut, jedoch das er ab bestimmten telegrammgrössen ein einzelnes zeichen aus der mitte des telegramms &quot;verschluckt&quot;.</p>
<pre><code>//Thread .h
#define BUFSIZE 251
unsigned char Buffer[BUFSIZE];      

// Thread .cpp
int n2bytes;
  int nbytes; 		/* nbytes read */
  char *bufptr; 	/* Current char in buffer */

  //While the thread is not terminated
  fcntl( fd, F_SETFL, FNDELAY);
  while (!Terminated)
  {
        Sleep(100);
    //Initialize the buffer
        Buffer[0] ='\0';
        nbytes=0;
        n2bytes=0;
    //Start a pending read operation

         bufptr = Buffer;

         while ((nbytes = read(fd, bufptr, Buffer + sizeof(Buffer) - bufptr -1 ) ) &gt; 0)
         {
         	n2bytes=n2bytes + nbytes;
         	bufptr += nbytes;
                GBytes=n2bytes;

/* Abbruch-Bedingung: telegramm 0x10-Beginnend und fuenf zeichen lang 
 oder 0x68-beginnend plus n-zeichen lang und endet mit 0x16 */ 
        if (    ((Buffer[0]==0x10) &amp;&amp; (n2bytes == 5)) )
                        {
                		break;
                        }
                else
                        if((Buffer[0]==0x68) &amp;&amp; (Buffer[StrToInt(Buffer[2])+5] == 0x16))
                	{
                        	break;
                        }
//falls mehr als 80zeichen bisher gelesen wurden abbrechen
                else if(n2bytes &gt; 80) break;

         }
         *bufptr='\0';
         // TEST
         if(nbytes &gt; 4){

    		frmMain-&gt;AddTelegrammData(&quot;!in: &quot; +AnsiString( nbytes) + &quot; Bytes empfangen&quot; ,true );

         //If there is some data in the buffer
...
</code></pre>
<p>Habt ihr eine idee, wo ich meinen fehler gemacht habe?</p>
<p>Gruss xFoRce</p>
]]></description><link>https://www.c-plusplus.net/forum/post/559898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/559898</guid><dc:creator><![CDATA[xforce]]></dc:creator><pubDate>Tue, 13 Jul 2004 18:47:59 GMT</pubDate></item></channel></rss>