Na dann ist doch klar, warums nicht läuft.

Do Until Me.SerialPort1.ReadChar()="S?"

Hier wird dann 1 Zeichen aus dem Empfangspuffer ausgelesen, und mit 2 Zeichen verglichen. Die Bedingung kann ja niemals true werden.

Überprüfe lieber ob ein S empfangen wird, und überprüfe danach auf das ?


Edit:

Ich will sagen, lass den Empfangspuffer in einer Schleife Zeichen für Zeichen abarbeiten. Falls z.B. ein S kommt, wird als nächstes (hoffentlich) ein ? kommen.