Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с портами

53K
08 февраля 2010 года
kruf
9 / / 05.02.2010
Как в C++Builder 6 использовать старые функции Turbo C++ работы с портами
outport(port,byte);
inportb(port);
290
09 февраля 2010 года
Patr1ot
458 / / 09.02.2008
Никак, между С++ Builder и Turbo C++ всетаки есть разница...
1.9K
09 февраля 2010 года
George22
91 / / 09.12.2007
Google inpout32.dll - работает без проблем.
Если надо, напишу подробно.
53K
10 февраля 2010 года
kruf
9 / / 05.02.2010
Напишите подробнее чайнику
1.9K
10 февраля 2010 года
George22
91 / / 09.12.2007
1.В папку со своим Exe-шником кладешь inpout32.dll
2. В h-файле прописываешь указатели на функции

typedef short _stdcall (*inpfuncPtr)(short portaddr);
typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum);
inpfuncPtr inp32;
oupfuncPtr out32;

HANDLE hLib;

3.В модуле cpp в обработчике FormCreate загружаем библиотеку
и получаем указатели на на функции ввода-вывода:

hLib = LoadLibrary("inpout32.dll");
inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32");
out32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");

4.Можно работать:
Например, чтобы выдать на все ножки LPT единички:

out32(0x378,0xFF);

Прочитать состояние LPT-порта (всего 5 ножек доступно):

int Condition =inp32 (0x379);

Например в цикле ждем приход сигнала:

while(inp32 (0x379)& 0x20)
{
Sleep(1);
}

Обязательно вставляйте Sleep, иначе сильно грузит процессор и
другие приложения будут тормозить. DLL-ку взял на logix4u.net
Хорошо написано как работать с ней на pcports.ru.
Чем могу - помогу, удачи.
53K
10 февраля 2010 года
kruf
9 / / 05.02.2010
George22 : Большое человеческое спасибо, разобрался все читается, записывается.

Есть проблема при считывании значений с порта в цикле программа зависает и нечего не выводит в чем может быть дело ???
For(;;)
{
int x=inp32(port);
Panel1->Caption = x;
}
24K
10 февраля 2010 года
engel65536
50 / / 17.10.2007
Всё зависает - это логично. У вас бесконечный цикл for(;;) - а это значит, что ничто другое выполняться не будет - у вас же не многопоточное приложение. Т.е. ваша программа даже не поймёт, что её хотят закрыть или что-то ещё сделать. А не выводится ничего потому, что до обработчика сообщений не доходят вообще никакие сообщения (из-за бесконечного цикла) - в том числе и WM_PAINT.
Решения может быть два:
1. Внутри бесконечного цикла вставляете вызов функции Sleep(200), которая приостанавливает выполнение процесса на 200 мс, и вызов метода Application->ProcessMessages(), который обрабатывает ожидающие сообщения в очереди.
2. Просто на форму помещаете объект TTimer, ставите у него интервал, например, в 200 мс, и ваш код (считывание из порта и вывод на форму) поместить в обработчик единтсвенного события таймера.
53K
10 февраля 2010 года
kruf
9 / / 05.02.2010
engel65536 : Спасибо)))

Как сделать выход из бесконечного цикла???
24K
11 февраля 2010 года
engel65536
50 / / 17.10.2007
Если предположить, что у вас есть две кнопки "Старт" и "Стоп", то можно сделать так. Объявляете булевскую переменную (например, bool Run) в классе формы (Form1.h).
В обработчике кнопки "Старт" ставите Run в true и после этого там же запускаете ваш цикл.
В обработчике кнопки "Стоп" просто ставите Run в false.
Чтобы это всё работало, делаете цикл не for(;;), а for(;Run;) - тогда выполнение будет идти, пока значение Run истинное.
Либо по-другому - внутри цикла пишете if(!Run) break; - но по мне красивее первый вариант.
Но я всё-таки предпочёл бы сделать чтение порта по таймеру - выглядит более лаконично. Но вот если вам нужно очень часто читать - то он не поможет - период срабатываний меньше 5мс поставить не выйдет.
53K
11 февраля 2010 года
kruf
9 / / 05.02.2010
Все работает))) Спасибо всем ))):)
16K
22 февраля 2010 года
asmforce
186 / / 05.01.2010
Работает? Хорошо. Но можно сделать самому, надежность совместимости гарантирована (или почти гарантирована):

inline static unsigned char inportb (unsigned short _port)
{
unsigned char rv;
__asm__ __volatile__ ("inb %1, %0" : "=a" (rv) : "dN" (_port));
return rv;
}

inline static void outportb (unsigned short _port, unsigned char _data)
{
__asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data));
}

или

inline static unsigned char inportb (unsigned short _port)
{
unsigned char rv;
asm inb rv, _port
return rv;
}

inline static void outportb (unsigned short _port, unsigned char _data)
{
asm outb _port, _data
}
14
25 февраля 2010 года
Phodopus
3.3K / / 19.06.2008
Цитата: asmforce
Работает? Хорошо. Но можно сделать самому, надежность совместимости гарантирована (или почти гарантирована)


Ты это.. не безобразь :)
Твой код без библиотеки работать не будет, а с библиотекой он уже не нужен.

252
26 февраля 2010 года
koderAlex
1.4K / / 07.09.2005
asmforce , а ты сам то пробовал то , что советуешь ? ))
16K
26 февраля 2010 года
asmforce
186 / / 05.01.2010
Цитата: Phodopus
Ты это.. не безобразь :)
Твой код без библиотеки работать не будет, а с библиотекой он уже не нужен.



Ну это... не нужен - так не нужен. Это только как вариант.
Кроме того - поскольку функции inline - то при вставке этих функций в виде #include <.../iop.h> размер испонимого не возрастает.


Цитата: koderAlex
asmforce , а ты сам то пробовал то , что советуешь ? ))



Разумеется. Например вот элегантное решение:

 
Код:
#pragma warn -8070
  u64 get_ticks()
  {
    asm RDTSC
  };
  #pragma warn +8070
252
26 февраля 2010 года
koderAlex
1.4K / / 07.09.2005
это не работа с портами )
команда RDTSC в винде доступна всем приложениям , а вот доступ к портам по умолчанию закрыт .

зы : код asm {
cli
db 0f3h,66h,0f0h,67h,0ffh,0fh,0bh
}; в любой операционке и в любом языке позволяющем ассемблерные вставки делает жизнь веселее . ;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог