Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |  |  |  |
Стало быть read 0 у вас возвращает - т.е. данные не... 28.07.04 10:57 Число просмотров: 1556
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman Отредактировано 28.07.04 10:58 Количество правок: 1
|
> > case 0: // We have eof > > { > > // we need close port and reopen one? > > printf("eof\n"); > > ReopenSerial(); > > sleep(1); > > break; > > } > > > > case 1: // Reading success > > { > > .... > > кстати полл реально я не использую, я при инициализации > выставляю blockingio, так, что первый кейс я зря включил, > лишняя путаница.
Стало быть read 0 у вас возвращает - т.е. данные не считывает. И это не EOF вовсе. Просто выключено ожидание, было бы что-то - вернуло бы 1 и больше значение. Сейчас под рукой Линукса нет, если не забуду к завтрашнему дню притащу фрагмент. Точно плохо помню, хотя вы и сами сможете хелп по IO_CTL посмотреть. Смысл в том, что есть функция с дыумя аргументами: первый - что делать (получить или установить), второй - ссылка на структуру. В структуре будут интересовать максимум три поля: длина системного буфера (в вашем случае рекомендуется поставить 1), биттовое поле ожидания ввода (может оно вам и не нужно), еще какие-то хитрые байтовые элементы структуры.
|
|
<programming>
|
[Unix] чтение (read) из компорта (ttyS0) возвращает НОЛЬ! Что делать? 27.07.04 17:12
Автор: sergey Статус: Незарегистрированный пользователь
|
|
как то странно все это.
|
 |
Фрагмент кода, включая IO_CTL где? 27.07.04 17:26
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
|
|
|
 |  |
[Unix] Здесь 27.07.04 17:56
Автор: sergey Статус: Незарегистрированный пользователь
|
только тут больше кода, сначала я открываю ttyS0, инициализирую его, все нормально работает, потом ttyS0 юзается pppd, после чего я снова делаю открытие и инициализацию.......после этого при чтании возникают такие бяки......то, что pppd выставляет unblocking я уже просек, а как избавиться от EOF при чтении еще не вьехал....
readed = read(serial_fd,&buff[pos],1);
switch (readed)
{
case -1: // We have error
{
if (errno == EAGAIN)
{ // Non-blocking I/O has been selected using
// O_NONBLOCK and no data was immediately available for reading
printf("We have error EAGAIN\n");
sleep(1);
goto readagain; // just poll port
}
else
{
printf("Unknown error %d\n", errno);
sleep(1);
}
break;
}
case 0: // We have eof
{
// we need close port and reopen one?
printf("eof\n");
ReopenSerial();
sleep(1);
break;
}
case 1: // Reading success
{
....
|
 |  |  |
кстати полл реально я не использую, я при инициализации... 27.07.04 17:59
Автор: sergey Статус: Незарегистрированный пользователь
|
> только тут больше кода, сначала я открываю ttyS0, > инициализирую его, все нормально работает, потом ttyS0 > юзается pppd, после чего я снова делаю открытие и > инициализацию.......после этого при чтании возникают такие > бяки......то, что pppd выставляет unblocking я уже просек, > а как избавиться от EOF при чтении еще не вьехал.... > > > > readed = read(serial_fd,&buff[pos],1); > > > switch (readed) > { > case -1: // We have error > { > if (errno == EAGAIN) > { // Non-blocking I/O has been selected using > // O_NONBLOCK and no data was immediately > available for reading > printf("We have error EAGAIN\n"); > sleep(1); > goto readagain; // just poll port > } > else > { > printf("Unknown error %d\n", > errno); > sleep(1); > } > break; > } > > case 0: // We have eof > { > // we need close port and reopen one? > printf("eof\n"); > ReopenSerial(); > sleep(1); > break; > } > > case 1: // Reading success > { > ....
кстати полл реально я не использую, я при инициализации выставляю blockingio, так, что первый кейс я зря включил, лишняя путаница.
|
 |  |  |  |
Стало быть read 0 у вас возвращает - т.е. данные не... 28.07.04 10:57
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman Отредактировано 28.07.04 10:58 Количество правок: 1
|
> > case 0: // We have eof > > { > > // we need close port and reopen one? > > printf("eof\n"); > > ReopenSerial(); > > sleep(1); > > break; > > } > > > > case 1: // Reading success > > { > > .... > > кстати полл реально я не использую, я при инициализации > выставляю blockingio, так, что первый кейс я зря включил, > лишняя путаница.
Стало быть read 0 у вас возвращает - т.е. данные не считывает. И это не EOF вовсе. Просто выключено ожидание, было бы что-то - вернуло бы 1 и больше значение. Сейчас под рукой Линукса нет, если не забуду к завтрашнему дню притащу фрагмент. Точно плохо помню, хотя вы и сами сможете хелп по IO_CTL посмотреть. Смысл в том, что есть функция с дыумя аргументами: первый - что делать (получить или установить), второй - ссылка на структуру. В структуре будут интересовать максимум три поля: длина системного буфера (в вашем случае рекомендуется поставить 1), биттовое поле ожидания ввода (может оно вам и не нужно), еще какие-то хитрые байтовые элементы структуры.
|
 |  |  |  |  |
огромное спасибо, я допер, =)) 28.07.04 11:58
Автор: sergey Статус: Незарегистрированный пользователь
|
огромное спасибо, я допер, =))
еще и с_сс[V_MIN] (minimum number of characters to read) гребаный pppd выставляет ноль!
|
|
|