Schau mal, vielleicht erspart es dir etwas Arbeit, so sieht meine Empfangsroutine aus (wird mit jedem über COM empfangenen Byte angesprungen)
Da kommen zwar ein paar Sachen vor, die kannst du so nicht anwenden, aber die Logik ist erkennbar

Code:
#define RXTX_M_MSG     1           // inside Frame
#define RXTX_M_PFX	     2           // Prefix detected

//---------------------------------------------------------------------
int CSnifferDlg::SniffChan(ROV_RXTX* pRx, unsigned char bInChar)
{
       if (!(pRx->iComFlg & RXTX_M_MSG))
       {
              if (bInChar == CTL_C_STX)
              {
	   pRx->sBf.BufSet((char*)&pRx->sMsg, 0);    // reset Buffer
	   pRx->iComFlg = RXTX_M_MSG;
	   pRx->iComBCC = 0;
             }
       }
       else
      {
	if (pRx->iComFlg & RXTX_M_PFX)
	{
		pRx->sBf.BufWrChar(bInChar & ~CTL_M_ADON);
		pRx->iComFlg &= ~RXTX_M_PFX;
		pRx->iComBCC ^= (bInChar & ~CTL_M_ADON);
	}
	else
	{
                 	switch (bInChar)
		{
		case CTL_C_STX:		// Start condition
		   pRx->sBf.BufSet((char*)&pRx->sMsg, 0);
		   pRx->iComFlg = RXTX_M_MSG;
		   pRx->iComBCC = 0;
		   break;
		case CTL_C_PFX:		// Prefix
		   pRx->iComFlg |= RXTX_M_PFX;
		   break;
		case CTL_C_ETX:	               // End Condition
		   pRx->sBf.BufToRead();         // write -> to read 
		   pRx->iComFlg &= ~RXTX_M_PFX;
		   pRx->iComFlg &= ~RXTX_M_MSG;
		   pRx->iComCnt++;
		   return(1);	// Message present
		   break;
		default:	
		   pRx->sBf.BufWrChar(bInChar);
		   pRx->iComBCC ^= bInChar;
		   break;
		}
	}
        }
        return(0);		// no message complete
}
Zum Testen kannst du übrigens einfach die RX-TX Leitungen des RS232 Kabels überbrücken, dann kriegst du deine eigenen Frames als Echo zurück, aber das weißt du ja