Quando index = 7 (ou seja, o último bit do byte), tu adicionas o bit que recebeste ao byte e depois fazes um shift para criar espaco para o bit seguinte. No entanto, no byte seguinte, comecas de novo e introduziste um espaco em branco.
Podes fazer algo como:
void loop() {
while (Serial.available() >0)
{
if(index<8){
inChar = Serial.read();
index++;
if(inChar == '1'){
b |= 1;
}else{
b |= 0;// algo OU zero é sempre igual a algo... logo isto não faz nenhum.
}
if (index<7) b <<= 1;//se for o último bit, não precisamos de criar espaco para o seguinte.
}
}
if(index==8){
escreve();
index=0;
Serial.print(b, BIN);
}
}
Se vais mandar 16 bits, podes alterar a variável inChar para unsigned int e alterar os 16 bits dum ciclo só.
E se fosse:
index = 7;
if (index-- >= 0) {
inChar = Serial.read();
if (inChar == '1') {
b|= 1<< index;
}
}
Pode haver problemas nos indices, mas é muito menos rebuscado. Ahh e a direccão dos bits está invertida.