Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.10;
Скачать: CL | DM;

Вниз

программирование Com порта на asm е   Найти похожие ветки 

 
Safonov   (2002-12-05 16:41) [0]

Передо мной поставили задачу переписать старую прогу.
Программа написана на Delphi1. Работа с Com портом в ней ведется через модуль TUart половина которого написана на ASM"е.
Если я запускаю Delphi1 то прога спокойненько работает.
Если же запускаю Delphi 6, то вываливается с:"Privileged instruction" при старте. Ошибка при инициализации порта в строчке
OUT DX,AL.
Вопрос: есть ли какой-либо ключик, выставив который Delphi будет компилировать код совместимый с Delphi1 ? Или просто подскажите как решить проблему ?
Очень сильно не хочется переписывать часть программы отвечающую за обмен с портом, т.к. железо спаяно на коленке российскими "левшами". Протокол обмена нигде не описан. Разбор исходников займет слишком много времени...


 
Evgeny V ©   (2002-12-06 07:27) [1]

Проблема в том, что на дельфи 1 ты строишь 16-битные приложения, ну а на дельфи 6 32-бита, ну да ладно вроде ты и сам все понял, тебе или придется переписать работу с портом самому, или использовать готовые компоненты, которые ты можешь найти например или здесь на этом сайте они были, или на www.torry.net, в разделе vcl, communication, ports and modems


 
raiv ©   (2002-12-06 10:29) [2]

var
hCOM: THandle;
ComPort: PChar;
Function OpenPort_IO(hCOM: THandle;COMN:PChar;BaudR,ByteS:Integer;Parit,StopB:Byte):THandle;




Function OpenPort_IO(hCOM: THandle;COMN:PChar;BaudR,ByteS:Integer;Parit,StopB:Byte):THandle;
var
DCB: TDCB;
begin
hCOM:=CreateFile(COMN,GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if (hCom = INVALID_HANDLE_VALUE) then begin
ShowMessage("Невозможно открыть порт");
hCom:=0;
Result:=hCom;
Exit;
end;

if not GetCommState(hCOM, DCB) then begin
ShowMessage("Немогу прочитать статус порта: " + IntToStr(GetLastError));
hCom:=0;
Result:=hCom;
Exit;
end;
dcb.BaudRate :=BaudR;
dcb.ByteSize :=ByteS;
dcb.Parity :=Parit;
dcb.StopBits :=StopB;
//Настройка TimeOut
//ct.ReadIntervalTimeout:=MaxDWord;
//ct.ReadTotalTimeoutConstant:=0;
//ct.ReadTotalTimeoutMultiplier:=0;

//ct.WriteTotalTimeoutMultiplier:=0;
//ct.WriteTotalTimeoutConstant:=0;
//SetCommTimeouts(hCom,ct);


if not SetCommState(hCOM, DCB) then begin
ShowMessage("Немогу записать статус в порт: " + IntToStr(GetLastError));
hCom:=0;
Result:=hCom;
Exit;
end;
Result:=HCom;
end;


procedure TFormVlag.LbSpeedButton1Click(Sender: TObject);
begin
hCOM:=OpenPort_IO(hCOM,ComPort,1200,8,0,2);
if hCom=0 Then Exit;
RCom:=TCom.Create(False);
RCom.Priority:=tpHigher;
end;

А это на потоке

procedure TCom.Execute;
begin
While not Terminated do begin
Read_Vlag(HCom);
end;
end;
Procedure Read_Vlag(HCom:THandle);
var
summa,d: Double;
Count_io: Integer;
Data_Stack: Array [0..800] of double;
k: Integer;
begin
Summa:=0;
//Режим отсчета
if Read_B(hCom,1)=1 then begin
.......
end;


Function Read_B(HC:THandle;BufSize:Integer):Byte;
var
Buf: Byte;
count: DWord;
begin
ReadFile(hC, Buf, BufSize, count, nil);
Result:=Buf;
end;

Если я что-то пропустил или тебе не понятно пиши на мыло raiv@okg.sea.ru






 
Dorin   (2002-12-06 11:21) [3]

Esti takoe poniatie kak IOBMP.
V neom zapisano kakie porty mojno ispolizovati progge ...
Napishi mne na mylo(esle esheo nado) ia tebe prishliu SYS kotoryii izmeniaet IOBMP i EXE kotoryii zapuskaet tvoiu progu i obrashiaetsa k sys-u dlia izmenenia IOBMP ...



Страницы: 1 вся ветка

Текущий архив: 2003.02.10;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.022 c
1-28826
peugeot605
2003-02-02 18:13
2003.02.10
Динамическое создание объектов


1-28792
waterfoll
2003-01-29 12:47
2003.02.10
Есть программа с двумя формами, Form1 и Form2, в Form1 на


1-28746
sniper
2003-01-31 15:42
2003.02.10
Помоготие с дискетой!


7-29139
Чегермек
2002-11-30 20:55
2003.02.10
Время (высокоточное)


14-29069
Дмитрий К.К.
2003-01-23 17:37
2003.02.10
1937-й год