You use
ReadExisting[
^] for reading data. This function returns immediately returning the data actually available in the input buffer (which might be even no data). So you should collect received data until some kind of end of data is received or a timeout occurs.
When the answer is terminated with a new line, you might use
ReadLine[
^] instead. But you should set a timeout value then to avoid infinite blocking if no answer is received.