#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

...........
...........

int osc;
int r;
int flags;

osc = open("/dev/ttyS1", O_RDWR);
if (-1 == osc) {
	perror("open");
	exit(1);
}

/* переводим в неблокирующий режим */
r = flags = fcntl(osc, F_GETFL);
if (-1 == r) {
	perror("fcntl(GETFL)");
	exit(1);
}

flags |= O_NONBLOCK;

r = fcntl(osc, F_SETFL, flags);
if (-1 == r) {
	perror("fcntl(SETFL)");
	exit(1);
}

/* вычитываем "мусор" */
while (1) {
	char b;
	r = read(osc, &b, 1);
	if (1 == r)
		continue;
	if (-1 == r) {
		if (errno != EAGAIN) {
			perror("read()");
			exit(1);
		}
		/* errno == EAGAIN, no more data */
		break;
	}
}

/* переводим обратно в блокирующий режим*/
r = flags = fcntl(osc, F_GETFL);
if (-1 == r) {
	perror("fcntl(GETFL)");
	exit(1);
}

flags &= ~O_NONBLOCK;

r = fcntl(osc, F_SETFL, flags);
if (-1 == r) {
	perror("fcntl(SETFL)");
	exit(1);
}

.... /* продолжаем нормальную работу */