Форум: "WinAPI";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];
ВнизПроблема...перекодить несколько функций из C в Delphi... Найти похожие ветки
← →
Atrion © (2005-07-22 01:56) [0]Вот достался мне древний код написанный на сях. Все интерфейсные функции я
вырвал из кода, чтобы не громоздить тут много. Оставил только работу с портом...прошу помочь мне. Т.е. написать
эквивалент сишного кода на Delphi...
Кстати эти функции эквивалентны???:
inportb>>>WriteFile
outportb>>ReadFile
???
#include <graphics.h>
#include <dos.h>
#include <dir.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#define ON 1
#define OFF 0
void help(void);
void RD_DATA(void); /*однократное считывание с АЦП*/
void STR_RD_DATA(void); /*считывание с АЦП, стробируемое угловой меткой */
void MOTOR_DRV(void); /* запуск и останов двигателя*/
char key,motor_state=OFF,snd=ON;
int baseport=0x378; //адрес базового порт
signed int data,U1,U2,dataarray[7200]; // данные с АЦП
int point_number;
int main(void)
{
outportb(baseport,192);//инициализация порта
/******************************* HARD DRIVERS *******************************/
/* однократное считывание с АЦП */
void RD_DATA()
{
int i,a;
data=0;
a=(inportb(baseport)|32);
outportb(baseport,a);
a=a&223;
outportb(baseport,a);//пуск АЦП
a=8;
while(a==8)
a=(inportb(baseport+1)&8);//ожидание готовности АЦП
a=(inportb(baseport)&191);
outportb(baseport,a);
a=a|64;
outportb(baseport,a);//запись в сдвиговый регистр
for(i=0;i<11;i++)
{
data=data>>1;
a=(inportb(baseport+1)&64);
a=a<<4;
data=data|a;//считывание с регистра
a=(inportb(baseport)&127);
outportb(baseport,a);
a=a|128;
outportb(baseport,a);//тактирование регистра
}
if(data<1024) data=-data;
else data=data-1024;
}
/* считывание с АЦП,стробируемое угловой меткой */
void STR_RD_DATA()
{
int a;
a=0;
while(a!=16)
a=(inportb(baseport+1)&16);
RD_DATA();
while(a==16)
a=(inportb(baseport+1)&16);
}
/* драйвер двигателя */
void MOTOR_DRV()
{
int a;
a=(inportb(baseport)^8);
outportb(baseport,a);
motor_state=motor_state^1;
}
← →
alpet © (2005-07-22 07:11) [1]procedure OutportB (port, value: Cardinal); assembler;
asm
push ebx
push edx
movzx edx, word ptr [port]
movzx eax, byte ptr [value]
out dx, al
mov bx, 10
div bx // delay for hardware reaction (about 10-40 ticks)
pop edx
pop ebx
end; // OutportB
function InportB (port: Cardinal): byte; assembler;
asm
push dx
mov dx, word ptr [port]
in al, dx
pop dx
end;
← →
Atrion © (2005-07-22 20:11) [2]alpet © (22.07.05 07:11) [1]
такс понятненько...
а если без асемблерных вставок?...
в Delphe же много прекрасных функций для работы с портами..что посоветуете?....
← →
alpet © (2005-07-23 00:24) [3]В Turbo Pascal такой синтаксис:
port [port_num] := value;
value := port [port_num];
В Delphi его есстно упразднили - не планировалось, что язык кто-то будет использовать для написания драйверов.
← →
Atrion © (2005-07-23 02:10) [4]alpet © (23.07.05 00:24) [3]
Turbo Pascal да раньше много чего хорошего было...
Спасибо что помог немножко... правда я собирался через:
CreateFile(0,PChar("LPT1"),....);
WriteFile(const Buffer;Size,wrSize,0)
ReadFile(....)
...
что так будет проще или я ошибаюсь?...
← →
alpet © (2005-07-23 09:42) [5]Atrion © (23.07.05 02:10) [4]
Точно сказать не могу, будет такой способ работать или нет. Во всяком случае известные мне примеры работы с драйверами, выглядели примерно так:
hFile := CreateFile ("Device\SomeDevice", ...);
WriteFile (hFile, buff, buff_size, writed, nil);
Для уточнения рекомендую почитать DDK.
← →
isasa © (2005-07-23 12:07) [6]И под какой OS будем работать.
Если не связываться с секьрити то, нормально, через ф-цию API CreateFile.
В противном случае(в OS NT и выше), придется оформлять приложение с правами драйвера системы.
← →
Atrion © (2005-07-23 17:27) [7]в основном ориентировка идет на 98...там мощный компутер не нужен так что 98 обойдутся...
ну а если затребуют на выше NT видимо придется по методике isasa
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c