精华内容
下载资源
问答
  • linux串口超时时间设置

    千次阅读 2017-02-08 17:30:56
    ... 那么可能需要关注的是VMIN和VTIME这两个选项。 VMIN 最少读取字符数 VTIME 超时时间 (100ms最小单位) 这两个参数只有当设置为阻塞模式时才有效,有以下几种可能值: 1 VMIN> 0 && VTIME>

    comport[port].opt.c_cc[VTIME] = 0;
    comport[port].opt.c_cc[VMIN] = 0;
    那么可能需要关注的是VMIN和VTIME这两个选项。
    VMIN 最少读取字符数
    VTIME 超时时间 (100ms最小单位)
    这两个参数只有当设置为阻塞模式时才有效,有以下几种可能值:
    1 VMIN> 0 && VTIME> 0
    VMIN为最少读取的字符数,当读取到一个字符后,会启动一个定时器,在定时器超时事前,如果已经读取到了VMIN个字符,则read返回VMIN个字符。如果在接收到VMIN个字符之前,定时器已经超时,则read返回已读取到的字符,注意这个定时器会在每次读取到一个字符后重新启用,即重新开始计时,而且是读取到第一个字节后才启用,也就是说超时的情况下,至少读取到一个字节数据。
    2 VMIN > 0 && VTIME== 0
    在只有读取到VMIN个字符时,read才返回,可能造成read被永久阻塞。
    3 VMIN == 0 && VTIME> 0
    和第一种情况稍有不同,在接收到一个字节时或者定时器超时时,read返回。如果是超时这种情况,read返回值是0。
    4 VMIN == 0 && VTIME== 0
    这种情况下read总是立即就返回,即不会被阻塞。

    展开全文
  • Linux串口中的超时设置

    千次阅读 2017-11-03 14:31:04
    Linux串口中的超时设置

    在Linux下使用串口通信时,默认的阻塞模式是不实用的。而采用select或epoll机制的非阻塞模式,写代码有比较麻烦。幸好Linux的串口自己就带有超时机制。

    Linux下使用termios.h中的的接口进行串口设置。

    使用termios.h的接口进行超时设置,主要是配置 VTIME 和 VMIN 两个字段。其中VTIME指定了等待的时间(timeout=VTIME*100ms),VMIN指定了读取字符的最小数量。

    注意要使这两个字段生效,必须使串口工作于非标准模式。

    可以通过如下方式设置为RAW模式(非标准模式的一种,多用于通信):/* struct termio newtio; */

    newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/

    newtio.c_oflag &= ~OPOST; /*Output*/

    VTIME和VMIN需配合使用,它们的组合关系如下:

    1、VTIME=0,VMIN=0:此时即使读取不到任何数据,函数read也会返回,返回值是0。

    2、VTIME=0,VMIN>0:read调用一直阻塞,直到读到VMIN个字符后立即返回。

    3、VTIME>0,VMIN=0:read调用读到数据则立即返回,否则将为每个字符最多等待 VTIME*100ms 时间。

    4、VTIME>0,VMIN>0:read调用将保持阻塞直到读取到第一个字符,读到了第一个字符之后开始计时,此后若时间到了 VTIME*100ms 或者时间未到但已读够了VMIN个字符则会返回。

    若在时间未到之前又读到了一个字符(但此时读到的总数仍不够VMIN)则计时重新开始(即每个字符都有VTIME*100ms的超时时间)。

    展开全文
  • 在实际对串口设备操作时,一般都需要超时read,关于read的第三个参数意义总是忘记。 1:open /dev/ttySP0 获取fd 2:write(fd,***,)向fd写数据 3:fd返回响应数据,并使用select+read进行超时读取未知、...

    在实际对串口设备操作时,一般都需要超时read,关于read的第三个参数意义总是忘记。

     

    1:open /dev/ttySP0 获取fd

     

    2:write(fd,***,)向fd写数据

     

    3:fd返回响应数据,并使用select+read进行超时读取未知、不定长度的数据:

    read函数参数有三:int fd,char * p,int nbyte,前两个好理解,

    最后一个nbyte指:如果缓存中有大于nbyte个数据那么只返回nbyte个数据,剩余的数据下次再去读时才能读到,

    如果缓存中只有少于nbyte个数据,那么这时就要配合打开串口时的一个配置参数“options.c_cc[VTIME] ” 来看了,不足nbyte个时,串口驱动只会等待options.c_cc[VTIME](单位百毫秒)这么长时间,到时间通知read同样返回,并且读取少于nbyte的实际数量的数据,而不会去等到select的超时,才返回,这么看来,串口配置也是自带的似乎是"硬超时"。

     

    //read样例

    //

    int serial_read(int fd,char * p,int desire_get_len,int time_out_ms)
    {
        int nfds;
        int nread = 0 ;
        char read_temp[256];
        fd_set readfds;
        struct timeval tv;

        tv.tv_sec = time_out_ms/1000;
        tv.tv_usec = time_out_ms%1000;
        FD_ZERO(&readfds);
        FD_SET(fd,&readfds);
        bzero(read_temp,sizeof(read_temp));
        nfds = select(fd+1,&readfds,NULL,NULL,&tv);

        if(nfds == 0) 
        {
            printf("timeout!\r\n");
            return 0;
        }
        else
        {
            nread = read(fd,read_temp,desire_get_len);//即使不满desire_get_len,也会返回实际读取到的数据量
            if(nread<=0)
            {
                printf("read get problem!\r\n");
            }
        }
        memcpy(p,read_temp,nread);
        return nread;  
    }

    ///

    //

    //串口配置样例

    int usart_ttyS0_init(char * uart_name,char * uart_rate)
    {
        int fd1=0;


        struct termios options;    //usart par struct
        fd1 = open(uart_name, O_RDWR|O_NOCTTY);
        //printf("open result is %d\n",fd1);
        //logmsg(INFO_NAME,"open result is %d\r\n",fd1);


        tcgetattr(fd1, &options);        //获取opt指针。

        cfsetispeed(&options, B9600);    //set bps in
        cfsetospeed(&options, B9600);    //set bps out
      
        options.c_cflag |= (CLOCAL | CREAD);    //enable date receiver
        options.c_cflag &= ~PARENB;      //没有校验
        options.c_cflag &= ~CRTSCTS;     //没有数据流
        options.c_cflag &= ~CSTOPB;   //关闭两位停止位,就是一位停止位
        options.c_cflag &= ~CSIZE;    //设置数据位宽时打开掩码
        options.c_cflag |= CS8;       //8位数据位


        //关闭ICRNL IXON 防止0x0d 0x11 0x13的过滤
        options.c_iflag &=~(IXON | IXOFF | IXANY); 
        options.c_iflag &= ~ (INLCR | ICRNL | IGNCR);
        options.c_oflag &= ~(ONLCR | OCRNL);
        options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);    
        //options.c_oflag &= ~OPOST;term.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);


        //options.c_oflag  &= ~OPOST;
        options.c_oflag &= ~OPOST;   //使用原始数据


         //只有阻塞时,下面两个才有效,且针对读。
        options.c_cc[VMIN]  = 50;  //最小字节数(读)   4800  50  5     这个傻意思忘记了
        options.c_cc[VTIME] = 5;     //等待时间,单位百毫秒(读)  115200 50 1


        tcsetattr(fd1, TCSANOW, &options); //写入options


        return fd1;
    }

    /

     

     

    展开全文
  • //Linux3.2.0之后版本select的超时参数会被更新,其余平台请注意该用法是否适用 while (1) { ret = select(fd+1, &rset, NULL, NULL, timeout); if (ret ) { if (errno == EINTR) continue; else return(-1); } if ...
    /*--01--*//*--02--*//*--03--*//*--04--*//*--05--*//*--06--*//*--07--*//*--08--*/
    /*******************************************************************************
     *@文件名:
     *@描  述:
     *@版  本:
     *@平  台:
     *@作  者:
     *@记  录:
    *******************************************************************************/
    
    /* Includes ------------------------------------------------------------------*/
    #include <serial_port.h>
    #include <stdint.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <errno.h>
    
    /* Private macro -------------------------------------------------------------*/
    
    /* Public fuctions -----------------------------------------------------------*/
    
    /* Private functions ---------------------------------------------------------*/
    static int interface_open(const char *port, speed_t baudrate);
    static int interface_read(int fd, void *vptr, size_t n, struct timeval *timeout);
    
    /* Private typedef -----------------------------------------------------------*/
    
    /* External variables --------------------------------------------------------*/
    
    /* Public variables ----------------------------------------------------------*/
    struct SerialPort_Interface SerialPort = {
        .open = interface_open,
        .read = interface_read,
    };
    
    /* Private variables ---------------------------------------------------------*/
    
    /* Private function prototypes -----------------------------------------------*/
    /*******************************************************************************
    *@功    能:
    *@备    注:
    *******************************************************************************/
    static int interface_open(const char *port, speed_t baudrate)
    {
        int fd;
        struct termios options;
    
        fd = open(port, O_RDWR|O_NOCTTY|O_NDELAY);
    
        if (fd == -1) {
            printf("can't open %s", port);
            return -1;
        }
    
        tcgetattr(fd, &options);
    
        cfsetispeed(&options, baudrate);
        cfsetospeed(&options, baudrate);
        options.c_cflag |= CLOCAL | CREAD;
        options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
        options.c_oflag &= ~OPOST;
        options.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP);
        options.c_iflag &= ~(IXON | IXOFF | IXANY);
    
        if (tcsetattr(fd, TCSANOW, &options) != 0) {
            printf("%s tcsetattr failed\n", port);
            close(fd);
            return -1;
        }
    
        return fd;
    }
    
    /*******************************************************************************
    *@功    能:
    *@备    注:
    *******************************************************************************/
    static int interface_read(int fd, void *vptr, size_t n, struct timeval *timeout)
    {
        int     ret;
        fd_set  rset;
    	char	*ptr;
    	size_t	nleft;
    	ssize_t	nread;
    
        FD_ZERO(&rset);
        FD_SET(fd, &rset);
    
    	ptr = (char *)vptr;
    	nleft = n;
        //Linux3.2.0之后版本select的超时参数会被更新,其余平台请注意该用法是否适用
        while (1) {
            ret = select(fd+1, &rset, NULL, NULL, timeout);
    
            if (ret <= 0) {
                if (errno == EINTR)
                    continue;
                else
                    return(-1);
            }
    
            if (FD_ISSET(fd, &rset)) {
                if ((nread = read(fd, ptr, nleft)) < 0)
                    continue;
                nleft -= nread;
                ptr   += nread;
                if (nleft > 0)
                    continue;
                else
                    return(0);
            }
    
            continue;
        }
    }
    
    /*******************************************************************************
    * End Of File         
    *******************************************************************************/
    
    /*--01--*//*--02--*//*--03--*//*--04--*//*--05--*//*--06--*//*--07--*//*--08--*/
    /*******************************************************************************
     *@文件名:
     *@描  述:
     *@版  本:
     *@平  台:
     *@作  者:
     *@记  录:
    *******************************************************************************/
    
    /* Define to prevent recursive inclusion -------------------------------------*/
    #ifndef __SERIAL_PORT_H
    #define __SERIAL_PORT_H
    
    /* Includes ------------------------------------------------------------------*/
    #include <termio.h>
    #include <stdlib.h>
    
    /* Macro ---------------------------------------------------------------------*/
    
    /* Exported types ------------------------------------------------------------*/
    struct SerialPort_Interface {
        int (*open)(const char *port, speed_t baudrate);
        int (*read)(int fd, void *vptr, size_t n, struct timeval *timeout);
    };
    
    /* Public variables ----------------------------------------------------------*/
    extern struct SerialPort_Interface SerialPort;
    
    /* Exported functions --------------------------------------------------------*/
    /* IO operation functions *****************************************************/
    
    
    #endif
    
    /*******************************************************************************
    * End Of File         
    *******************************************************************************/
    

     

    展开全文
  • linux 串口读写程序

    2009-07-14 14:38:44
    linux 串口读写程序,保证可用,非常方便,有超时退出功能
  • linuxtty串口serial 众所周知,在Linux系统下所有设备都是以文件的形式存在,串口也一样。 通常I/O操作都是有阻塞与非阻塞的两种方式。 其中"超时"这个概念其实是阻塞中的一种处理手段,本质还是属于阻塞...
  • 问题:我这边连续发送多帧数据时,window串口总是会报告读超时?下面是我写的串口代码麻烦各位高手帮忙看看,谢谢!特别是在清空缓冲区,到底是个什么顺序比较合理。 COMMTIMEOUTS TimeOuts; //超时参数设置 //...
  • linux串口命令行调试

    2020-12-09 10:25:53
    -t 超时退出时间 ,不加-t就是一直等待接收 例如: 1.将arm机器的串口1接电脑 , 电脑开个串口工具设置波特率115200 2.busybox microcom -s 115200 /dev/ttyS1 3.pc串口工具发送“123456” , arm显示收到123456 4....
  • linux串口数据读取方法

    千次阅读 2012-06-26 16:11:32
    linux串口数据读取方法  | Linux下的串口操作说简单也简单,说复杂也复杂。简单在于其读写调用与文件操作一致,使用方便。但是参数设置相对复杂,而且在一些操作上需要注意技巧。 在串口...
  • linux系统下串口数据接收一帧,采用select接收,超时检测,为保证准确性发送间隔必须大于20ms(数据量越大间隔必须越大),实测没发现问题,如发现问题欢迎交流指正
  • 基于linux ,使用select检测串口句柄事件,同时进行超时判断的串口485读写操作。为高效可控的linux串口操作例程。tcsetattr,tcflush,select,ioctl,gettimeofday。485收发方向切换。
  • Linux串口配置

    2010-04-01 15:19:00
    串口配置时一些重要且应注意的事项: 除了一般的波特率、数据位、校验位、停止位、超时配置外,还有一些配置也是很重要的,否则有可能出错丢码或者不正常的现象,在此做一份记录;本人测试过的正常代码实例://打开...
  • 众所周知,在Linux系统下所有设备都是以文件的形式存在,串口也一样。 通常I/O操作都是有阻塞与非阻塞的两种方式。 其中"超时"这个概念其实是阻塞中的一种处理手段,本质还是属于阻塞的I/O模式. 在Linux串口...
  • 串口设置超时

    千次阅读 2015-05-20 23:03:59
    通常I/O操作都是有阻塞与非阻塞的两种方式。...其中"超时"这个概念其实是阻塞中的...在Linux串口的IO操作 本文将它分为三种状态: 阻塞状态 超时状态 非阻塞状态 这三种状态的转换组合有这么几种:
  • /* Linux 串口调试软件,UNIX环境串口调试软件 支持设置串口特征字、波特率和奇偶校验位,支持输入报文和拷贝报文进行发送, 发送后等待接收,直到10超时;支持接收模式,一直接收和打印报文 */ #include<...
  • Linux 虚拟机启动时,通过串口输出或者启动日志, 观察到超时的报错.导致虚拟机无法正常启动和连接.

空空如也

空空如也

1 2 3 4 5 6
收藏数 106
精华内容 42
关键字:

linux串口超时

linux 订阅