串口通信中用到的函数_第1页
串口通信中用到的函数_第2页
串口通信中用到的函数_第3页
串口通信中用到的函数_第4页
串口通信中用到的函数_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux C语言中open函数int open( const char * pathname, int flags); int open( const char * pathname,int flags, mode_t mode); 函数说明参数pathname 指向欲打开的文件路径字符串。下列是参数flags 所能使用的旗标: O_RDONLY 以只读方式打开文件 O_WRONLY 以只写方式打开文件 O_RDWR 以可读写方式打开文件。 上述三种旗标是互斥的,也就是不可同时使用,但可与下列的旗标利用OR(|)运算符组合。 O_CREAT 若欲打开的文件不存在则自动建立该文件。 O_EXC

2、L 如果O_CREAT 也被设置,此指令会去检查文件是否存在。文件若不存在则建立该文件,否则将导致打开文件错误。此外,若O_CREAT与O_EXCL同时设置,并且欲打开的文件为符号连接,则会打开文件失败。 O_NOCTTY 如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。 O_TRUNC 若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的 资料也会消失。 O_APPEND 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。 O_NONBLOCK 以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即返回进程

3、之中。 O_NDELAY 同O_NONBLOCK。 O_SYNC 以同步的方式打开文件。 O_NOFOLLOW 如果参数pathname 所指的文件为一符号连接,则会令打开文件失败。 O_DIRECTORY 如果参数pathname 所指的文件并非为一目录,则会令打开文件失败。 参数mode 组合此为Linux2.2以后特有的旗标,以避免一些系统安全问题。参数mode 则有下列数种组合,只有在建立新文件时才会生效,此外真正建文件时的权限会受到umask值所影响,因此该文件权限应该为(mode-umaks)。 S_IRWXU 00700 权限,代表该文件所有者具有可读、可写及可执行的权限。 S_

4、IRUSR 或S_IREAD, 00400权限,代表该文件所有者具有可读取的权限。 S_IWUSR 或S_IWRITE,00200 权限,代表该文件所有者具有可写入的权限。 S_IXUSR 或S_IEXEC, 00100 权限,代表该文件所有者具有可执行的权限。 S_IRWXG 00070权限,代表该文件用户组具有可读、可写及可执行的权限。 S_IRGRP 00040 权限,代表该文件用户组具有可读的权限。 S_IWGRP 00020权限,代表该文件用户组具有可写入的权限。 S_IXGRP 00010 权限,代表该文件用户组具有可执行的权限。 S_IRWXO 00007权限,代表其他用户具有可

5、读、可写及可执行的权限。 S_IROTH 00004 权限,代表其他用户具有可读的权限 S_IWOTH 00002权限,代表其他用户具有可写入的权限。 S_IXOTH 00001 权限,代表其他用户具有可执行的权限。 返回值若所有欲核查的权限都通过了检查则返回文件描述符,表示成功,只要有一个权限被禁止则返回-1。C语言中open函数作用:打开和创建文件。 int open(const char *pathname, int oflag, . /* mode_t mode */); 返回值:成功则返回文件描述符,否则返回 -1 对于 open 函数来说,第三个参数(.)仅当创建新文件时(即 使用

6、了O_CREAT 时)才使用,用于指定文件的访问权限位(access permission bits)。pathname 是待打开/创建文件的路径名(如 C:/cpp/a.cpp);oflag 用于指定文件的打开/创建模式,这个参数可由以下常量(定义于 fcntl.h)通过逻辑或构成。 O_RDONLY 只读模式 O_WRONLY 只写模式 O_RDWR 读写模式 打开/创建文件时,至少得使用上述三个常量中的一个。以下常量是选用的: O_APPEND 每次写操作都写入文件的末尾 O_CREAT 如果指定文件不存在,则创建这个文件 O_EXCL 如果要创建的文件已存在,则返回 -1,并且修改 e

7、rrno 的值 O_TRUNC 如果文件存在,并且以只写/读写方式打开,则清空文件全部内容(即将其长度截短为0) O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。 O_NONBLOCK 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O文件描述符:内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard outpu

8、t)是 1,标准错误(standard error)是 2。尽管这种习惯并非 Unix 内核的特性,但是因为一些 shell 和很多应用程序都使用这种习惯,因此,如果内核不遵循这种习惯的话,很多应用程序将不能使用。POSIX 定义了 STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO 来代替 0、1、2。这三个符号常量的定义位于头文件 unistd.h。ioctlioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用个数int ioctl(int fd,

9、 ind cmd, ); 其中fd就是用户程序打开设备时使用open函数返回的文件标示符,cmd就是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,有或没有是和cmd的意义相关的。 ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数控制设备的I/O通道cmd参数在用户程序端由一些宏根据设备类型、序列号、传送方向、数据尺寸等生成,这个整数通过系统调用传递到内核中的驱动程序,再由驱动程序使用解码宏从这个整数中得到设备的类型、序列号、传送方向、数据尺寸等信息,然后通过switchcase结构进

10、行相应的操作。FIONREAD:通过由ioctl的第三个参数指向的整数返回当前在本套接口接收缓冲区中的字节数。本特性同样适用于文件,管道和终端Writessize_t write(int filedes, const void *buf, size_t nbytes);返回值:写入文档的字节数(成功);-1(出错)write 函数向 filedes 中写入 nbytes 字节数据,数据来源为 buf 。返回值一般总是等于 nbytes,否则就是出错了。常见的出错原因是磁盘空间满了或超过了文档大小限制。Read #include ssize_t read(int filedes, void *b

11、uf, size_t nbytes);返回值:读取到的字节数;0(读到 EOF);-1(出错)read 函数从 filedes 指定的已打开文档中读取 nbytes 字节到 buf 中。以下几种情况会导致读取到的字节数小于 nbytes : A. 读取普通文档时,读到文档末尾还不够 nbytes 字节。例如:假如文档只有 30 字节,而我们想读取 100字节,那么实际读到的只有 30 字节,read 函数返回 30 。此时再使用 read 函数作用于这个文档会导致 read 返回 0 。 B. 从终端设备(terminal device)读取时,一般情况下每次只能读取一行。 C. 从网络读取时

12、,网络缓存可能导致读取的字节数小于 nbytes 字节。 D. 读取 pipe 或 FIFO 时,pipe 或 FIFO 里的字节数可能小于 nbytes 。 E. 从面向记录(record-oriented)的设备读取时,某些面向记录的设备(如磁带)每次最多只能返回一个记录。 F. 在读取了部分数据时被信号中断。读操作始于 cfo 。在成功返回之前,cfo 增加,增量为实际读取到的字节数。/* 打开串口*/int open_com1() /*打开串口2函数 */ int fd; fd = open(/tyCo/0,O_CREAT|O_RDWR,0); /*打开串口并返回串口设备文件描述符*/

13、if(fd=ERROR) /*如果不能打开串口1则打印出错信息*/printf(You cant open port com1!n);else printf(open Com1 successfully!n); /* 配置串口*/int config_com1(void) /*串口1配置函数*/ ioctl(fd,FIOSETOPTIONS,OPT_LINE); /*设置串口工作模式为行模式:LINE_MODE */ioctl(fd,FIOBAUDRATE,9600); /*设置串口波特率为9600bps*/ioctl(fd,FIOFLUSH,0); /*清空输入输出缓冲*/ioctl(fd,

14、SIO_HW_OPTS_SET,CS8|STOPB|PARENB|PARODD); /*设置 8 位数据位,2位停止位,带校验位,奇校验*/ioctl (fd, FIOSETOPTIONS,OPT_ECHO | OPT_CRMOD | OPT_TANDEM | OPT_7_BIT);printf(set options successfullyn);/* 串口发送数据 */int send_com1(void) /*向串口1发送数据函数*/ char *send_buf =Hello,Data had accept!; /*待发送数据*/write(fd,send_buf,strlen(sen

15、d_buf); /*任务阻塞等待写串口准备完毕*/*关闭串口*/extern STATUS close(fd)close(fd);FD_ZERO(fd_set *fdset);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。 FD_SET(fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。 FD_CLR(fd_set *fdset);用于在文件描述符集合中删除一个文件描述符。 FD_ISSET(int fd,fd_set *fdset);用于测试指定的文件描述符是

16、否在该集合中。 select函数: 系统提供select函数来实现多路复用输入/输出模型。原型: #include sys/time.h #include unistd.h int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout);int FD_ISSET(int fd,fd_set *fdset) 宏说明:在调用select()函数后,用FD_ISSET来检测fdset中文件fd有无发生变化 返回整型,当fd是fdset的子集的时候,返回真,否者返回假。参数maxfd是需要监

17、视的最大的文件描述符值+1;rdset需要检测的可读文件描述符的集合,wrset可写文件描述符的集 合exset及异常文件描述符的集合。struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。select模型int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);其中参数n表示监控的所有fd中最大值1。和select模型紧密结合的四个宏,FD_CLR(int fd, fd_set *set)

18、;FD_ISSET(int fd, fd_set *set);FD_SET(int fd, fd_set *set);FD_ZERO(fd_set *set);理解select模型的关键在于理解fd_set,为说明方便,取fd_set长度为1字节,fd_set中的每一bit可以对应一个文件描述符fd。则1字节长的fd_set最大可以对应8个fd。(1)执行fd_set set; FD_ZERO(&set);则set用位表示是0000,0000。(2)若fd5,执行FD_SET(fd,&set);后set变为0001,0000(第5位置为1)(3)若再加入fd2,fd=1,则set变为0001,

19、0011(4)执行select(6,&set,0,0,0)阻塞等待(5)若fd=1,fd=2上都发生可读事件,则select返回,此时set变为0000,0011。注意:没有事件发生的fd=5被清空。基于上面的讨论,可以轻松得出select模型的特点:(1)可监控的文件描述符个数取决与sizeof(fd_set)的值。我这边服务 器上sizeof(fd_set)512,每bit表示一个文件描述符,则我服务器上支持的最大文件描述符是512*8=4096。据说可调,另有说虽 然可调,但调整上限受于编译内核时的变量值(2)将fd加入select监控集的同时,还要再使用一个数据结构array保存放到s

20、elect监控集中的fd,一是用于再select 返回后,array作为源数据和fd_set进行FD_ISSET判断。二是select返回后会把以前加入的但并无事件发生的fd清空,则每次开始 select前都要重新从array取得fd逐一加入(FD_ZERO最先),扫描array的同时取得fd最大值maxfd,用于select的第一个 参数。(3)可见select模型必须在select前循环array(加fd,取maxfd),select返回后循环arraytimeout为结构timeval,用来设置select()的等待时间,其结构定义如下struct timevaltime_t tv_se

21、c;time_t tv_usec;返回值如果参数timeout设为NULL则表示select()没有timeout。taskDelay(n)使调用该函数的任务延时n个tick(内核时钟周期)。该任务在指定的时间内主动放弃CPU,除了taskDelay(0)专用于任务调度(将CPU交给同一优先级的其他任务)外,任务延时也常用于等待某一外部事件,作为一种定时延时机制。在没有中断触发时,taskDelay能很方便地实现,且不影响系统整体性能。例如写数据至EEPROM,EEPROM需要一个内部擦除时间(最大擦除时间为lOms)。以下所提及的一个tick都假设为1667 ms(160 s)。可以简单地调

22、用taskDelay(2)来保证数据擦写完成。taskDelay有接近一1个tick的误差存在,taskDelay(n)实际上是延时(n-1)tickn tick的时间。延时精度为ln主题:ioctl函数详细说明 ioctl函数本函数影响由fd参数引用的一个打开的文件。#includeintioctl( int fd, int request, ./* void *arg */ );返回0:成功 -1:出错第三个参数总是一个指针,但指针的类型依赖于request参数。我们可以把和网络相关的请求划分为6类:套接口操作文件操作接口操作ARP高速缓存操作路由表操作流系统下表列出了网络相关ioctl请

23、求的request参数以及arg地址必须指向的数据类型:类别Request说明数据类型套接口SIOCATMARKSIOCSPGRPSIOCGPGRP是否位于带外标记设置套接口的进程ID或进程组ID获取套接口的进程ID或进程组IDintintint文件FIONBINFIOASYNCFIONREADFIOSETOWNFIOGETOWN设置/清除非阻塞I/O标志设置/清除信号驱动异步I/O标志获取接收缓存区中的字节数设置文件的进程ID或进程组ID获取文件的进程ID或进程组IDintintintintint接口SIOCGIFCONFSIOCSIFADDRSIOCGIFADDRSIOCSIFFLAGSS

24、IOCGIFFLAGSSIOCSIFDSTADDRSIOCGIFDSTADDRSIOCGIFBRDADDRSIOCSIFBRDADDRSIOCGIFNETMASKSIOCSIFNETMASKSIOCGIFMETRICSIOCSIFMETRICSIOCGIFMTUSIOCxxx获取所有接口的清单设置接口地址获取接口地址设置接口标志获取接口标志设置点到点地址获取点到点地址获取广播地址设置广播地址获取子网掩码设置子网掩码获取接口的测度设置接口的测度获取接口MTU(还有很多取决于系统的实现)struct ifconfstruct ifreqstruct ifreqstruct ifreqstruct

25、ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqARPSIOCSARPSIOCGARPSIOCDARP创建/修改ARP表项获取ARP表项删除ARP表项struct arpreqstruct arpreqstruct arpreq路由SIOCADDRTSIOCDELRT增加路径删除路径struct rtentrystruct rtentry流I_xxx套接口操作:明确用于套接口操作的ioctl请求有三个,它们都要求ioc

26、tl的第三个参数是指向某个整数的一个指针。SIOCATMARK:如果本套接口的的度指针当前位于带外标记,那就通过由第三个参数指向的整数返回一个非0值;否则返回一个0值。POSIX以函数sockatmark替换本请求。SIOCGPGRP:通过第三个参数指向的整数返回本套接口的进程ID或进程组ID,该ID指定针对本套接口的SIGIO或SIGURG信号的接收进程。本请求和fcntl的F_GETOWN命令等效,POSIX标准化的是fcntl函数。SIOCSPGRP:把本套接口的进程ID或者进程组ID设置成第三个参数指向的整数,该ID指定针对本套接口的SIGIO或SIGURG信号的接收进程,本请求和fc

27、ntl的F_SETOWN命令等效,POSIX标准化的是fcntl操作。文件操作:以下5个请求都要求ioctl的第三个参数指向一个整数。FIONBIO:根据ioctl的第三个参数指向一个0或非0值分别清除或设置本套接口的非阻塞标志。本请求和O_NONBLOCK文件状态标志等效,而该标志通过fcntl的F_SETFL命令清除或设置。FIOASYNC:根据iocl的第三个参数指向一个0值或非0值分别清除或设置针对本套接口的信号驱动异步I/O标志,它决定是否收取针对本套接口的异步I/O信号(SIGIO)。本请求和O_ASYNC文件状态标志等效,而该标志可以通过fcntl的F_SETFL命令清除或设置。

28、FIONREAD:通过由ioctl的第三个参数指向的整数返回当前在本套接口接收缓冲区中的字节数。本特性同样适用于文件,管道和终端。FIOSETOWN:对于套接口和SIOCSPGRP等效。FIOGETOWN:对于套接口和SIOCGPGRP等效。接口配置:得到系统中所有接口由SIOCGIFCONF请求完成,该请求使用ifconf结构,ifconf又使用ifreq结构,如下所示:Struct ifconf int ifc_len; /缓冲区的大小 union caddr_t ifcu_buf; / input from user-kernel struct ifreq *ifcu_req; / re

29、turn of structures returned ifc_ifcu;#define ifc_buf ifc_ifcu.ifcu_buf /buffer address#define ifc_req ifc_ifcu.ifcu_req /array of structures returned#define IFNAMSIZ 16struct ifreq char ifr_nameIFNAMSIZ; / interface name, e.g., “le0” union struct sockaddr ifru_addr; struct sockaddr ifru_dstaddr; str

30、uct sockaddr ifru_broadaddr; short ifru_flags; int ifru_metric; caddr_t ifru_data; ifr_ifru;#define ifr_addr ifr_ifru.ifru_addr / address#define ifr_dstaddr ifr_ifru.ifru_dstaddr / otner end of p-to-p link#define ifr_broadaddr ifr_ifru.ifru_broadaddr / broadcast address#define ifr_flags ifr_ifru.ifru_flags / flags#define ifr_metric ifr_ifru.ifru_metric / metric#define ifr_data ifr_ifru.ifru_data / for use by interface再调用ioctl前我们必须先分撇一个缓冲区和一个ifconf结构,然后才初

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论