VMIN和VTIME终端设置可变大小的消息

时间:2013-11-05 10:52:49

标签: c terminal serial-port

我正在尝试通过串口与设备连接。设备每700毫秒发送一次10 byte民意调查作为“心跳”。每当我读到心跳时,我都必须回复12 byte长的回复。

在此响应中,我可以请求设备在民意调查之间发送特定数据。不同请求的数据量不同。有没有办法设置串口,以便它总是读取一个块中的消息而不管它们的大小?

我当前的终端设置如下:

int ttySetRaw(int fd, struct termios *prevTermios)
{
    struct termios t;
    if (tcgetattr(fd, &t) == -1)
        return -1;

    if (prevTermios != NULL)
        *prevTermios = t;

    t.c_lflag &= ~(ICANON | ISIG | IEXTEN | ECHO);
    t.c_iflag &= ~(BRKINT | ICRNL | IGNBRK | IGNCR | INLCR | INPCK | ISTRIP | IXON | PARMRK);
    t.c_oflag &= ~OPOST; /* Disable all output processing */
    t.c_cc[VMIN] = 12; /* 12 chars at a time, enough for the poll and the reply to be sent/received in one chunk, when I change this I no longer receive the poll*/
    t.c_cc[VTIME] = 10; /* maximum timeout 1 second */

    t.c_cflag |= PARENB;
    t.c_cflag |= PARODD;

    if (tcsetattr(fd, TCSAFLUSH, &t) == -1)
       return -1;

    return 0;
}

我尝试过更改VMIN和VTIME,我认为设置VTIME = 7意味着它会读取缓冲区中的所有内容,直到700ms过去,但这会失败。当我希望设备在轮询间隔内发送另一个更长的消息时,这也是不够的。

是否有能够实现我想要的设置,或者我是否必须对子弹进行字节处理并一次读取一个字节的数据并在单独的函数中构建消息?

1 个答案:

答案 0 :(得分:2)

  

有没有办法设置串口,使其始终可读   一个块中的消息,无论其大小如何?

一般来说,没有。与TCP流一样,串行链路是字节流,没有大于一个字节的消息边界。

您需要一个允许从字节流中解析消息的协议。

也就是说,一些串行硬件和驱动程序允许发送和检测到“中断”信号,但我不知道有谁再使用该信号,即使可用。