|
|
我写串口读写的程序,结果遇到了一个很头痛的问题
写一点问题都没有,就是读
读的时候他会先吧数据读到缓冲区,并不传给我的程序
一直直到溢出
我用运行cat /dev/ttys0
然后单片机不断往上发数据,直到出现
tty(0) overrun ……
然后才是我发的数据
很郁闷,不知道使什么原因
我设置串口属性的主要代码如下:
int OComm::SetPortAttr ()
{
struct termios termios_new;
bzero (&termios_new, sizeof (termios_new));
cfmakeraw (&termios_new);
termios_new.c_cflag = BAUDRATE (); /* set baudrate */
termios_new.c_cflag |= CLOCAL | CREAD; /* | CRTSCTS */
termios_new.c_cflag &= ~CSIZE;
switch (m_databit) {
case 8:
termios_new.c_cflag |= CS8;
break;
case 7:
termios_new.c_cflag |= CS7;
break;
case 6:
termios_new.c_cflag |= CS6;
break;
case 5:
termios_new.c_cflag |= CS5;
break;
default:
termios_new.c_cflag |= CS8;
break;
}
switch (m_parity) {
case 'N': /* no parity check */
termios_new.c_cflag &= ~PARENB;
break;
case 'E': /* even */
termios_new.c_cflag |= PARENB;
termios_new.c_cflag &= ~PARODD;
break;
case 'O': /* odd */
termios_new.c_cflag |= PARENB;
termios_new.c_cflag |= ~PARODD;
break;
default: /* no parity check */
termios_new.c_cflag &= ~PARENB;
break;
}
if (0 == strcmp (m_stopbit, "1")) {
termios_new.c_cflag &= ~CSTOPB; /* 1 stop bit */
}
else if (0 == strcmp (m_stopbit, "1.5")) {
termios_new.c_cflag &= ~CSTOPB; /* 1.5 stop bits */
}
else if (0 == strcmp (m_stopbit, "2")) {
termios_new.c_cflag |= CSTOPB; /* 2 stop bits */
}
else {
termios_new.c_cflag &= ~CSTOPB; /* 1 stop bit */
}
termios_new.c_oflag = 0;
termios_new.c_lflag |= 0;
termios_new.c_oflag &= ~OPOST;
termios_new.c_cc[VTIME] = 1; /* unit: 1/10 second. */
termios_new.c_cc[VMIN] = 1; /* minimal characters for reading */
tcflush (m_fComm, TCIFLUSH);
return (tcsetattr (m_fComm, TCSANOW, &termios_new));
}
int OComm::BAUDRATE()
{
switch (m_iBaudRate) {
case 0:
return (B0);
case 50:
return (B50);
case 75:
return (B75);
case 110:
return (B110);
case 134:
return (B134);
case 150:
return (B150);
case 200:
return (B200);
case 300:
return (B300);
case 600:
return (B600);
case 1200:
return (B1200);
case 2400:
return (B2400);
case 9600:
return (B9600);
case 19200:
return (B19200);
case 38400:
return (B38400);
case 57600:
return (B57600);
case 115200:
return (B115200);
default:
return (B9600);
}
} |
|