📄 fifo.cpp
字号:
nPtr_R = 0;
return Len_r;
}
DWORD CFifo::GetCRC(char *BufIn, DWORD Len)
{
DWORD crc = 0;
char crc8 = 0;
WORD crc16 = 0;
switch(CRC_Type)
{
case CRC_TYPE_8_BIT:
while(Len--)
crc8 = CRC_8_table[crc8 ^ *BufIn++];
crc = (DWORD)crc8;
break;
case CRC_TYPE_16_BIT:
while(Len--)
crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufIn++];
crc = (DWORD)crc16;
break;
case CRC_TYPE_CCITT:
while(Len--)
crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufIn++];
crc = (DWORD)crc16;
break;
default:
break;
}
return crc;
}
#define OPERATION_INSERT_7D(in, ptr, len) \
if (in == 0x7d || in == 0x7e){ \
*ptr++ = 0x7d; \
*ptr++ = (in) ^ 0x20; \
len++; \
} else { \
*ptr++ = in;}
#define OPERATION_INSERT_7F(in, ptr, len) \
if (in > 0x7d){ \
*ptr++ = 0x7f; \
*ptr++ = (in) ^ 0x20; \
len++; \
} else { \
*ptr++ = in;}
DWORD CFifo::FrameConstructor(char *BufIn, DWORD Len)
{
char *ptr_temp = BufTempIn;
DWORD Len_New = Len;
char crc8 = 0;
WORD crc16 = 0;
switch(CRC_Type)
{
case CRC_TYPE_8_BIT:
while(Len--)
{
#ifdef FIFO_FRAME_INSERT_7F
OPERATION_INSERT_7F(*BufIn, ptr_temp, Len_New)
#else
OPERATION_INSERT_7D(*BufIn, ptr_temp, Len_New)
#endif
crc8 = CRC_8_table[crc8 ^ *BufIn++];
}
#ifdef FIFO_FRAME_INSERT_7F
OPERATION_INSERT_7F(crc8, ptr_temp, Len_New)
#else
OPERATION_INSERT_7D(crc8, ptr_temp, Len_New)
#endif
*ptr_temp = 0x7e; // End Flag
Len_New += 2;
break;
case CRC_TYPE_16_BIT:
while(Len--)
{
#ifdef FIFO_FRAME_INSERT_7F
OPERATION_INSERT_7F(*BufIn, ptr_temp, Len_New)
#else
OPERATION_INSERT_7D(*BufIn, ptr_temp, Len_New)
#endif
crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufIn++];
}
#ifdef FIFO_FRAME_INSERT_7F
OPERATION_INSERT_7F((char)crc16, ptr_temp, Len_New)
OPERATION_INSERT_7F((char)(crc16 >> 8), ptr_temp, Len_New)
#else
OPERATION_INSERT_7D((char)crc16, ptr_temp, Len_New)
OPERATION_INSERT_7D((char)(crc16 >> 8), ptr_temp, Len_New)
#endif
*ptr_temp = 0x7e; // End Flag
Len_New += 3;
break;
case CRC_TYPE_CCITT:
while(Len--)
{
#ifdef FIFO_FRAME_INSERT_7F
OPERATION_INSERT_7F(*BufIn, ptr_temp, Len_New)
#else
OPERATION_INSERT_7D(*BufIn, ptr_temp, Len_New)
#endif
crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufIn++];
}
#ifdef FIFO_FRAME_INSERT_7F
OPERATION_INSERT_7F((char)crc16, ptr_temp, Len_New)
OPERATION_INSERT_7F((char)(crc16 >> 8), ptr_temp, Len_New)
#else
OPERATION_INSERT_7D((char)crc16, ptr_temp, Len_New)
OPERATION_INSERT_7D((char)(crc16 >> 8), ptr_temp, Len_New)
#endif
*ptr_temp = 0x7e; // End Flag
Len_New += 3;
break;
default:
break;
}
return Len_New;
}
#define OPERATION_CLEAR_7D(out, ptr, len, len_new) \
if (0x7d == *ptr) { \
ptr++; \
out = *ptr++ ^ 0x20; \
len--; \
len_new--; \
} else { \
out = *ptr++;}
#define OPERATION_CLEAR_7F(out, ptr, len, len_new) \
if (0x7f == *ptr) { \
ptr++; \
out = *ptr++ ^ 0x20; \
len--; \
len_new--; \
} else { \
out = *ptr++;}
DWORD CFifo::FrameExtractor(char *BufOut, DWORD Len)
{
char *ptr_temp = BufTempOut;
DWORD Len_New = Len;
char crc8 = 0;
WORD crc16 = 0;
char crc8_rec = 0;
WORD crc16_rec = 0;
switch(CRC_Type)
{
case CRC_TYPE_8_BIT:
#ifdef FIFO_FRAME_INSERT_7F
if (*(BufTempOut + Len - 3) == 0x7f)
{
crc8_rec = *(BufTempOut + Len - 2) ^ 0x20;
while(Len-- > 3)
{
OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
crc8 = CRC_8_table[crc8 ^ *BufOut++];
}
Len_New -= 3;
}
else
{
crc8_rec = *(BufTempOut + Len - 2);
while(Len-- > 2)
{
OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
crc8 = CRC_8_table[crc8 ^ *BufOut++];
}
Len_New -= 2;
}
#else
if (*(BufTempOut + Len - 3) == 0x7d)
{
crc8_rec = *(BufTempOut + Len - 2) ^ 0x20;
while(Len-- > 3)
{
OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
crc8 = CRC_8_table[crc8 ^ *BufOut++];
}
Len_New -= 3;
}
else
{
crc8_rec = *(BufTempOut + Len - 2);
while(Len-- > 2)
{
OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
crc8 = CRC_8_table[crc8 ^ *BufOut++];
}
Len_New -= 2;
}
#endif
if(crc8_rec != crc8)
Len_New = 0;
break;
case CRC_TYPE_16_BIT:
#ifdef FIFO_FRAME_INSERT_7F
if (*(BufTempOut + Len - 3) == 0x7f)
{
crc16_rec = ((WORD)(*(BufTempOut + Len - 2) ^ 0x20) << 8) & 0xff00;
if (*(BufTempOut + Len - 5) == 0x7f)
{
crc16_rec |= ((WORD)(*(BufTempOut + Len - 4) ^ 0x20) & 0x00ff);
while(Len-- > 5)
{
OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufOut++];
}
Len_New -= 5;
}
else
{
crc16_rec |= ((WORD)(*(BufTempOut + Len - 4)) & 0x00ff);
while(Len-- > 4)
{
OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufOut++];
}
Len_New -= 4;
}
}
else
{
crc16_rec = ((WORD)(*(BufTempOut + Len - 2)) << 8) & 0xff00;
if (*(BufTempOut + Len - 4) == 0x7f)
{
crc16_rec |= ((WORD)(*(BufTempOut + Len - 3) ^ 0x20) & 0x00ff);
while(Len-- > 4)
{
OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufOut++];
}
Len_New -= 4;
}
else
{
crc16_rec |= ((WORD)(*(BufTempOut + Len - 3)) & 0x00ff);
while(Len-- > 3)
{
OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufOut++];
}
Len_New -= 3;
}
}
#else
if (*(BufTempOut + Len - 3) == 0x7d)
{
crc16_rec = ((WORD)(*(BufTempOut + Len - 2) ^ 0x20) << 8) & 0xff00;
if (*(BufTempOut + Len - 5) == 0x7d)
{
crc16_rec |= ((WORD)(*(BufTempOut + Len - 4) ^ 0x20) & 0x00ff);
while(Len-- > 5)
{
OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufOut++];
}
Len_New -= 5;
}
else
{
crc16_rec |= ((WORD)(*(BufTempOut + Len - 4)) & 0x00ff);
while(Len-- > 4)
{
OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufOut++];
}
Len_New -= 4;
}
}
else
{
crc16_rec = ((WORD)(*(BufTempOut + Len - 2)) << 8) & 0xff00;
if (*(BufTempOut + Len - 4) == 0x7d)
{
crc16_rec |= ((WORD)(*(BufTempOut + Len - 3) ^ 0x20) & 0x00ff);
while(Len-- > 4)
{
OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufOut++];
}
Len_New -= 4;
}
else
{
crc16_rec |= ((WORD)(*(BufTempOut + Len - 3)) & 0x00ff);
while(Len-- > 3)
{
OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
crc16 = (crc16 << 8) ^ CRC_16_table[(crc16 >> 8) ^ *BufOut++];
}
Len_New -= 3;
}
}
#endif
if(crc16_rec != crc16)
Len_New = 0;
break;
case CRC_TYPE_CCITT:
#ifdef FIFO_FRAME_INSERT_7F
if (*(BufTempOut + Len - 3) == 0x7f)
{
crc16_rec = ((WORD)(*(BufTempOut + Len - 2) ^ 0x20) << 8) & 0xff00;
if (*(BufTempOut + Len - 5) == 0x7f)
{
crc16_rec |= ((WORD)(*(BufTempOut + Len - 4) ^ 0x20) & 0x00ff);
while(Len-- > 5)
{
OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufOut++];
}
Len_New -= 5;
}
else
{
crc16_rec |= ((WORD)(*(BufTempOut + Len - 4)) & 0x00ff);
while(Len-- > 4)
{
OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufOut++];
}
Len_New -= 4;
}
}
else
{
crc16_rec = ((WORD)(*(BufTempOut + Len - 2)) << 8) & 0xff00;
if (*(BufTempOut + Len - 4) == 0x7f)
{
crc16_rec |= ((WORD)(*(BufTempOut + Len - 3) ^ 0x20) & 0x00ff);
while(Len-- > 4)
{
OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufOut++];
}
Len_New -= 4;
}
else
{
crc16_rec |= ((WORD)(*(BufTempOut + Len - 3)) & 0x00ff);
while(Len-- > 3)
{
OPERATION_CLEAR_7F(*BufOut, ptr_temp, Len, Len_New)
crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufOut++];
}
Len_New -= 3;
}
}
#else
if (*(BufTempOut + Len - 3) == 0x7d)
{
crc16_rec = ((WORD)(*(BufTempOut + Len - 2) ^ 0x20) << 8) & 0xff00;
if (*(BufTempOut + Len - 5) == 0x7d)
{
crc16_rec |= ((WORD)(*(BufTempOut + Len - 4) ^ 0x20) & 0x00ff);
while(Len-- > 5)
{
OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufOut++];
}
Len_New -= 5;
}
else
{
crc16_rec |= ((WORD)(*(BufTempOut + Len - 4)) & 0x00ff);
while(Len-- > 4)
{
OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufOut++];
}
Len_New -= 4;
}
}
else
{
crc16_rec = ((WORD)(*(BufTempOut + Len - 2)) << 8) & 0xff00;
if (*(BufTempOut + Len - 4) == 0x7d)
{
crc16_rec |= ((WORD)(*(BufTempOut + Len - 3) ^ 0x20) & 0x00ff);
while(Len-- > 4)
{
OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufOut++];
}
Len_New -= 4;
}
else
{
crc16_rec |= ((WORD)(*(BufTempOut + Len - 3)) & 0x00ff);
while(Len-- > 3)
{
OPERATION_CLEAR_7D(*BufOut, ptr_temp, Len, Len_New)
crc16 = (crc16 << 8) ^ CRC_CCITT_table[(crc16 >> 8) ^ *BufOut++];
}
Len_New -= 3;
}
}
#endif
if(crc16_rec != crc16)
Len_New = 0;
break;
default:
break;
}
return Len_New;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -