На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> WinXP, Порты
    Добрый день.
    Написал прграмму, которая принимает/посылает в COM через порты ($3f8,$2f8). (Общается с устройством).
    В 98 всё работает четко - всё правильно посылает, принемает.
    В XP в порты писать напрямую нельзя, использовал Giveio.sys. При чтении байта из порта, всё время принимается $FF. Как такое может быть? Ведь в 98 всё работает, и код для XP и 98 одинаковый.

    Спасибо.


      В том то и дело, что для NT подобных винд с Com портом надо работать через API
      (FileWrite, FileRead и т.д.).
      Если используя API написать такую прогу, то она будет работать и под W98 и под XP
      А на прямую в порт - это досовские вещи, но в 98 и ME еще прокатывают
        Цитата
        Гость CromaX, 27.11.03, 11:54
        Написал прграмму, которая принимает/посылает в COM через порты ($3f8,$2f8). (Общается с устройством).

        Цитата
        Was, 27.11.03, 12:50
        А на прямую в порт - это досовские вещи, но в 98 и ME еще прокатывают

        Скажу больше: Если Вы будете просто принимать/посылать в COM через порты $3f8,$2f8 то и под Win9x, то Ваша программа не сможет всегда правильно работать. Для правильной работы нужно использовать не только $3f8 и $2f8, а гораздо больше!
        Поэтому, под виндами (все равно под какими) гораздо легче использовать API.
        А если в лом изучать, то есть разные всякие готовые компоненты. Например AsyncProfessional (это круто) или tComPort (это попроще).
          Да, но я же написал, использую Giveio.sys. Этот драйвер даёт полный доступ к портам в NT системах. И порты приложение может использовать свободно, также как в 98.

          WinApi использовать не возможно, как мне с помощью WimApi написать следуующую функцию?


          procedure WriteSerial(c:byte);
          const
          LineStatusReg = 5; { $*fd порт состояния линии}
          begin
          Вот эту строчку я в Api написать не смог.
          !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
          while (PortIn(PortBase+ LineStatusReg) and (THRE+TSRE) <> THRE+TSRE) do ;
          {// THRE = $20;}{// TSRE = $40;}
          {// transmitter shift and holding registers empty}
          {// transmitter holding register empty (THRE)}
          !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

          PortOut(PortBase+ TXBuffer,c);

          while (PortIn(PortBase+ LineStatusReg) and (THRE+TSRE) <> THRE+TSRE) do ;
          {// transmitter shift and holding registers empty}
          {// transmitter holding register empty (THRE)}
          Sleep(2);
          end;

          Я переписавал всю прогу на API, в 98 всё ок, а в NT (XP,2000) временами виснит намертво.
          Вообще вся прога под изначально была под ДОС, мне её надо переделать в под винды. Лучший способ через порты, а не API. Переписать то в Api может я и перепишу, но и глюки новые от себя добавлю, а при использовании портов я измениния в исходном коде делаю минимальные.
            Прямой доступ к портам чреват как зависанием, так и крахом всей системы, там слишком много чего надо учитывать, но все равно неправильно, работать надо исключительно через специально написаный драйвер устройства, с регистрацией в системе, с резервированием ресурсов за собой, а не в обход системы.

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

            Хочешь нормальную работу, осваивай DDK, но забудь про написание этого уровня в Дельфи, или MASM или VC, а вот общение уже можно на Дельфи.
              Дак ведь доступа к THRE+TSRE через API и не требуется. Там сами винды отслеживают готовность к передаче и пр. Там просто даешь данные, а он их размещает в буфере, и по мере готовности, передает.
              Цитата
              CormaX, 28.11.03, 09:37
              в NT (XP,2000) временами виснит намертво

              Странно, обычно наоборот.
              Цитата
              CormaX, 28.11.03, 09:37
              Переписать то в Api может я и перепишу, но и глюки новые от себя добавлю, а при использовании портов я измениния в исходном коде делаю минимальные.

              А вот это серьезный аргумент.
              Я сам, являюсь автором комерческого продукта работающего через COM-порты. Естественно начинал еще под DOS. Причем даже под DOS у меня использовалась самодельная многопоточность. Ну и со временем естественно пришлось переносить под винды, я пошел по пути Windows-API. Конечно, пришлось полностью переписать. Так-что все сложности понимаю. Поэтому, если надо быстро, хоть-как-нибудь - то делай как делаешь.


              Добавлено в
              Цитата
              Anatoly Podgoretsky, 28.11.03, 09:48
              Прямой доступ к портам чреват как зависанием, так и крахом всей системы, там слишком много чего надо учитывать,
              ...
              То что это порт принтера, ничего не меняет, система и другие драйверы могут с ним работать и расчитывать, что никто не полечет к ним напрямую.

              Ну это не совсем так, особенно под WinNT/2k/XP. Тем более, что CormaX использует драйвер Giveio (ведь совсем напрямую просто не дадут).
              Цитата
              Anatoly Podgoretsky, 28.11.03, 09:48
              Хочешь нормальную работу, осваивай DDK, но забудь про написание этого уровня в Дельфи, или MASM или VC

              А вот в этом, я совсем не уверен. По моему я даже встречал что-то по написанию драйверов на Delphi. Если надо, могу поискать.
              Но для решения данной задачи никаких драйверов писать уже не придется, все они уже давно написанны мелкософтом smile.gif
                Всё. На выходных посидел, и всё сделал. Включил комп, XP, запустил прогу, и всё заработало :-)
                Непонятно, почему был глюк, и глюк ли это вообще huh.gif
                Всем спасибо.
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0279 ]   [ 16 queries used ]   [ Generated: 27.04.24, 07:10 GMT ]