Reading a packet of data in one call

Output the BytesToRead and you're going to find that there aren't any to read, even with a proper connection.

Your processor operates many many times faster than serial communications, even through the overhead of the .NET runtime engine. Not only are you not going to receive a result in the time it takes your code to get from the Write() operation to the Read() operation, but it's likely your command still hasn't even been sent by that point.

The recommended method of receiving serial data in C# is through the DataReceived event. This is because you can't really predict when the data is going to arrive.