In this bit of code:
if(Serial.available()){
char data = Serial.read();
char data2 = Serial.read();
You are asuming that if data is available at least two bytes are available, this is not a valid assumption.
Arduino is very fast, so serial.available() might return true when just one byte is available, and you might try to read the second byte before it is available.
Better to use something like:
if(Serial.available()>=2){
char data = Serial.read();
char data2 = Serial.read();
Also this code:
if(data == '?' && lastBib != 0 && lastTime != 0){
sendResult(lastBib, lastTime);
return;
}
Will never be executed because in the if block just above it you do a return if data=='?'
If your problem only happen when you send the ?, then i would look for the problem in the sendAllToComputer(); function, which you have not posted.
Finally it would be much better to use a switch statement than all the nested if / else If statements. It would make your code much easier to read and undertand, and much less errorprone.