poll函数和串口设置
2015.1.24
今天星期六,多云,早晨8:17起床的,今天是来南京起床最迟的一天,因为昨晚睡得有点迟,今天又不用上课,整个人有点放松。收拾好来到教室,教室门没有开,胡明
也到了,其他人还在宿舍睡觉,等了10分钟还没有人来开门,就决定出去逛逛,看看南京市有什么好玩的或者特别的。9点没到从鸿运大厦出门,回来的时候10点10分左右,走了
一个多小时,百度地图还是有点管用的,起码没有让我迷路。逛了一圈,以前觉得南京算是个大城市,应该比较繁华或者时尚之类的,但是现在完全没有这种感觉,想到以后
的工作,我就想:此地不宜久留。如果可以,我会选择不在南京工作,这里找不到归属感,貌似工资也不好。
因外买了过年回家的车票,对这边车站不熟,就决定今天下去去把车票取了,1:40左右走的,和张恒斌一起,来回公交车都是他刷的卡,到南京北站后发现车站挺小的,取完票就
出来了,因为根本不需要去熟悉他,太小了。出站后就问张恒斌,要不要再这边逛逛,他说:好啊,这边要去不就去桥上(南京长江大桥:全桥长4589米,公路桥长1600多米)嘛!,我对
到处逛还是比较有兴趣的,在杭州的时候就一个人在钱塘江复兴大桥上走了一个来回,那时候是晚上。走上桥后发现南京长江大桥挺长的,一咬牙继续走,就这样,我和张恒斌两个人
边走边聊,桥上风挺大的,走热了的时候我把衣服脱了,但是没一会就冷了。南京这边天气污染很严重,桥上灰蒙蒙的,桥下面有很多货船,拍了一些照片,记录了一下这段旅程。回到
宿舍4:10左右了,因为走了很长的路,所以感觉比较累,口也比较干燥,吃了个梨子后,在床上睡了会,起来的时候6点多了,清醒过后下楼吃晚饭,去排档叫了份红烧鲫鱼。有点奢侈
了,每天吃盖浇饭有点受不了,就这样,一天过去了,晚上就该学习了!
poll函数实现的IO多路复用!,结合昨天的select函数一起看,他们在这里实现的是相同的功能,但是poll函数效率更高!使用范围更广!
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <fcnt1.h>
#include <poll.h>
#define MAX_BUFFER_SIZE 1024
#define IN_FELES 3
#define TIME_DELAY 60
#define MAX(a, b) ((a > b) ? (a):(b))
int main(void)
{
struct pollfd fds[IN_FILES];
char buf[MAX_BUFFER_SIZE];
int i, res, real_read, maxfd;
/*首先按一定的权限打开另个源文件*/
fds[0].fd = 0;
if((fds[1].fd = open("in1",O_RDONLY | O_NONBLOCK)) < 0)
{
printf("open in1 error\n");
return 1;
}
if((fds[2].fd = open("in2",O_RDONLY | O_NONBLOCK)) < 0)
{
printf("open in2 error\n");
return 1;
}
for(i = 0; i < IN_FILES; i++)
{
fds[i].events = POLLIN;
}
/*循环测试该文件描述符是否准备就绪,并调用select函数对相关文件描述符做对应操作*/
while(fds[0].events || fds[1].events || fds[2].events)
{
if(poll(fds,IN_FILES,0) < 0)
{
printf("poll error\n");
return 1;
}
for(i = 0; i < IN_FILES; i++)
{
if(fds[i].revents)
{
memset(buf ,0, MAX_BUFFER_SIZE);
real_read = read(fds(fds[i].fd,buf,MAX_BUFFER_SIZE);
if(real_read < 0)
{
if(errno != EAGAIN)
{
return 1;
}
}
else if(!real_read)
{
close(fds[i].fd);
fds[i].events = 0;
}
else
{
if(i == 0)
{
if((buf[0] == 'q') || (buf[0] == 'Q'))
{
return 1;
}
}
else
{
buf[real_read] = '\0';
printf("%s,buf");
}
}
}
}
}
exit(0);
}
串口设置详解:
串口设置主要是设置struct termios结构体的各成员值:
#include <termios.h>
struct termios
{
unsigned short c_iflag; //输入模式标志
unsigned short c_oflag; 输出模式标志
unsigned short c_cflag; //控制模式标志
unsigned short c_lglag; 本地模式标志
unsigned char c_line; 线路规程
unsigned char c_cc[NCC]; //控制特性
speed_t c_ispeed; 输入速度
speed_t c_ospeed; 输出速度
}
不能对c_cflag成员初始化,而要将其通过“与”“或”操作使用其中的某些选项
输入模式标志c_iflag用于控制端口接收端的字符输入处理。
下面详细讲解设置串口属性的基本流程:
1.保存原先串口的配置:
if(tcgetattr(fd,&old_cfg) != 0)
{
perror("tvgetattr");
return -1;
}
2.激活选项:CLOCAL和CREAD分别用于本地连接和接受使能,用位掩码
newtio.c_cflag |= CLOCAL | CREAD;
调用dfmakeraw()函数将终端设置为原始模式
cfmakeraw(&new_cfg);
3.设置波特率;设置波特率有专门的函数,
cfsetispeed(&new_cfg,B115200);
cfsetospeed(&new_cfg,B115200);
一般的,用户需要将终端的输入和输出的波特率设置成一样的,这几个函数在成功时返回0,失败时返回-1.
4.设置字符大小,用位掩码:一般首先清除数据位中的位掩码再重新安要求设置
new_cfg.c_cflag &= ~CSIZE; 用数据位掩码清空数据位设置
new_cfg.c_cflag |= CS8;
5.设置奇偶校验位:首先激活c_cflag中的校验位使能标志PARENB和是否要进行偶校验,同时还要
激活c_iflag中的对于输入数据的奇偶校验使能INPCK;
new_cfg.c_cflag |= (PARODD | PARENB);
new_cfg.c_iflag |= INPCK;
使能偶校验时,代码如下:
new_cfg.c_cflag |= PARENB
new_cfg.c_cflag &= ~PARODD 清除偶校验标志,则配置为奇校验
new_cfg.c_iflag |= INPCK;
6.设置停止位
若停止位为一个,则清除CSTOPB,如停止位为两个,则激活CSTOPB.以下分别是停止位为一个和两个比特时的代码
new_cfg.c_cflag &= ~CSTOPB; 将停止位设置为一个比特
new_cfg.c_cflag |= CSTOPB; 将停止位设置为两个比特
7.设置最少字符和等待时间:
在对就收字符和字符时间没有特别要求的情况下,可以将其设置为0,则在任何情况下read()函数立即返回:
new_cfg.c_cc[VTIME] = 0;
new_cfg.c_cc[VMIN] = 0;
8.清除串口缓冲:
int tcdrain(int fd); 使程序阻塞,直到输出缓冲区的数据全部发送完毕
int tcflow(int fd,int action); 用于暂停或重新开始输出
int tcflush(int fd,int queue_selectot); 用于清空输入、输出缓冲区
9.激活配置
tcsetattr(int fd, int optional_actions, const struct termios *termios_p);
函数调用如下:
if((tcsetattr(fd,TCSANOW,&new_cfg)) != 0)
{
perror("tcsetattr");
return -1;
}
**********************************************************************************************************************************************************
**********************************************************************************************************************************************************
**********************************************************************************************************************************************************
poll函数和串口设置的更多相关文章
- linux poll函数
poll函数与select函数差不多 函数原型: #include <poll.h> int poll(struct pollfd fd[], nfds_t nfds, int timeo ...
- poll()函数的使用
分类: LINUX poll函数用于监测多个等待事件,若事件未发生,进程睡眠,放弃CPU控制权,若监测的任何一个事件发生,poll将唤醒睡眠的进程,并判断是什么等待事件发生,执行相应的操作.poll函 ...
- poll函数
poll函数与select函数的功能基本一样,其定义如下: #include <poll.h> int poll(struct pollfd fds[], nfds_t nfds, int ...
- Linux下打开串口设置
给出打开串口函数 int open_tty(char tty[]) { int fd; char tty_path[32]={0}; sprintf(tty_path,"/dev/%s&qu ...
- I/O多路复用——select函数与poll函数
1 区别 同:(1)机制类似,本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理.(2)包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就 ...
- Linux串口设置及编程(转)
用户常见的数据通信的基本方式可分为并行通信和串行通信. 并行通信是指利用多条数据传输线将一个资料的各位同时传送.特点是传输速度快,适用于短距离通信,但要求传输速度较高的应用场合. 串行通信是指利用一条 ...
- [转载] poll()函数
原地址:http://baike.baidu.com/view/2997591.htm poll()函数:这个函数是某些Unix系统提供的用于执行与select()函数同等功能的函数,下面是这个函 ...
- zedboard 中SDK 修改串口设置(波特率。。。。)
其实在zedboard SDK中不用初始化串口的也就是platform()可以不写 ,初始化在EDK导入SDK中就写好了 具体看bsp文件夹下面的汇编.但是如果我们想要在SDK中改变串口设置的话 ...
- I/O多路转接之poll 函数
poll 一.poll()函数: 这个函数是某些Unix系统提供的用于执行与select()函数同等功能的函数,自认为poll和select大同小异,下面是这个函数的声明: #include < ...
随机推荐
- soapUI快速入门(测试一个登录接口)
1.打开soapUI. 2.新建一个项目,实例如下: 点击ok后在soapUI界面左侧会显示出此项目,如图: 2.创建测试用例: a.新建用例组,选择此项目右键,新建一个用例组,如下图: 用例组创建好 ...
- Python环境的安装
参考官方文档 http://www.runoob.com/python/python-install.html Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上). 您需要下载适用 ...
- Objective-C:Foundation框架-常用类-NSValue
NSNumber是NSValue的子类,前者只能包装数字,后者可以包装任意值.NSArray.NSDictionary只能存储OC对象,不能存储结构体.因此,如果想要在NSArray.NSDictio ...
- 项目三(集团官网)——总结(1) cookie
最近十几天一直在忙着做集团官方网站的工作,从刚开始紧张的筹备一直到现在初步成型,今天才有时间特地来记录一下自己在这个项目中的收获. 先来说一说今天遇到的问题吧:关于cookie~ 事情起因是这样的:在 ...
- JVM优化之调整大内存分页(LargePage)
转自:http://cjjwzs.iteye.com/blog/1059381 本文将从内存分页的原理,如何调整分页大小两节内容,向你阐述LargePage对JVM的性能有何提升作用,并在文末点明了大 ...
- 所思所想 关于asp.net界面业务分离
1.体会:使用ASP.NET控件来做前段是有很大的局限性的 2.使用拼接HTML的方式来写代码虽然不符合模式,但是有很大的灵活性 3.如果使用拼接字符串的方式来生成前台的代码,使用NV的话完全可以实现 ...
- 如何在datagridview 的head上绘制一个全选按钮
winform的项目中,经常要用到datagridview控件,但是为控件添加DataGridViewCheckBoxColumn来实现数据行选择这个功能的时候,经常需要提供全选反选功能,如果不重绘控 ...
- VBA读取文件夹下所有文件夹及文件内容,并以树形结构展示
Const TR_LEVEL_MARK = "+"Const TR_COL_INDEX = "A"Const TR_COL_LEVEL = "E&qu ...
- 关于职位的解释---转CSDN的文章
摘要我在IT职场打滚超过15年了,从小小的程序员做到常务副总.相对于其它行业,IT职场应该算比较光明的了,但也陷阱重重,本文说说我的亲身体会,希望大家能在IT职场上战无不胜! 通用法则 法则1:忍耐是 ...
- Catalan数
先看2个问题: 问题一: n个元素进栈(栈无穷大),进栈顺序为1,2,3,....n,那么有多少种出栈顺序? 先从简单的入手:n=1,当然只有1种:n=2,可以是1,2 也可以是2,1:那么有2种: ...