gpt4 book ai didi

Linux termios VTIME 不工作?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:01:54 25 4
gpt4 key购买 nike

我们整个上午都在为这个问题苦苦思索。我们在嵌入式 linux 设备和 Ubuntu 机器之间设置了一些串行线路。我们的读取被搞砸了,因为我们的代码通常返回两个(有时更多,有时恰好一个)消息读取,而不是每发送一个实际消息读取一个消息。

下面是打开串口的代码。 InterCharTime 设置为 4。

void COMClass::openPort()
{
struct termios tio;

this->fd = -1;

int tmpFD;

tempFD = open( port, O_RDWR | O_NOCTTY);
if (tempFD < 0)
{

cerr<< "the port is not opened"<< port <<"\n";
portOpen = 0;
return;
}


tio.c_cflag = BaudRate | CS8 | CLOCAL | CREAD ;
tio.c_oflag = 0;
tio.c_iflag = IGNPAR;
newtio.c_cc[VTIME] = InterCharTime;
newtio.c_cc[VMIN] = readBufferSize;
newtio.c_lflag = 0;

tcflush(tempFD, TCIFLUSH);
tcsetattr(tempFD,TCSANOW,&tio);

this->fd = tempFD;
portOpen = true;
}

另一端进行类似的通信配置,并有一小部分特定的 iterest:

while (1)
{
sprintf(out, "\r\nHello world %lu", ++ulCount);
puts(out);
WritePort((BYTE *)out, strlen(out)+1);
sleep(2);
} //while

现在,当我在接收机器上运行读取线程时,“hello world”通常被分成几条消息。这是一些示例输出:

1: Hello
2: world 1
3: Hello
4: world 2
5: Hello
6: world 3

其中数字后跟冒号是收到的一条消息。你能看到我们犯了什么错误吗?

谢谢。

编辑:为清楚起见,请查看section 3.2 of the Linux Serial Programming HOWTO .据我了解,如果 VTIME 为几秒(意味着 vtime 设置在 10 到 50 之间的任何位置,反复试验),VMIN 为 1,则消息没有理由被分解为两条单独的消息.

最佳答案

我不明白你为什么感到惊讶。

您要求至少一个字节。如果您的 read() 要求更多,这似乎很可能,因为您很惊讶您没有在一次读取中获得整个字符串,它可以获取任何可用的数据,直到 read() 大小。但并非所有数据都在一次读取中可用,因此您的字符串在读取之间被切碎。

在这种情况下,计时器并不重要。在至少有一个字节可用之前,不会设置定时器。但是您已将最小值设置为 1。因此它只返回可用字节数 (>= 1),最大为 read() 大小字节。

关于Linux termios VTIME 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1133352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com