Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Как из голой системы прочитать байт 0х379 файла /dev/port и проверить по маске  (Прочитано 2902 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ShadowUser15

  • Автор темы
  • Активист
  • *
  • Сообщений: 718
    • Просмотр профиля
Как из голой системы прочитать байт 0х379 файла /dev/port и проверить по маске состояние бита?
Скриптом, без дополнительных бинарников.
(Нажмите, чтобы показать/скрыть)
Как прочитать - ответ найден.
Код: (bash) [Выделить]
a=$(dd if=/dev/port bs=1 skip=889 count=1 2>/dev/null) Теперь разбираемся со странным поведением команды, разным при установленном бите и нет, см. конец.
Странным - потому что с этой "а" ничего из математики не пашет. Например
Код: (bash) [Выделить]
a=$[a&2]
Код: (bash) [Выделить]
a=$[$a&2] не пашет
« Последнее редактирование: 19 Октября 2014, 10:35:45 от ShadowUser15 »
вероятное введение нестандартных десятичностей, внутри системы - заставляет задуматься о переходе на другой

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
Цитировать
Скриптом, без дополнительных бинарников.

Сдвинь единицу на 0x378 байт и сравни с этой маской:

Код: (bash) [Выделить]
INPUT=5
LENGTH=2
echo $(($INPUT & (1 << $LENGTH)))

Если результат != 0 соответственно бит установлен.

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic

Только не сохраняй в переменную поток байт без преобразования - bash экранирует нули:
https://forum.ubuntu.ru/index.php?topic=249368.msg1969933#msg1969933



Пример:

Код: (bash) [Выделить]
echo $(($(dd if=/dev/port bs=1 skip=111 count=1 2>/dev/null) & (1 << 0)))
« Последнее редактирование: 29 Сентября 2014, 11:59:44 от .ubuntufan »

Оффлайн ShadowUser15

  • Автор темы
  • Активист
  • *
  • Сообщений: 718
    • Просмотр профиля
т.е. если нужен 5й бит байта 0х379 (889 десятичный) из файла /dev/port
это будет выглядеть так:
Код: (bash) [Выделить]
echo $(($(dd if=/dev/port bs=1 skip=888 count=1 2>/dev/null) & (1 << 5)))?
СПАСИБО!!!! // к стыду про dd забыл напрочь :(
« Последнее редактирование: 29 Сентября 2014, 16:40:47 от ShadowUser15 »
вероятное введение нестандартных десятичностей, внутри системы - заставляет задуматься о переходе на другой

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
нумерация с нуля только - ты так с шестым сравниваешь и dd в байтах параметры задаются - skip=111 а не skip=888.

Оффлайн ShadowUser15

  • Автор темы
  • Активист
  • *
  • Сообщений: 718
    • Просмотр профиля
а в десятичной системе параметры dd? Почему тогда 112й байт читаем? если нужен 889й?
или я что-то не понял?
вероятное введение нестандартных десятичностей, внутри системы - заставляет задуматься о переходе на другой

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
Да, все правильно - 889 байт. Думал тебе 889 бит нужно прочитать.

Оффлайн ShadowUser15

  • Автор темы
  • Активист
  • *
  • Сообщений: 718
    • Просмотр профиля
Спасибо!
я так и понял :)
вероятное введение нестандартных десятичностей, внутри системы - заставляет задуматься о переходе на другой

Оффлайн ShadowUser15

  • Автор темы
  • Активист
  • *
  • Сообщений: 718
    • Просмотр профиля
поправка: на 888, а 889, как ни странно.
Биты инвертированы - т.е. на разьёмах высокий уровень (светодиод запалить хватает), в битах - единица, когда пин замкнут на землю - то ноль.
т.е.
Код: (Bash) [Выделить]
echo $(($(dd if=/dev/port bs=1 skip=889 count=1 2>/dev/null) & (1 << 6)))выдаёт ошибку про неверную ссылку или метку [00/4F]") & (1 << 6)))" ожидается значение ([00/4F]=иероглиф/квадрат символа 004F, значение характерное для байта состояния входных линий датчиков у пустого порта) если порт свободен, и "0" если замкнуты пины (13 и 25, крайние... или предпоследние 12 и 26? в общем те что соответствуют проверяемому биту)
« Последнее редактирование: 14 Октября 2014, 19:57:15 от ShadowUser15 »
вероятное введение нестандартных десятичностей, внутри системы - заставляет задуматься о переходе на другой

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля
Кажется одними средствами Bash'а не обойтись.
Есть возможность скомпилировать свой бинарник?
Решить задачу, написав такое такое на C гораздо проще.

Код: (C) [Выделить]
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
FILE* fp;
fp = fopen("/dev/port", "rb");
fseek(fp, 889, SEEK_SET);
char b;
fread(&b, 1, 1, fp);
if (((int) b >> 6) && 1) {
printf("Byte assigned");
return 0;
}

printf("Byte not assigned");
return 1;
}
« Последнее редактирование: 14 Октября 2014, 20:42:25 от .ubuntufan »

Оффлайн ShadowUser15

  • Автор темы
  • Активист
  • *
  • Сообщений: 718
    • Просмотр профиля
На лазарусе (паскале) примерно этот код прекрасно работает (без обработки ошибок), я просто в терминал печатал.
А баш кстати ошибку выдаёт ПРИ ОТСУТСТВИИ события...
Интересно в цикле её игнорить можно?
« Последнее редактирование: 15 Октября 2014, 01:10:39 от ShadowUser15 »
вероятное введение нестандартных десятичностей, внутри системы - заставляет задуматься о переходе на другой

Оффлайн Nicom

  • Новичок
  • *
  • Сообщений: 29
    • Просмотр профиля
Биты инвертированы - т.е. на разьёмах высокий уровень (светодиод запалить хватает), в битах - единица, когда пин замкнут на землю - то ноль.
Они подтянуты к +5 вольтам на материнке.
Может эта книга поможет?
http://bookre.org/reader?file=555471&pg=17
http://bookre.org/reader?file=555471&pg=19

Биты 3 и 6 байта статуса инвертируются в самом порте, то есть при его пустом чтении уже будет не 0
Первые 3 бита байта статуса не используются портом, поэтому нет уверенности что при чтении они явно будут установлены в 0.
Непонятно какое смещение даст сама dd при чтении этого неполного байта.

Насчёт 26 контакта я не совсем понял, это на каком разъёме?

Оффлайн ShadowUser15

  • Автор темы
  • Активист
  • *
  • Сообщений: 718
    • Просмотр профиля
тьфу!! не 26! а 24 (2й с краю во 2м ряду :) ) извиняюсь.

ЧТЕНИЕ ИЗ ПОРТА В БАШЕ РАБОТАЕТ и говорит "0" что правильно!!!!! НО! если ничего не замкнуто, и читается 4F, то этот оригинал пишет не "1", а выдаёт ошибку. Для повторения её лезть в порт не нужно - можно просто выполнить команду от рута.
Чтение дд в файл - работает всегда, ошибка происходит в операторе "&" который внезапно перестаёт считать 4F параметром, говорит что ждёт операнд, а ему суют неизвестную ссылку [004F]
вероятное введение нестандартных десятичностей, внутри системы - заставляет задуматься о переходе на другой

Оффлайн Nicom

  • Новичок
  • *
  • Сообщений: 29
    • Просмотр профиля
Код: (Bash) [Выделить]
& (1 << 6)
А что делает вот эта часть команды?
Насколько мне помнится "&" отправляет процесс в бакграунд. А дальше у вас в stdout дописывается поток 6 (нестандартный)?

Кстати, у меня на OpenSUSE свободный порт, по вашей команде, читается как "~" 07EH, это после обрезания вышеуказанного куска.
« Последнее редактирование: 14 Октября 2014, 23:12:57 от Nicom »

Оффлайн ShadowUser15

  • Автор темы
  • Активист
  • *
  • Сообщений: 718
    • Просмотр профиля
мм, по идее (1 << 6) подготовка маски для проверки 6го бита (в паскале операция shl), можно заменить константой. А & - операция "и" которая проверяет есть ли этот бит с обоих сторон.
В баше я не очень (равно как и в пёрле с питоном и пхп). Что из доса помню - то юзаю :)
Самое удивительное - если бит "0" (замкнут железкой) то всё работает. Если нет - ошибка.
смысл вот:http://ru.wikipedia.org/wiki/Bash#.D0.A6.D0.B5.D0.BB.D0.B.....
обратите внимание на $((выражение))
или
http://citforum.ru/operating_systems/manpages/bash/BASH.1_3.shtml#arithmetic_eval

может & при значении по умолчанию из порта становится какойто командой? типа ">&"?
или "когда Ubuntu начал с октября 2006 года поставлять Debian Almquist shell (dash) как скриптовую оболочку по умолчанию, что привело к неработоспособности многочисленных скриптов."
(Нажмите, чтобы показать/скрыть)

завтра проверю :)

У меня не 0х7Е, а 0х7F, странно, может от режима порта зависит? У меня в биосе стоит Normal (думаю это аналог SPP = Standart Par. Port)

Пользователь решил продолжить мысль [time]15 Октябрь 2014, 12:39:42[/time]:
(Нажмите, чтобы показать/скрыть)

Пользователь решил продолжить мысль [time]15 Октябрь 2014, 17:01:12[/time]:
Там где "ошибочная метка" не тот символ - не вставилось.
в общем вот, там скрин
« Последнее редактирование: 15 Октября 2014, 17:08:40 от ShadowUser15 »
вероятное введение нестандартных десятичностей, внутри системы - заставляет задуматься о переходе на другой

Оффлайн ShadowUser15

  • Автор темы
  • Активист
  • *
  • Сообщений: 718
    • Просмотр профиля
Код: (Bash) [Выделить]
a=$(dd if=/dev/port bs=1 skip=889 count=1 2>/dev/null)|echo $aНЕ РАБОТАЕТ (не присваивается), но содержимое $a печатает.
а вот
Код: (Bash) [Выделить]
a=$(dd if=/dev/port bs=1 skip=889 count=1 2>/dev/null)
echo $a
работает... странно, точнее не странно, но всё равно :( потом с этой а ничего не сделать :(
самое весёлое что
Код: (Bash) [Выделить]
a=$(dd if=/dev/port bs=1 skip=889 count=1 2>/dev/null)+128
echo $a
тоже работает :)
на выходе получается строка "?+128" (без кавычек)
« Последнее редактирование: 18 Октября 2014, 23:43:51 от ShadowUser15 »
вероятное введение нестандартных десятичностей, внутри системы - заставляет задуматься о переходе на другой

 

Страница сгенерирована за 0.035 секунд. Запросов: 25.