das "ÿ" steht für 255, also ist dein Serialport nicht ganz sauber oder produziert im ersten Moment Müll, hier sollte man einen anderen Ansatz versuchen!

Aber nochmal zum readline ... readline wartet immer bis zum Empfang eines newline oder kurz "\n" befor es von der Ausführung zurückkommt, genauso wie dein fscanf versucht erst den angegebenen Wert zu interpretieren

fscanf das f vorne steht übrigens für file, ein serialstream ist das gleiche wie ein filestream die sind identisch bis auf dass die Datei bis zum EOF schon da ist, während der serialstream quasi erst über den input aufgebaut wird

Für den veränderten Ansatz und um das überschüssige 0xFF loszuwerden könntest du mal über ein Handshake nachdenken, bei dem du erst ein Zeichen von Arduion bekommst, dann ein Zeichen zum Synchronisieren schickst, dass der Arduino mit einer passende Antwort bestätigen muss ... danach kannst du davon ausgehen immer die Zeichen in der gleichen Reihenfolge zu Empfangen .... oder du machst die Lösung mit dem ":" nochmal und machst einfach solange read() auf deinen stream biss du ein ":" erhälst und beginnst danach erst mit fscanf, also das ":" zum synchronisieren

UART am PC ist invertiert, solang dein Controller also keinen Pegel auf die Leitung legt, denkt dein Computer du sendest nur 1en, bricht dann nach einem internen timeout ab verwirft den fehler dass er kein stopbit erhalten hat und speichert eben 0xff/255/0b11111111 im stream ... und darüber stolpert dein fscanf