我有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);
}
我知道这不太对,但我想知道使用工会或位字段更容易做到这一点。