IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

> RS-232 DOS окне
Nightmare
сообщение 7.10.2003 19:11
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 48
Пол: Мужской

Репутация: -  1  +


Господа!
Подскажите человеку, как заставить нормально работать DOS приложения из-под ВыньДос с СОМ портом.
Если в .bat вызываются несколько программ, работающих с портом, то с приличной степенью вероятности происходит следующее:
- первая программа отрабатывает нормально
- вторая инициализирует порт, но не может ничего принять (но не всегда)

В чём коза? В БГ или у меня с головой что-то не так?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Nightmare
сообщение 13.10.2003 19:03
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 48
Пол: Мужской

Репутация: -  1  +


Использование COM порта (1 или 2) в режиме: Baund=9600 Parity=None Bit=8 Stop=1.
Код

Unit RSFunc;

INTERFACE

Const
 TimeOut = $0FFFF;
 SpeedDivider: Word = $0C;

Var
 PortBase, RSError: Word;

Function LStatReg: Byte;
Function IsRecive( Var Status: Byte ): Boolean;
Function CheckRcv: Boolean;
Function RsIn: Word;
Procedure RsOut( Value: Byte );
Function SetPort( Number: Byte ): Boolean;
...

IMPLEMENTATION

Uses Crt, Dos;

Function LStatReg: Byte; assembler;
asm
           mov      dx, PortBase
           add      dx, 5
           in      al, dx
           xor      ah, ah
end; {LStatReg}

Function IsRecive( Var Status: Byte ): Boolean;
Var
 Temp: Byte;
 Temp1: Boolean;
begin
 asm
           mov      dx, PortBase
           add      dx, 5
           in      al, dx
           mov      Temp, al
           and      ax, 1
           mov      Temp1, al
 end;
 IsRecive := Temp1;
 Status := Temp;
end; {IsRecive}

Function CheckRcv: Boolean; assembler;
asm
           mov      dx, PortBase
           add      dx, 5
           in      al, dx
           and      ax, 1
end; {CheckRcv}

Function RsIn: Word;
Var
 Temp: Word;
 Temp1: Byte;
 Temp2: Boolean;
begin
 RsIn := 0;
 Repeat
   asm
           mov      dx, PortBase
           add      dx, 5
           in      al, dx
           mov      Temp1, al
           and      ax, 1
           mov      Temp2, al
   end;
   If Temp2 then
   begin
     asm
           mov      dx, PortBase
           in      al, dx
           mov      ah, Temp1
           mov      Temp, ax
     end;
     RsIn := Temp;
     Break;
   end else Inc( Temp );
 Until (Temp > $13EC);
end; {RsIn}

Procedure RsOut( Value: Byte );
Var
 Stat: Boolean;
 Temp: Word;
 Temp1: Byte;
begin
 For Temp := 0 to $7530 do
 begin
   Temp1 := LStatReg;
   asm
           mov      Stat, 0
           mov      al, Temp1
           test      al, 1Ch
           je      @@1
           jmp      @@2
     @@1:
           test      al, 20h
           je      @@2
           mov      Stat, 1
     @@2:
   end;
   If Stat then
   begin
     asm
           mov      dx, PortBase
           mov      al, Value
           out      dx, al
     end;
     Break;
   end;
 end;
end; {RsOut}

Function SetPort( Number: Byte ): Boolean;
Var
 Temp: Word;
 Temp1: Byte;
 SD_Lo, SD_Hi: Byte;
begin
 RsError := 0;
 PortBase := 0;
 SetPort := False;
 Case Number of
   1: PortBase := $3F8;
   2: PortBase := $2F8;
   else begin
     RsError := $2A;
     Exit;
   end;
 end;
 If PortBase <> 0 then
 begin
   SD_Hi := Hi(SpeedDivider);
   SD_Lo := Lo(SpeedDivider);
   asm
           mov      dx, PortBase
           add      dx, 3
           mov      al, 80h
           out      dx, al
           mov      dx, PortBase
           add      dx, 1
           mov      al, SD_Hi
           out      dx, al
           mov      dx, PortBase
           mov      al, SD_Lo
           out      dx, al
           mov      dx, PortBase
           add      dx, 3
           mov      al, 3
           out      dx, al
           mov      dx, PortBase
           add      dx,  1
           xor      ax, ax
           out      dx, al
   end;
   For Temp := 0 to $9C40 do
   begin
     Temp1 := LStatReg;
     asm
           mov      al, Temp1
           and      ax, 80h
           mov      Temp1, al
     end;
     If Temp1 = 0 then
     begin
       SetPort := True;
       Break;
     end;
   end;
 end else RsError := $2A;
end; {SetPort}
...
end.

Инициализация порта:
Код

...
 If not SetPort(ComPort) then
 begin
   Writeln( 'Ошибка инициализации порта СОМ', ComPort );
   Halt( 255 );
 end;
...

Типовое использование (используется спецификация протокола обмена с удалённым контроллером):
Код

Function Command( P1, P2, P3, P4: Byte ): Boolean;

Var
 ...
 Wait: Word;
 Check: Byte;
 ...
begin
 ...
 Command := False;
 RsError := 0;
 ...

типовая передача данных удалёному контроллеру, Check - CRC
Код
 ...
 RsOut( P1 );
 RsOut( P2 );
 RsOut( P3 );
 RsOut( P4 );
 RsOut( $0F );
 RsOut( $0F );
 RsOut( Check );
 ...

типовое ожидание ответа удалённого контроллера
Код

 ...
 Wait := 0;
 While not CheckRcv and (Wait <> TimeOut) do Inc(Wait);
 If Wait = TimeOut then
 begin
   RsError := 1;
   Exit;
 end;
 If Lo(RsIn) = Check then
 begin
   RsError := 0;
   Command := True;
   Exit;
 end;
 ...
end; {Command}

Всё это писалось довольно давно под DOS. Можно, конечно, периписать под Delphi (Console Mode), но лень - слишком много сделано...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Nightmare   RS-232 DOS окне   7.10.2003 19:11
GLuk   Re: RS-232 DOS окне   12.10.2003 7:42
Nightmare   Re: RS-232 DOS окне   12.10.2003 9:19
GLuk   Re: RS-232 DOS окне   12.10.2003 19:33
Nightmare   Re: RS-232 DOS окне   13.10.2003 19:03
GLuk   Re: RS-232 DOS окне   13.10.2003 19:08
Nightmare   Re: RS-232 DOS окне   13.10.2003 19:12
GLuk   Re: RS-232 DOS окне   13.10.2003 21:07
Nightmare   Re: RS-232 DOS окне   14.10.2003 18:42
GLuk   Re: RS-232 DOS окне   14.10.2003 20:08
Nightmare   Re: RS-232 DOS окне   14.10.2003 21:44
GLuk   Re: RS-232 DOS окне   15.10.2003 13:42
Nightmare   Re: RS-232 DOS окне   16.10.2003 16:16
GLuk   Re: RS-232 DOS окне   17.10.2003 7:29
Nightmare   Re: RS-232 DOS окне   19.10.2003 11:11
GLuk   Re: RS-232 DOS окне   24.10.2003 5:57


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 7.08.2025 3:23
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"