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


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

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

Оффлайн ShadowUser15

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

Оффлайн .ubuntufan

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

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

Код: Bash
  1. INPUT=5
  2. LENGTH=2
  3. echo $(($INPUT & (1 << $LENGTH)))
  4.  

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

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

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



Пример:

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

Оффлайн ShadowUser15

  • Автор темы
  • Активист
  • *
  • Сообщений: 718
    • Просмотр профиля
т.е. если нужен 5й бит байта 0х379 (889 десятичный) из файла /dev/port
это будет выглядеть так:
Код: Bash
  1. 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
  1. 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
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.         FILE* fp;
  7.         fp = fopen("/dev/port", "rb");
  8.         fseek(fp, 889, SEEK_SET);
  9.         char b;
  10.         fread(&b, 1, 1, fp);
  11.         if (((int) b >> 6) && 1) {
  12.                 printf("Byte assigned");
  13.                 return 0;
  14.         }
  15.  
  16.         printf("Byte not assigned");
  17.         return 1;
  18. }
  19.  
« Последнее редактирование: 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.  & (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
  1. a=$(dd if=/dev/port bs=1 skip=889 count=1 2>/dev/null)|echo $a
НЕ РАБОТАЕТ (не присваивается), но содержимое $a печатает.
а вот
Код: Bash
  1. a=$(dd if=/dev/port bs=1 skip=889 count=1 2>/dev/null)
  2. echo $a
работает... странно, точнее не странно, но всё равно :( потом с этой а ничего не сделать :(
самое весёлое что
Код: Bash
  1. a=$(dd if=/dev/port bs=1 skip=889 count=1 2>/dev/null)+128
  2. echo $a
тоже работает :)
на выходе получается строка "?+128" (без кавычек)
« Последнее редактирование: 18 Октябрь 2014, 23:43:51 от ShadowUser15 »
вероятное введение нестандартных десятичностей, внутри системы - заставляет задуматься о переходе на другой

 

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