首页 文章

Linux串口问题

提问于
浏览
1

我正在编写代码,通过linux中的串口与另一台设备进行通信

即使0个字符到达,我希望非阻塞超时 . termios结构允许您设置VTIME和VMIN,但如果VMIN大于0,并且如果返回0个字符,则读取调用将永远阻止... WTF,为什么 . 这似乎不包括其他设备在短时间内停机的情况,现在我的应用程序在读取呼叫时被阻止 . 这似乎是一种忽视的批判行为 . 我真的不想实现自己的超时 .

Write command
Read block timeout of around .3s(if 0 characters, still wait max of .3s)

2 回答

  • 1

    看看 select . 它等待数据准备好读取(但实际上没有读取任何内容) . 来自man page

    timeout是select()返回之前经过的时间量的上限 . 它可能为零,导致select()立即返回 . (这对于轮询非常有用 . )如果timeout为NULL(无超时),则select()可以无限期地阻塞 .

    代码看起来像:

    struct timeval tv;
    tv.tv_sec = 0;
    tv.tv_usec = 300000;
    
    fd_set infds;
    FD_ZERO(&infds);
    FD_SET(fd, &infds);
    
    // Assume fd is the file descriptor for the serial device
    if (select(fd + 1, &infds, NULL, NULL, &tv) > 0)
    {
        // The read will not block now
        // Assume buffer and size are declared and set appropriately
        amountRead = read(fd, buffer, size);
    }
    
  • 2

    如果希望 read 在超时后没有数据返回,则可以设置 MIN == 0TIME > 0 . 来自 tcsetattr(3)

    MIN == 0; TIME> 0:TIME指定计时器的限制,以十分之一秒为单位 . 调用read(2)时启动定时器 . read(2)返回当至少一个字节的数据可用时,或者当计时器到期时 . 如果计时器到期而没有任何输入变为可用,则read(2)返回0 .

    此模式可用于构建更高级别的通信功能,无论如何必须实现这些功能以处理部分读取(即,如果另一端在"packet"中间崩溃),错误的数据包,拆分数据包等等 . 这就是简单的 read 无法为你做的所有事情 .

相关问题