It freezes because you are doing a blocking Read call , having set the timeout to zero. That means that the Read will not return until Buffer.Length characters have been read - the error timeout has been disabled by the zero you wrote to it. If te Arduinoi does not supply at least Buffer.Length characters,. Read will never return.
Look at changing to an event driven read: use the SerialPort.DataReceived Event
] to collect each character as it comes, and build up whatever message it provides in a buffer. At least that way you can look at what is being received and stand a better chance of debugging the dataflow.