Доброго времени суток.
Ваяем тут одну железяку с кучей СОМ-портов, работающую под линем. И для отладки драйверов и железа ваяю программу тестирования СОМ-портов. Чтобы не изобретать велосипед за основу была взята программа
linux-serial-test.
Эмпирическим путём мы поняли, что при передаче данных в порт, они записываются в промежуточный буфер, а от туда уже передаются в СОМ-порт (америку мы не открыли, просто открыли размер этого буфера). Оказалось, что он занимает 4 килобайта. Получается забавная вещь, что вызывая процедуру передачи данных, по готовности порта
пример кодаvoid process_write_data()
{
int count = 0;
unsigned char write_data[1024] = {0}; //буфер 1 килобайт
while (1) {
int i;
for (i = 0; i < sizeof(write_data); i++) { //заполняем буфер данными
write_data[i] = _write_count_value;
_write_count_value++;
}
int c = write(_fd, &write_data, sizeof(write_data));
if (c > 0) {
_write_count += c;
count += c;
}
if (c < sizeof(write_data)) { //проверяем всё ли передали?
_write_count_value -= sizeof(write_data) - c;
break; //да, всё, выходим из цикла
} else {
count += c;
}
}
}
Мы не можем быть уверенны в том, что данные передались. Фактически получается так, что система нам говорит о готовности передачи, мы укладываем туда данные, а фактически мы укладываем 4 килобайта внутреннего буффера, и данные ещё даже не начали передаваться.
Внимание вопросы: 1. Возможно ли изменить с помощью, например,
ioctl размер буфера записи/чтения (драйвер пока перепахивать не очень хочется)?
2. Есть ли возможность сделать более
real time передачу через СОМ-порт (со стороны user space и kernel space)?