execl 下载-settimeout用法
2023年4月5日发(作者:ws2_32 dll)
Linux下C语⾔串⼝应⽤编程
在编写Linux串⼝的C程序之前,需要包含以下头⽂件:
#include
在Linux系统中,⼀切皆⽂件,所以串⼝设备也是⼀类⽂件,学习过Linux驱动程序的学员都知道,Linux有三类设备:字符设备,块设备,
⽹络设备。那么串⼝设备属于字符设备。所以串⼝设备的命名⼀般为/dev/ttySn(n=0、1、2......),如果该串⼝为USB转串⼝,可能名称
为/dev/ttyUSBn(n=0、1、2......),不同的平台下串⼝的名称是不同的,且串⼝的名称也是可以更改的。如何更改?在板卡对应的Linux驱动
中更改。
在Linux下操作串⼝,那么也就是跟操作⼀个⽂件⼀样,既然是⽂件,也就可以使⽤标准的⽂件操作API来操作。
1、打开串⼝
2、关闭串⼝
fd为⽂件描述符。
如果不设置串⼝的波特率,数据位,停⽌位,校验位的情况下,Linux下默认设置的属性值为:
波特率:9600
数据位:8
校验位:n(表⽰⽆)
停⽌位:1
在不设置串⼝属性值的情况下,也可以读写串⼝值。
3、读写串⼝
使⽤read,write函数即可,例如:
以上例程展现的是往串⼝写⼊⼀个数据,串⼝就会回复⼀个数据,也就是⾃发⾃收。
完整例程:
#include
#include
#include
#include
#include
#defineDEV_NAME"/dev/ttyS1"
intmain(intargc,char*argv[])
{
intfd;
intlen,i,ret;
charbuf[]="helloZLG!";
fd=open(DEV_NAME,O_RDWR|O_NOCTTY);
if(fd<0){
perror(DEV_NAME);
return-1;
}
len=write(fd,buf,sizeof(buf));
if(len<0){
printf("writedataerrorn");
}
len=read(fd,buf,sizeof(buf));
if(len<0){
printf("readerrorn");
return-1;
}
printf("%s",buf);
return(0);
}
上⾯给出的例程是串⼝驱动的默认属性值(9600,8n1,⽆流控),在实际产品开发过程中,还是会根据不同的应⽤场景来设置串⼝的属
性。操作串⼝属性需要设置对应的标志,在POSIX终端已经帮我们实现了若⼲结构体以及相应的标志位,我们只要熟练使⽤它即可,⾮常简
单。
最重要的structtermios结构体:
1、设置串⼝波特率
.
例程:
staticvoidset_baudrate(structtermios*opt,unsignedintbaudrate)
{
cfsetispeed(opt,baudrate);
cfsetospeed(opt,baudrate);
}
2、设置数据位
数据位指的是每字节中实际数据所占的⽐特数。要修改数据位可以通过修改termios结构体中c_cflag成员来实
现。CS5、CS6、CS7和CS8分别表⽰数据位为5、6、7和8。值得注意的是,在设置数据位时,必须先使⽤CSIZE做位屏蔽。
例程:
staticvoidset_data_bit(structtermios*opt,unsignedintdatabit)
{
opt->c_cflag&=~CSIZE;
switch(databit){
case8:
opt->c_cflag|=CS8;
break;
case7:
opt->c_cflag|=CS7;
break;
case6:
opt->c_cflag|=CS6;
break;
case5:
opt->c_cflag|=CS5;
break;
default:
opt->c_cflag|=CS8;
break;
}
}
3、设置校验位
奇偶校验可以选择偶校验、奇校验、空格等⽅式,也可以不使⽤校验。如果要设置为偶校验的话,⾸先要将termios结构体中c_cflag设置PARENB标志,并清
除PARODD标志。如果要设置奇校验,要同时设置termios结构体中c_cflag设置PARENB标志和PARODD标志。如果不想使⽤任何校验的话,清除termios结构
体中c_cflag的PARENB位。表6.12所⽰为设置奇偶校验的具体⽅法。
例程:
staticvoidset_parity(structtermios*opt,charparity)
{
switch(parity){
case'N':/*noparitycheck*/
opt->c_cflag&=~PARENB;
break;
case'E':/*even*/
opt->c_cflag|=PARENB;
opt->c_cflag&=~PARODD;
break;
case'O':/*odd*/
opt->c_cflag|=PARENB;
opt->c_cflag|=~PARODD;
break;
default:/*noparitycheck*/
opt->c_cflag&=~PARENB;
break;
}
}
4、设置停⽌位
设置串⼝停⽌位是在termios对象的c_cflag成员上设置,需要⽤到的选项标志为
CSTOPB(2位停⽌位,否则为1位)。
例程:
staticvoidset_stopbit(structtermios*opt,constchar*stopbit)
{
if(0==strcmp(stopbit,"1")){
opt->c_cflag&=~CSTOPB;/*1stopbit*/
}elseif(0==strcmp(stopbit,"1")){
opt->c_cflag&=~CSTOPB;/*1.5stopbit*/
}elseif(0==strcmp(stopbit,"2")){
opt->c_cflag|=CSTOPB;/*2stopbits*/
}else{
opt->c_cflag&=~CSTOPB;/*1stopbit*/
}
}
于是我们就可以将串⼝这三样基本的设置写成⼀个函数,以后⽤的时候就调⽤它即可。
//串⼝设置
intSerial_Handle::set_port_attr(
intfd,
intbaudrate,//B1200B2400B4800B9600..B115200
intdatabit,//5,6,7,8
constchar*stopbit,//"1","1.5","2"
charparity,//N(o),O(dd),E(ven)
intvtime,
intvmin)
{
structtermiosopt;
tcgetattr(fd,&opt);
//设置波特率
set_baudrate(&opt,baudrate);
opt.c_cflag|=CLOCAL|CREAD;/*|CRTSCTS*/
//设置数据位
set_data_bit(&opt,databit);
//设置校验位
set_parity(&opt,parity);
//设置停⽌位
set_stopbit(&opt,stopbit);
//其它设置
opt.c_oflag=0;
opt.c_lflag|=0;
opt.c_oflag&=~OPOST;
opt.c_cc[VTIME]=vtime;
opt.c_cc[VMIN]=vmin;
tcflush(fd,TCIFLUSH);
return(tcsetattr(fd,TCSANOW,&opt));
}
以后在使⽤串⼝的时候即是要遵循以下的顺序才能使⽤。
1、打开串⼝设备
2、设置串⼝的波特率,数据位,校验位,停⽌位以及其它设置
3、写数据
4、读出数据
5、关闭串⼝
参考⽂献:
2、周⽴功=====>【开发指南】M6G2C&A6G2C系列核⼼板软件开发指南_V1.05
更多推荐
cread
发布评论