I finally got it working. The number of stop bits was wrong, that's why the first character was always correct and the rest incorrect. Final code if SerialPortNG.NextClusterSize >= 0 then begin sRaw:=SerialPortNG.ReadNextClusterAsString; for i:=1 to length(sRaw) do iData[i]:= byte(sRaw[i]); Thanks Wallace