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