74HC595 recebendo sinal serial

ola amigos, estou enfrenteando um problema e gostaria da ajuda de vocês se possivel.

gostaria de enviar via serial por exemplo 1111000110110101 e gostaria que os registradores ligassem os leds na mesma sequencia. Eu tentei usar o codigo que fiz abaixo mas por exemplo quando envio via serial 11111111111111 ele retorna 111111101111110. alguem sabe me dizer qual o erro???
Obrigado

int latchPin = 8;
int clockPin = 12;
int dataPin = 11;

char inChar; 
int index = 0; 

byte b;


void setup() {
  
 Serial.begin(9600);
 pinMode(latchPin, OUTPUT);
 pinMode(clockPin, OUTPUT);
 pinMode(dataPin, OUTPUT);
}

void loop() {
  
   
  
  
  while (Serial.available() >0) 
  
    {
     if(index<8){
     
        inChar = Serial.read(); 
            
            index++; 
           
            
            if(inChar == '1'){
              b |= 1;
              }else{
              b |= 0;
            }
         b <<= 1;
      }
}
      if(index==8){
       escreve();
       index=0; 
        Serial.print(b, BIN);
      }

}



void escreve()
{
  digitalWrite(latchPin, LOW);
  
   shiftOut(dataPin, clockPin, MSBFIRST, b);
   digitalWrite(latchPin, HIGH);
      
    
}

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.

muitissimo obrigado pela ajuda....

fiz a alteração que voce sugeriu

quando coloquei 7 ele me retornava apenas 15 bits...quando coloquei 8 ele me retornou os 16 correto...me diz uma coisa...
quando envio via serial 0101010101010101 ele me retorna 101010111010101
e quando eu mando 1010101010101010 ele retorna 1010101010101010

porque??

Eu vejo isto mais tarde... Os bits vão estar invertidos e provavelmente a Serial.print() não coloca o leading zero na string.

mas não é so no serial print....os leds se comportam assim

O serial print vai condizer com os LEDs... ligaste o sinal de carry?

;/ acredito que não. voce consegue me dizer como ou dar um exemplo??

Já viste isto:

e isto:

Arduino Forum ?

Experimentaste código assim:

index = 15; 
b = 0; //importante. 
while (index-- >= 0) {
    inChar = Serial.read();
    if (inChar == '1') {    
        b|= 1<< index; 
    }
}

O problema está nos shifts creio... mas se vais passar logo 16 bits é preferível fazer isto duma vez em vez de fazeres um byte de cada vez.

Experimenta o código como escrevi agora.