LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 960|回复: 2

请问一个串口读的问题

[复制链接]
发表于 2005-9-7 20:33:16 | 显示全部楼层 |阅读模式
我写串口读写的程序,结果遇到了一个很头痛的问题
写一点问题都没有,就是读
读的时候他会先吧数据读到缓冲区,并不传给我的程序
一直直到溢出
我用运行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);
    }
}
 楼主| 发表于 2005-9-8 10:37:27 | 显示全部楼层
我的开发板上有4个串口 dmesg中有下面的信息,他们是公用中断的 不知道有没有什么影响
ttyS0 at 0x03f8 (irq = 4) is a 16550A
ttyS1 at 0x02f8 (irq = 3) is a 16550A
ttyS2 at 0x03e8 (irq = 4) is a 16550A
ttyS3 at 0x02e8 (irq = 3) is a 16550A
我的串口S1是没有问题 2,3有问题
cat /dev/ttyS2后不断输入数据,但是没有显示,输入16个后出现 ttyS: 1 input overrun(s)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-8 14:48:48 | 显示全部楼层
自己解决了 原来linux下用多于2个串口就会中断冲突
重新设置串口中断就可以解决问题
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表