终端I/O---ttyS3: 3 inp

发布时间:2019-09-21 11:10:47编辑:auto阅读(1681)

    没系统地学过终端I/O的控制,只是按照别人的要求配置了一下
    背景:gps插在串口3上
    #include <stdio.h>
    #include "time.h"
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <termios.h>

    int main()
    {
      struct termios opt;
      int fd=-1;
      int nread;
      char buf[1024];
      
      fd=open("/dev/ttyS3" ,O_RDONLY    |O_NONBLOCK);
      if(fd==-1)    {    printf("open /dev/ttyS3 error\n");    }
      
      tcgetattr(fd,&opt);
                 //获取终端属性到opt
      tcflush(fd,TCIOFLUSH);
                 //同时刷新收到的数据但是不读,刷新写入的数据但是不传送
      cfsetispeed(&opt, B9600);    
                //设置输入波特率
      cfsetospeed(&opt, B9600);
                //设置输出波特率

      opt.c_cflag&=~CSIZE;
                 //(不用     )字符长度掩码。取值为 CS5, CS6, CS7, 或 CS8。
      opt.c_cflag |=CS8;
                 //取值为CS8

      opt.c_cflag &= ~PARENB;
                 //(不用     )允许输出产生奇偶信息以及输入的奇偶校验。
      opt.c_iflag &= ~INPCK;
                 //(不用     )启用输入奇偶检测。
      opt.c_cflag &= ~CSTOPB;
                 //(不用     )设置两个停止位,而不是一个
      opt.c_cflag &= ~CRTSCTS;
                 //(不用     )硬件流控
      opt.c_cc[VTIME] = 150;
                 //非 canonical 模式读时的延时,以十分之一秒为单位
      opt.c_cc[VMIN] = 0;        
                 //非 canonical 模式读的最小字符数

      opt.c_lflag    &= ~(ICANON | ECHO) ;
                 //(不用     )启用标准模式 (canonical mode)允许使用
                 //特殊字符 EOF, EOL, EOL2, ERASE, KILL, LNEXT, REPRINT, 
                 //和 WERASE,以及按行的缓冲。
                 //(不用     )回显输入字符。
      tcflush(fd,TCIOFLUSH);
      tcsetattr(fd,TCSANOW,&opt);
                 //改变立即发生
      
        while(1)
        {
            nread = read(fd,buf,1000);
            //printf("nread=%d\n",nread);
            //if(nread !=-1 )    printf("%s",buf);//打印数据
            sleep(2);
            memset(buf,0x0,1024);
        }
      
      if(fd!=-1) close(fd);
      return 0;
    }
    我用
      cat /dev/ttyS3
    发现输入到串口的数据是对的啊
    可是我用上面这个程序去读的时候
    出现如下错误啊:
    ttyS3: 3 input overrun(s)
    ttyS3: 5 input overrun(s)
    并且这类问题随程序的执行,一直都慢慢地出来,连绵不绝啊
    谁碰到过这个问题,请指教

    依旧没有得到解决办法:权益之计,我把arm-linux-2.6内核源码的n_tty.c
    611行printk注释掉了,重编内核,就是说,碰到这个警告不让它打印出来


关键字