Linux termios VTIME не работает? - PullRequest
1 голос
/ 15 июля 2009

Мы все утро ломали голову над этим. У нас есть несколько последовательных линий между встроенным устройством 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

где число, за которым следует двоеточие, - это одно полученное сообщение. Вы видите какую-либо ошибку, которую мы делаем?

Спасибо.

Edit: Для ясности, пожалуйста, смотрите раздел 3.2 HOWTO по последовательному программированию в Linux . Насколько я понимаю, с VTIME в пару секунд (то есть vtime установлен где-то между 10 и 50, методом проб и ошибок) и VMIN 1, не должно быть никаких причин, по которым сообщение разбивается на два отдельных сообщения .

Ответы [ 2 ]

3 голосов
/ 16 июля 2009

Не понимаю, почему вы удивлены.

Вы запрашиваете хотя бы один байт. Если ваш read () запрашивает больше, что кажется вероятным, поскольку вы удивляетесь, что не получаете всю строку за одно чтение, он может получить любые доступные данные вплоть до размера read (). Но все данные недоступны при одном чтении, поэтому ваша строка прерывается между чтениями.

В этом случае таймер не имеет значения. Таймер не будет установлен, пока не будет доступен хотя бы один байт. Но вы установили минимум на 1. Таким образом, он просто возвращает любое количество байтов (> = 1), доступное для байтов размера read ().

0 голосов
/ 25 апреля 2012

Если вы все еще испытываете эту проблему (понимаете, что вопрос устарел), и ваш код точен, вы устанавливаете свои VTIME и VMIN в структуре newtio, а остальные остальные параметры в tio структура.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...