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
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 jaCode:#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 }
Lesezeichen