当前位置:  技术问答>linux和unix

急!!串口接收程序占有大量CPU,各位帮忙,来者有分!!!

    来源: 互联网  发布时间:2015-02-06

    本文导语:  我编写了一个读串口的守护程序,即用了一个死循环一直读串口,有数据就处理, 可是占用了99%的CPU资源,下面是源代码,各位高手看看有什么办法可以减少占有的 CPU资源,并且能及时的读取串口的数据,很急!各...

我编写了一个读串口的守护程序,即用了一个死循环一直读串口,有数据就处理,
可是占用了99%的CPU资源,下面是源代码,各位高手看看有什么办法可以减少占有的
CPU资源,并且能及时的读取串口的数据,很急!各位高手帮忙啊,谢谢了
#include 
#include 
#include 
#include 
#include 
#include 

#define BAUDRATE B19200

open_port(void)
{
    int fd,speed;
    struct termios newtio;
    
    fd = open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY);
    if(fd==-1)
    {
        perror("open_port:Unable to open /dev/ttyS0");
    }

    
    tcgetattr(fd,&newtio); 

    bzero(&newtio,sizeof(newtio));
    //setting c_cflag
    newtio.c_cflag |= (CLOCAL|CREAD);
    newtio.c_cflag &=~PARENB;
    newtio.c_cflag &=~PARODD;
    newtio.c_cflag &=~CSTOPB;
    newtio.c_cflag &=~CSIZE; 
    newtio.c_cflag |=CS8;
    newtio.c_oflag|=OPOST;
    //setting c_iflag
    newtio.c_iflag &=~(IXON|IXOFF|IXANY);
        
    cfsetispeed(&newtio,BAUDRATE);
    cfsetospeed(&newtio,BAUDRATE);
    printf("speed=%dn",BAUDRATE);
    tcflush(fd, TCIFLUSH);
    tcsetattr(fd,TCSANOW,&newtio); 
    
    return(fd);
}

main()
{
    int fd,n,i;
    unsigned char buff[256];
    fd = open_port();
    while(1){
     n = read(fd,buff,256);
     if(n>0){
               //数据处理部分
    }
    }
    close(fd);
}

|
static            fd_set rfds;
static            struct timeval tv;
static            int retval;

unsigned char myread( int fd );

unsigned char
myread( int fd )
{
           FD_ZERO(&rfds);
           FD_SET(0, &rfds);
           tv.tv_sec = 0;
           tv.tv_usec = 0;

           retval = select(fd + 1, &rfds, NULL, NULL, &tv);

           if (retval)
               return read( fd .. );
}

|
main()
{
    int fd,n,i;
    unsigned char buff[256];
    fd = open_port();
    while(1){
     n = read(fd,buff,256);
     if(n>0){
               //数据处理部分
    }
usleep(1);  //中间加一行
    }
    close(fd);
}

cpu占用率将会是百分之零点几。

|
如果你想使用查询的方法的话, 就在循环里面加sleep, 但sleep(20)睡的
时间也太长了. :) usleep(0)就可以了。

如果你的程序是串口的守护进程, 不需要处理其它的并发输入的话, 还有一个
更简单的方法:

在你设置tty的时候, 加上: 
newtio.c_cc[VMIN] = 1;
newtio.c_cc[VTIME] = 0;
就可以了. 这样你在串口fd上的read会阻塞直到有数据可读...

问题: 
如果把newtio.c_cc[VMIN]设置为0的话,在这个fd上的select会不起作用! 
即使有数据进来都会超时. 郁闷! 



|
在循环里面加一个Sleep(20)
CPU全部被你独占了,你得释放

|
改用select系统调用,select的主要作用是监视一组描述符,如果某一被监视fd有数据可读(或可写、异常),则select返回,否则,调用select的进程会进入睡眠,不浪费CPU资源。
详细用法请:man 2 select

|
同意楼上的做法。如果串口没有数据时,阻塞,能够明显的较低cpu资源。
http://hackerbbs.uni.cc

|
select
建议你看一下《UNIX高级编程》一书的相关章节。

    
 
 

您可能感兴趣的文章:

  • 关于串口接收的问题,一直很疑惑……
  • 串口接收数据丢失,怀疑是中断引起的,请指教
  • linux下多串口卡接收数据不全
  • Linux 串口发送接收数据问题
  • 急,为什么串口接收一个0x0d的数据却显示为0x0A
  • linux 下清空串口发送接收缓冲区的函数.
  • 100分求linux下串口调试工具,要可以发送、接收十六进制
  • 串口接收丢失数据的问题
  • 求帮忙解决在linux下usb转为串口用来接收和发送数据给M0单板的一个问题 !!!!
  • linux串口无法接收数据(linunx新手求救)
  • 串口接收程序运行环境由windows改为linux后是否有大小端问题?
  • 由于问题变化了,所以重新个贴子,是关于线程间函数调用及串口接收数据的问题?
  • 浙ICP备11055608号-3 iis7站长之家
  • 串口接收数据有时会阻塞
  • linux和windows串口问题!?linux向windows端发送,第一次write正常,继续write,windows接收到的就变成乱码了,这是什么原因??????
  • 串口发送数据 网口接收数据 发送一个10个字节数组接收不到
  • sos,为什么我在虚拟机下用linux串口接收到的数据最高位为0?
  • 急!(ARM9开发板)select+read,串口一次无法读出一个完整的接收到的数据帧内容.
  • 急问!!!UART串口通信,可发送数据,不能接收数据
  • 『高分』如何实现串口发送数据同时处理接收数据(C/C++)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在windows中的VMware装了个linux,主板有两个串口,能做windows和linux的串口通信测试么,怎么测试这两个串口在linux是有效
  • linux下几个设备通过串口串行连接,如何协调各串口发送数据
  • 散分100,求解串口键盘和串口鼠标驱动
  • Linux 中用java语言写串口程序,提示找不到串口
  • 高分求助:我笔记本没有串口,在linux下要和一个串口设备连,怎么办?
  • 关于linux串口通信中写串口的问题
  • 开发板串口与实际内核中的串口文件的对应关系怎么回事?谢谢帮忙
  • 怎么判断串口已经收到数据,并及时读出?怎么判断串口已经将写入的数据发送完毕?
  • 工控机有6个串口,但用光盘安装debian6.05,在dev中只找到4个串口,如何解决。
  • linux下串口发送数据用串口精灵接受不到或为全零
  • 在虚拟Linux系统下能进行串口通讯吗?最好给个串口通讯的代码!谢谢!
  • 要加多个串口,怎么分别指定他们的driver_name和dev_name以示区别各个串口?
  • 工控机上用光盘安装debian6.05,硬件上有6个串口,但是软件上即dev中只有4个串口,如何解决。
  • 嵌入式linux,串口初始化时,无法设置串口属性
  • 扩展的串口卡上的串口操作的问题
  • 请教串口通信的编程
  • 请问如何以独占的方式打开串口
  • linux串口驱动该怎么写
  • 虚拟串口怎么读数据? 请有 串口 或者 usb 驱动经验的高手指点
  • linux下如何清空串口的输入输出缓存


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3