代码之家  ›  专栏  ›  技术社区  ›  San Jacinto

Linux termios vtime不工作?

  •  1
  • San Jacinto  · 技术社区  · 15 年前

    我们整个上午都在为这件事绞尽脑汁。我们在嵌入式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,不应该有任何理由将消息分成两条单独的消息。

    2 回复  |  直到 12 年前
        1
  •  3
  •   Newton Falls    15 年前

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

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

    在这种情况下,计时器并不重要。只有在至少一个字节可用时才能设置计时器。但你把最小值设为1。所以它只返回可用于read()大小字节的字节数(>=1)。

        2
  •  0
  •   Ingo Karkat    12 年前

    如果您仍然遇到此问题(意识到问题是旧的),并且您的代码是准确的,那么您将在 newtio 结构,以及 tio 结构。

    推荐文章