我正在尝试通过串行端口与设备交互。设备每 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 意味着它将读取缓冲区中的所有内容,直到 700 毫秒过去,但这失败了。当我希望设备在轮询间隔内发送另一条更长的消息时,这也是不够的。
是否有能够实现我想要的设置,或者我将不得不逐个字节并一次读取一个字节的数据并在单独的函数中构建消息?