Вопрос

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

Теперь, когда я запускаю поток чтения на принимающей машине, «привет, мир» обычно разбивается на пару сообщений.Вот пример вывода:

1: Hello
2: world 1
3: Hello
4: world 2
5: Hello
6: world 3

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

Спасибо.

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

Это было полезно?

Решение

Я не понимаю, чему вы удивляетесь.

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top