Why are you doing the tcgetattr/tcsetattr twice?
It should be port_opt.c_cflag = CLOCAL|CREAD; You seem to be setting the c_oflag with those bits. The corresponding bits in the oflag mask would be OFDEL|TAB1

I typically set c_iflag = c_oflag = c_lflag = 0; and c_cflag = (CSIZE&CS8)|CLOCAL|CREAD;

The three digit hex encoding always irks me, it is normal for octal numbers, but in this case does \x010 translate to the array 0, 16 or simply 16? I couldn't find a clear answer in my C reference book.

As far as the read being from stdin, I don't know really what could be causing it. Maybe one of the things I mentioned magically fixes it. You can also check the declared types and order of your variables. If vfd_fd is not an int, or the variable declared right before vfd_fd is a char buffer, you might have a simple overflow problem, clobbering the variable with null bytes.
_________________________
40GB - serial #40104051 gpsapp