Linux的termios的VTIME不工作?
-
16-09-2019 - |
题
我们上午都抨击我们的头颅这一个。我们有一个嵌入式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
现在,当我在接收计算机上运行的读出线程,“世界你好”,通常打散在几个消息。下面是一些示例输出:
1: Hello
2: world 1
3: Hello
4: world 2
5: Hello
6: world 3
其中数后面跟着冒号是收到一个消息。你可以看到,我们正在任何错误?
感谢您。
编辑: 为了清楚起见,请查看 Linux的串行编程的第3.2节HOWTO 。我的理解,与一对夫妇秒VTIME(意味着VTIME设置10和50,试验和错误之间的任何位置),和1:1的VMIN,应该没有理由该消息是在两个分离的消息打破
解决方案
我不明白为什么你感到吃惊。
您所要求的至少一个字节。如果你的阅读()被要求更多,这似乎是可能的,因为你很惊讶你没有得到整个字符串在一个单一的读取,它可以得到任何数据可直到读()的大小。但是,这样你的字符串斩读取之间的所有数据不是在一个单一的读取可用的。
在这种情况下,定时器其实并不重要。定时器将不会设置直到至少一个字节可用。但已设置的最小为1。因此,它只是返回的字节的任何数字(> = 1),提供最高达读()的大小的字节。
其他提示
如果您仍然遇到这个问题(实现的问题是旧的),你的代码是准确的,你设置你的VTIME和VMIN在newtio
结构,并在tio
结构中的其他参数的其余部分。
不隶属于 StackOverflow