1bit变2bit,最简单做个表直接隐射,我的代码还兼容线+-接反,发送时加签到码识别下即可
代码:
const u8 g_ManchesterEncodeTab[] = {43, 45, 51, 53, 54, 75, 77, 83, 85, 86, 89, 90, 101, 102, 105, 106};
const u8 g_ManchesterDecodeTab[] = {
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 255, 1, 255, 255,
255, 255, 255, 2, 255, 3, 4, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 5, 255, 6, 255, 255,
255, 255, 255, 7, 255, 8, 9, 255, 255, 10, 11, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 12, 13, 255, 255, 14, 15, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255
};
//反转时码表{169, 165, 153, 149, 147, 105, 101, 89, 85, 83, 77, 75, 53, 51, 45, 43};
const u8 g_ManchesterDecodeRevTab[] = {
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 255, 14, 255, 255,
255, 255, 255, 13, 255, 12, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 11, 255, 10, 255, 255,
255, 255, 255, 9, 255, 8, 255, 255, 255, 7, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 6, 255, 255, 255, 5, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 4, 255, 3, 255, 255, 255, 2, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 1, 255, 255, 255, 0, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255
};
/*************************************************************************
* Function Name: ManchesterEncode
* Parameters:
*
* Return: none
*
* Description: Manchester编码,1=10, 0=01
*
*************************************************************************/
void ManchesterEncode(u8 *pIn, u8 *pOut, u16 n)
{
// u8 b;
//
// while(n--)
// {
// b = *pIn++;
// *pOut++ = g_ManchesterEncodeTab[b&0x0f];//low 4bit
// *pOut++ = g_ManchesterEncodeTab[b>>4];//hight 4bit
// }
//
pIn += n - 1;//为了兼容PIN POUT指向同一地址
pOut += n + n - 1;
u8 b;
while(n--)
{
b = *pIn--;
*pOut-- = g_ManchesterEncodeTab[b>>4];//hight 4bit
*pOut-- = g_ManchesterEncodeTab[b&0x0f];//low 4bit
}
}
/*************************************************************************
* Function Name: ManchesterDecode
* Parameters:
*
* Return: none
*
* Description: Manchester解码,1=10, 0=01
*
*************************************************************************/
void ManchesterDecode(u8 *pIn, u8 *pOut, u16 n)
{
u8 b;
while(n--)
{
b = g_ManchesterDecodeTab[*pIn++];
*pOut++ = b | (g_ManchesterDecodeTab[*pIn++]<<4);
}
}
/*************************************************************************
* Function Name: ManchesterDecodeRev
* Parameters:
*
* Return: none
*
* Description: 线接反时Manchester解码,1=10, 0=01
*
*************************************************************************/
void ManchesterDecodeRev(u8 *pIn, u8 *pOut, u16 n)
{
u8 b;
while(n--)
{
b = g_ManchesterDecodeRevTab[*pIn++];
*pOut++ = b | (g_ManchesterDecodeRevTab[*pIn++]<<4);
}
} |