execl 下载-settimeout用法

cread
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