Форум: "Система";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];
Внизпрограммирование 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c