MIPI_AdvancedC_FRTK/Seminar1/HW/bytestuff.c

85 lines
1.7 KiB
C
Raw Permalink Normal View History

2024-11-14 08:45:50 +03:00
//typedef enum {false, true} bool;
#define SOP 0x7E
#define EOP 0x7E
#define ESC 0x7D
#define XOR 0x20
//добавление байтстафинга 1 байта
int bytestuff(uint8_t *buf0,uint8_t byte,int len)
{
switch(byte)
{
case SOP:
buf0[len++] = ESC;
buf0[len++] = SOP^XOR;
break;
case ESC:
buf0[len++] = ESC;
buf0[len++] = ESC^XOR;
break;
default:
buf0[len++] = byte;
break;
}
return len;
}
typedef enum {WAIT_SOF,ESC_SEQ,WAIT_EOF} STATE_RX;
//---------------------------------------------------------------------------
//разборщик очищенного принятного пакета
void dispel_rx_buf0(uint8_t* buf0,int len)
{
for(int i=0;i<len;i++)
putc(buf0[i]);
}
//---------------------------------------------------------------------------
//очитска принятого байта от байтстафинга
void dispel_rx_byte(uint8_t byte,uint8_t *buf)
{
//Ответ на запрос статуса
static STATE_RX state_rx = WAIT_SOF;
int len = 0;
switch(state_rx)
{
case WAIT_SOF:
if(byte==SOP)
state_rx=WAIT_EOF;
len=0;
break;
case WAIT_EOF:
switch(byte)
{
case ESC:
state_rx=ESC_SEQ;
break;
case EOP:
dispel_rx_buf(buf0,len);//разборка пакета
state_rx=WAIT_SOF;
break;
default:
buf0[len++] = byte;
break;
}
break;
case ESC_SEQ:
switch(byte)
{
case SOP^XOR:
buf0[len++] = SOP;
state_rx=WAIT_EOF;
break;
case ESC^XOR:
len++;
buf0[len] = ESC;
state_rx=WAIT_EOF;
break;
}
break;
}
}