Тема, конечно, старая, но задача у меня подобная.
Имется система КПДА.10964-01. Необходимо работать с RS485 портом, у которого нет аппаратного RTS, поэтому приходится его программно устанавливать и снимать. На данный момент код отправки данных в порт выглядит следующим образом:
Отрывок кода инициализации порта:
rsopt.c_cflag &= ~(CSIZE | IHFLOW | OHFLOW);
rsopt.c_cflag &= ~(PARENB | CSTOPB);
rsopt.c_cflag |= CS8 | CLOCAL | CREAD;
cfsetispeed(&rsopt, B115200);
cfsetospeed(&rsopt, B115200);
Отрывок кода записи в порт:
tcflush(fd, TCIOFLUSH);
/* Let's turn ON RTS now. */
int data = _CTL_RTS_CHG | _CTL_RTS;
devctl(fd, DCMD_CHR_SERCTL, &data, sizeof(data), NULL);
if(write(fd, buf, size) == -1)
return 1;
else {
const double us = (double)(8 * size * 1000000L) / (double)93333; //количество мкс, необходимых для отправки size байт данных при скорости 115200
usleep(us + 75); //накинем ещё немного навсяк
/* Let's turn OFF RTS now. */
data = _CTL_RTS_CHG | 0;
devctl(fd, DCMD_CHR_SERCTL, &data, sizeof(data), NULL);;
return 0; //Success
}
На 99% всё работает нормально, однако при последующем приёме данных первый и последний байт принятых данных равны 0. То есть считывается обычно на 2 байта больше, чем было отправлено другой стороной.
93333 - скорость в бит/с, которая была вычислена экспериментально по осциллографу. Хотя длительность одного бита по тому же осциллографу соответствует скорости 115200.
Может есть какое-то более грамотное и надёжное решение?