当前位置:文档之家› 串口通信中用到的函数

串口通信中用到的函数

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_EXCL 如果O_CREAT 也被设置,此指令会去检查文件是否存在。

文件若不存在则建立该文件,否则将导致打开文件错误。

此外,若O_CREAT与O_EXCL同时设置,并且欲打开的文件为符号连接,则会打开文件失败。

O_NOCTTY 如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。

O_TRUNC 若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的资料也会消失。

O_APPEND 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。

O_NONBLOCK 以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即返回进程之中。

O_NDELAY 同O_NONBLOCK。

O_SYNC 以同步的方式打开文件。

O_NOFOLLOW 如果参数pathname 所指的文件为一符号连接,则会令打开文件失败。

O_DIRECTORY 如果参数pathname 所指的文件并非为一目录,则会令打开文件失败。

参数mode 组合此为Linux2.2以后特有的旗标,以避免一些系统安全问题。

参数mode 则有下列数种组合,只有在建立新文件时才会生效,此外真正建文件时的权限会受到umask值所影响,因此该文件权限应该为(mode-umaks)。

S_IRWXU 00700 权限,代表该文件所有者具有可读、可写及可执行的权限。

S_IRUSR 或S_IREAD, 00400权限,代表该文件所有者具有可读取的权限。

C语言中open函数作用:打开和创建文件。

int open(const char *pathname, int oflag, .../* mode_t mode */);返回值:成功则返回文件描述符,否则返回 -1 对于 open 函数来说,第三个参数(...)仅当创建新文件时(即使用了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,并且修改 errno 的值O_TRUNC 如果文件存在,并且以只写/读写方式打开,则清空文件全部容(即将其长度截短为0) O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。

O_NONBLOCK 如果路径名指向FIFO/块文件/字符文件,则把文件的打开和后继 I/O主题:ioctl函数详细说明ioctl 函数本函数影响由fd 参数引用的一个打开的文件。

#include<unistd.h>int ioctl( int fd, int request, .../* void *arg */ );返回0 :成功 -1 :出错第三个参数总是一个指针,但指针的类型依赖于request 参数。

我们可以把和网络相关的请求划分为6 类:套接口操作文件操作接口操作ARP 高速缓存操作路由表操作流系统下表列出了网络相关ioctl 请求的request 参数以及arg 地址必须指向的数据类型:类别Request说明数据类型套接口SIOCATMARKSIOCSPGRPSIOCGPGRP是否位于带外标记设置套接口的进程ID 或进程组ID获取套接口的进程ID 或进程组IDintintint文件FIONBINFIOASYNCFIONREADFIOSETOWNFIOGETOWN设置/ 清除非阻塞I/O 标志设置/ 清除信号驱动异步I/O 标志获取接收缓存区中的字节数设置文件的进程ID 或进程组ID获取文件的进程ID 或进程组IDintintintintint接口SIOCGIFCONFSIOCSIFADDRSIOCGIFADDRSIOCSIFFLAGSSIOCGIFFLAGSSIOCSIFDSTADDRSIOCGIFDSTADDRSIOCGIFBRDADDRSIOCSIFBRDADDRSIOCGIFNETMASKSIOCSIFNETMASKSIOCGIFMETRICSIOCSIFMETRICSIOCGIFMTUSIOCxxx获取所有接口的清单设置接口地址获取接口地址设置接口标志获取接口标志设置点到点地址获取点到点地址获取广播地址设置广播地址获取子网掩码设置子网掩码获取接口的测度设置接口的测度获取接口MTU(还有很多取决于系统的实现)struct ifconfstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqstruct ifreqARP SIOCSARPSIOCGARPSIOCDARP创建/ 修改ARP 表项获取ARP 表项删除ARP 表项struct arpreqstruct arpreqstruct arpreq路由SIOCADDRTSIOCDELRT增加路径删除路径structrtentrystructrtentry流I_xxx 套接口操作:明确用于套接口操作的ioctl 请求有三个, 它们都要求ioctl 的第三个参数是指向某个整数的一个指针。

SIOCATMARK: 如果本套接口的的度指针当前位于带外标记,那就通过由第三个参数指向的整数返回一个非0 值;否则返回一个0 值。

POSIX 以函数sockatmark 替换本请求。

SIOCGPGRP :通过第三个参数指向的整数返回本套接口的进程ID 或进程组ID ,该ID 指定针对本套接口的SIGIO 或SIGURG 信号的接收进程。

本请求和fcntl 的F_GETOWN 命令等效,POSIX 标准化的是fcntl 函数。

SIOCSPGRP :把本套接口的进程ID 或者进程组ID 设置成第三个参数指向的整数,该ID 指定针对本套接口的SIGIO 或SIGURG 信号的接收进程,本请求和fcntl 的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 命令清除或设置。

FIONREAD :通过由ioctl 的第三个参数指向的整数返回当前在本套接口接收缓冲区中的字节数。

本特性同样适用于文件,管道和终端。

FIOSETOWN :对于套接口和SIOCSPGRP 等效。

FIOGETOWN :对于套接口和SIOCGPGRP 等效。

接口配置:得到系统中所有接口由SIOCGIFCONF 请求完成,该请求使用ifconf 结构,ifconf 又使用ifreq结构,如下所示:Struct ifconf{int ifc_len; // 缓冲区的大小union{caddr_t ifcu_buf; // input from user->kernelstruct ifreq *ifcu_req; // return 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_name[IFNAMSIZ]; // interface name, e.g.,“le0”union{struct sockaddr ifru_addr; struct sockaddr ifru_dstaddr; struct 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 ofp-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 byinterface再调用ioctl 前我们必须先分撇一个缓冲区和一个ifconf 结构,然后才初始化后者。

如下图展示了一个ifconf 结构的初始化结构,其中缓冲区的大小为1024 ,ioctl 的第三个参数指向这样一个ifconf 结构。

相关主题