보통 시리얼에서는 고객님께서 하시는 것처럼 처리하지 않는데요...
패켓은 프로토콜에서 재 조립하는 방식으로 처리하거든요...


질문을 하셨으니 답변은 해야겠네요..

유닉스나 리눅스에서 read 함수는 요구한 크기만큼
내용을 모두 얻어오지는 않습니다. ( 물론 상황에 따라서 다르지만요 )

원래는 이런식으로 해야 안전한 코드입니다.

int readcnt;
int readsum;
char readbuff[3500];

readsum = 0;
while( 1 )
{
if( readsum >= 3500 ) break;
readcnt = read(fd,&readbuff[readsum], 3500-readsum);
if( readcnt < 0 )
{
// 에러 처리 ( 보통은 프로그램 중지 )
}
readsum += readcnt;
}

써 넣기도 마찬가지고요...

이렇게 하는 이유는 각 장치별로 한번에 처리하는 내부 버퍼들의 크기에
차이가 있기 때문이거든요...

그래서 시리얼 같은 경우에는 조그만 단위로 나누어서 받고
조립해서 사용합니다.

더구나 시리얼 같은 경우 256 크기 이상이면 에러가 발생해서 버려야할
데이터가 될 확률이 상당히 커지죠...

고객님처럼 한꺼번에 받아서 처리하는 방식은 그리 좋은 방식이
아니라고 생각되네요