LINUX.ORG.RU

Особенности работы с ttyS*-attached device.


0

0

Добрый день.

Есть некая железка. Работает через serial. и некая прога от производителя, но в исходниках. Собирается, но при попытке запуска не работает: error opening device: Resource temporarily unavailable

Согласно strace, она открывает /dev/ttyS0 (успешно), после чего....

open("/dev/ttyS0", O_RDWR|O_NONBLOCK) = 3
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_START or TCSETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_START or TCSETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
read(3, 0xbffff8b7, 1) = -1 EAGAIN (Resource temporarily unavailable)
select(4, [3], NULL, NULL, {0, 200000}) = 1 (in [3], left {0, 198000})
read(3, "\0", 1) = 1
read(3, 0xbffff877, 1) = -1 EAGAIN (Resource temporarily unavailable)
write(3, "\7", 1) = 1
read(3, 0xbffff877, 1) = -1 EAGAIN (Resource temporarily unavailable)
select(4, [3], NULL, NULL, {0, 200000}) = 0 (Timeout)
read(3, 0xbffff857, 1) = -1 EAGAIN (Resource temporarily unavailable)
write(3, "\0", 1) = 1
read(3, 0xbffff857, 1) = -1 EAGAIN (Resource temporarily unavailable)

С железкой точно все нормально. Под 98 вендой ее вроде завели, но нас 98 не устраивает... Железка -- широкополосный радиосканер WR-1550e

Этот фрагмент меня особенно смущает:
select(4, [3], NULL, NULL, {0, 200000}) = 1 (in [3], left {0, 198000})
read(3, "\0", 1) = 1
read(3, 0xbffff877, 1) = -1 EAGAIN (Resource temporarily unavailable)

Селект говорит, что там есть что читать. И в /dev/null читается. А в буфер -- нет.

Где может быть собака зарыта?

★★☆☆

Чё тебя смущает??

Всё нормально работает

>Этот фрагмент меня особенно смущает:

>select(4, [3], NULL, NULL, {0, 200000}) = 1 (in [3], left {0, 198000})

>read(3, "\0", 1) = 1

>read(3, 0xbffff877, 1) = -1 EAGAIN (Resource temporarily unavailable)

select вывалился по первому принятому байту который был прочитан первым read второму read ничего не осталось следственно он вернул EAGAIN.

усли прога сама не настраивает порт то можешь настроить его вручную при помощи setserial а именно необходимо установить время ожидания прихода байта.

cvv ★★★★★
()
Ответ на: комментарий от cvv

Устройство же пытается настроить порт, причем засем-то делает это два раза - сначала под 38400 бод, потом под 9600 (автонастройка какая-то происходит?). Похоже, что действительно компьютеру с девайсом договориться не удалось.

geekkoo
()
Ответ на: комментарий от geekkoo

Хм. Подозрение на железо? Со стороны сканера или компа?

Zulu ★★☆☆
() автор топика
Ответ на: комментарий от geekkoo

>Устройство же пытается настроить порт, причем засем-то делает это два раза - сначала под 38400 бод, потом под 9600 (автонастройка какая-то происходит?). >Похоже, что действительно компьютеру с девайсом договориться не удалось.

хм действительно.

cvv ★★★★★
()

Что интересно, на машине с 2.4.27 все выглядит несколько иначе... Ни одного успешного read'а нет вообще:

open("/dev/ttyS0", O_RDWR|O_NONBLOCK) = 3
ioctl(3, SNDCTL_TMR_TIMEBASE, {B38400 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_START, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_START, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE, {B9600 -opost -isig -icanon -echo ...}) = 0
read(3, 0xbffff9fb, 1) = -1 EAGAIN (Resource temporarily unavailable)
select(4, [3], NULL, NULL, {0, 200000}) = 0 (Timeout)
read(3, 0xbffff9bb, 1) = -1 EAGAIN (Resource temporarily unavailable)
write(3, "\7", 1) = 1
read(3, 0xbffff9bb, 1) = -1 EAGAIN (Resource temporarily unavailable)
select(4, [3], NULL, NULL, {0, 200000}) = 0 (Timeout)
read(3, 0xbffff99b, 1) = -1 EAGAIN (Resource temporarily unavailable)
write(3, "\0", 1) = 1
read(3, 0xbffff99b, 1) = -1 EAGAIN (Resource temporarily unavailable)
select(4, [3], NULL, NULL, {0, 200000}) = 0 (Timeout)
read(3, 0xbffff98b, 1) = -1 EAGAIN (Resource temporarily unavailable)
write(3, "\0", 1) = 1
read(3, 0xbffff98b, 1) = -1 EAGAIN (Resource temporarily unavailable)
select(4, [3], NULL, NULL, {0, 200000}) = 0 (Timeout)
read(3, 0xbffff99b, 1) = -1 EAGAIN (Resource temporarily unavailable)
write(3, "\0", 1) = 1
read(3, 0xbffff99b, 1) = -1 EAGAIN (Resource temporarily unavailable)
select(4, [3], NULL, NULL, {0, 200000}) = 0 (Timeout)
read(3, 0xbffff98b, 1) = -1 EAGAIN (Resource temporarily unavailable)
write(3, "\0", 1) = 1
read(3, 0xbffff98b, 1) = -1 EAGAIN (Resource temporarily unavailable)
select(4, [3], NULL, NULL, {0, 200000}) = 0 (Timeout)
read(3, 0xbffff99b, 1) = -1 EAGAIN (Resource temporarily unavailable)
write(3, "\256", 1) = 1
read(3, 0xbffff99b, 1) = -1 EAGAIN (Resource temporarily unavailable)
select(4, [3], NULL, NULL, {0, 200000}) = 0 (Timeout)
read(3, 0xbffff98b, 1) = -1 EAGAIN (Resource temporarily unavailable)
write(3, "\3", 1) = 1
read(3, 0xbffff98b, 1) = -1 EAGAIN (Resource temporarily unavailable)
select(4, [3], NULL, NULL, {0, 200000}) = 0 (Timeout)
ioctl(3, SNDCTL_TMR_TIMEBASE, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_START, {B38400 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE, {B38400 -opost -isig -icanon -echo ...}) = 0
read(3, 0xbffff98b, 1) = -1 EAGAIN (Resource temporarily unavailable)
write(3, "\r", 1) = 1
read(3, 0xbffff98b, 1) = -1 EAGAIN (Resource temporarily unavailable)
select(4, [3], NULL, NULL, {0, 200000}) = 0 (Timeout)
nanosleep({0, 200000000}, NULL) = 0
read(3, 0xbffff98b, 1) = -1 EAGAIN (Resource temporarily unavailable)
write(3, "\0", 1) = 1
read(3, 0xbffff98b, 1) = -1 EAGAIN (Resource temporarily unavailable)
select(4, [3], NULL, NULL, {0, 200000}) = 0 (Timeout)
read(3, 0xbffff99b, 1) = -1 EAGAIN (Resource temporarily unavailable)
write(3, "\0", 1) = 1
read(3, 0xbffff99b, 1) = -1 EAGAIN (Resource temporarily unavailable)
select(4, [3], NULL, NULL, {0, 200000}) = 0 (Timeout)
read(3, 0xbffff98b, 1) = -1 EAGAIN (Resource temporarily unavailable)
write(3, "\0", 1) = 1
read(3, 0xbffff98b, 1) = -1 EAGAIN (Resource temporarily unavailable)
select(4, [3], NULL, NULL, {0, 200000}) = 0 (Timeout)
read(3, 0xbffff99b, 1) = -1 EAGAIN (Resource temporarily unavailable)
write(3, "\0", 1) = 1
read(3, 0xbffff99b, 1) = -1 EAGAIN (Resource temporarily unavailable)
select(4, [3], NULL, NULL, {0, 200000}) = 0 (Timeout)
read(3, 0xbffff98b, 1) = -1 EAGAIN (Resource temporarily unavailable)
write(3, "\r", 1) = 1
read(3, 0xbffff98b, 1) = -1 EAGAIN (Resource temporarily unavailable)
select(4, [3], NULL, NULL, {0, 200000}) = 0 (Timeout)
close(3) = 0
dup(2) = 3
fcntl64(3, F_GETFL) = 0x8002 (flags O_RDWR|O_LARGEFILE)
fstat64(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40014000
_llseek(3, 0, 0xbffff854, SEEK_CUR) = -1 ESPIPE (Illegal seek)
write(3, "error opening device: Resource t"..., 55) = 55
close(3) = 0
munmap(0x40014000, 4096) = 0
_exit(1) = ?

Zulu ★★☆☆
() автор топика
Ответ на: комментарий от Zulu

попытайся сравнить настройки com-порта c виндой при помощи setserial.

ещё при переключениях меж виндузой и линуксом никаких комутаций не производится типа смены/перебрасывания кабелей???

cvv ★★★★★
()
Ответ на: комментарий от cvv

Винды на этой машине нет... Проверялось на другой машине, где винда есть. Но там не Линукса.... Попробую туда, что ли, поставить и проверить.

root@lab:~# setserial /dev/ttyS1
/dev/ttyS1, UART: 16550A, Port: 0x02f8, IRQ: 3

root@lab:~# stty < /dev/ttyS1
speed 9600 baud; line = 0;
kill = ^X; min = 1; time = 0;
-brkint -icrnl -imaxbel
-opost -onlcr
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke

Zulu ★★☆☆
() автор топика
Ответ на: комментарий от Zulu

>Проверялось на другой машине, где винда есть.

возможно отсюдова и копать надо

>root@lab:~# setserial /dev/ttyS1 >/dev/ttyS1, UART: 16550A, Port: 0x02f8, IRQ: 3

Здеся _надо_ юзать всякие verbose detailed & etc.

>root@lab:~# stty < /dev/ttyS1 >speed 9600 baud; line = 0; >kill = ^X; min = 1; time = 0; >-brkint -icrnl -imaxbel >-opost -onlcr >-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke

Сильно похоже что здеся чегото не хватает

cvv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.