首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux termios VTIME不工作?

Linux termios VTIME不工作?
EN

Stack Overflow用户
提问于 2009-07-15 19:11:41
回答 2查看 5.5K关注 0票数 1

我们整个上午都在为这件事努力工作。我们在嵌入式linux设备和Ubuntu设备之间设置了一些串行线。我们的读取被搞砸了,因为我们的代码通常返回两次(有时更多,有时恰好是一次)消息读取,而不是每发送一条实际消息就返回一次消息读取。

以下是打开串行端口的代码。InterCharTime设置为4。

代码语言:javascript
复制
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:

代码语言:javascript
复制
while (1)
{
    sprintf(out, "\r\nHello world %lu", ++ulCount);
    puts(out);
    WritePort((BYTE *)out, strlen(out)+1);
    sleep(2);
} //while

现在,当我在接收机上运行读线程时,"hello world“通常会被几条消息打断。以下是一些示例输出:

代码语言:javascript
复制
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,应该没有理由将消息分解为两个单独的消息。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-15 21:02:47

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

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

在这种情况下,计时器实际上并不重要。在至少有一个字节可用之前,不会设置计时器。但是您已经将最小值设置为1,所以它只返回可用于>= ()大小字节的任何字节数(Read 1)。

票数 3
EN

Stack Overflow用户

发布于 2012-04-25 11:50:30

如果您仍然遇到这个问题(意识到这个问题是旧的),并且您的代码是准确的,那么您将在newtio结构中设置VTIME和VMIN,并在tio结构中设置其他参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1133352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档