The first time you reach the part that reads the response, there probably won't be anything there yet, because it takes some time for the response to come back. However, your outer while loop contains a flush(), which will discard any data before you see it.
I suggest, at least to start out, that you redo your code in a simpler format: open the port only once, send your data, then have a while loop that reads the port until you see data. i.e. use something like this to read the result:
while (1)
{
my $ret=<PORT>
print $ret;
if ($ret=~/^OK/ || $ret=~/^ERROR/) { last}
}
Caveat: not tested; I don't really have a way to do so.
When's the last time you used duct tape on a duct? --Larry Wall