Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-1122636455
HepB
2005-07-29 15:27
2005.09.11
query1.RecordCount всегда равен -1


1-1124305184
Tihinen
2005-08-17 22:59
2005.09.11
Виртуалка vs Корявый алгоритм


1-1124202235
lox
2005-08-16 18:23
2005.09.11
Как узнать: окно поверх других или нет, если есть хендел?


1-1124246472
anton_321
2005-08-17 06:41
2005.09.11
как выводить изображение в DBGrid.


3-1122611051
erika
2005-07-29 08:24
2005.09.11
IB. Формирование запроса с расчетом данных по 1 - ой колонке





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский