没系统地学过终端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;
}
#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注释掉了,重编内核,就是说,碰到这个警告不让它打印出来
转载于:https://blog.51cto.com/nnssll/200044