通过串口发送位移数据

时间:2016-11-27 11:53:09

标签: bit-manipulation

我有2个处理器:A和B. A正在解码4x4键盘并将字符发送到驱动显示器的处理器B.处理器A还具有发送给B的实时数据。所以我想要一种方案,其中A过滤出来自按键的数据。 A还将发送一个特殊代码,告诉B下一个或2个字节是显示数据。键盘字符将处理菜单。我想如果我发送了msb设置的任何内容:0xFF到0x80 - 那么B会将其过滤为按键或特殊代码。因此数据将在(例如)0xFF之前 - 将参数1作为字节发送,并将0xFE发送 - 将参数2作为字发送。该字节的数据将被移位到右侧1位,因此B将其解释为偶数的0-127。当发送一个字时,它必须是2个字节代表一个字,但每个字节移位超过1位,因此得到的字最终将被移位超过2位(0-> 16,383,以4的倍数),这是准确的足以显示。我尝试使用位移来发送一个字(uint16_t):

uint16_t decode(UCHAR num1, UCHAR num2)
{
    uint16_t res;
    num1 <<= 1;
    num2 <<= 1;
    num1 |= ((num2 >> 7) & 1);
    res = (uint16_t)(num1 << 8) | ((num2 << 1) & 0x7f);
    return res;
}

void encode(UCHAR *num1, UCHAR *num2, uint16_t res)
{
    UCHAR temp1, temp2;
    uint16_t tres = res >> 2;
    temp1 = (UCHAR)res;
    temp2 = (UCHAR)(res >> 8);
    temp1 >>= 1;
    temp2 >>= 1;
    *num1 = (temp1 & 0x7f);
    *num2 = (temp2 & 0x7f);
}
for(res = 0;res < 0xffff;res++)
{
    encode(&num1,&num2,res);
    res2 = decode(num1,num2);
    printf("%d -> %x %x\n",res, num1, num2);
}   

我知道这不太对,但我想知道使用工会或位字段更容易做到这一点。

0 个答案:

没有答案