ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:24.61KB ,
资源ID:5851525      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5851525.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(串口通信中用到的函数.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

串口通信中用到的函数.docx

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 若欲打开的文件不存在则自动建立

2、该文件。 O_EXCL 如果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 权限,代表该文件所有者具有可读、可写及

4、可执行的权限。 S_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 如果要创建的文件已存在,则返回

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

8、d output)是 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(in

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

10、e结构进行相应的操作。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, voi

11、d *buf, 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

14、(fd,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

15、(send_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 *se

18、t);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变为000

19、1,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保存放到

20、select监控集中的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_s

21、ec;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)。可以简单地调用t

22、askDelay(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接口SIOCGIFCONFSIOCSIFADDRSIOCGIFADDRSIOCSIFFLAGSSIO

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

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

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

27、l的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命令清除或设置。FI

28、ONREAD:通过由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; / retu

29、rn 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; struct sockaddr ifru_broadaddr; short ifru_flags; int ifru_metric; caddr_t ifru_data; ifr_ifru;#defi

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1