Linux termios VTIME无法正常工作?

时间:2009-07-15 19:11:41

标签: linux serial-port device termios

我们整个上午一直在抨击这个。我们在嵌入式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;
}

另一端的配置类似于通信,并且有一小部分特定的迭代:

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,应该没有理由将消息分解为两个单独的消息

2 个答案:

答案 0 :(得分:3)

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

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

在这种情况下,计时器并不重要。在至少有一个字节可用之前,不会设置定时器。但是你已经将最小值设置为1.所以它只返回任意数量的字节(&gt; = 1),直到read()size bytes。

答案 1 :(得分:0)

如果您仍然遇到此问题(意识到问题已经过时),并且您的代码准确无误,那么您将在newtio结构中设置VTIME和VMIN,并在tio结构中设置其他参数{1}} struct。