Newsgroup: it.comp.lang.pascal
Titolo: Porta Seriale

Con il comando ASSIGN posso gestire la porta seriale come un file,
come faccio a configurarla (Velocità,bit di start,stop,parità) ?
--
Automatic posted from 
virtual.zia.ms.it
 [195.103.158.42]
via Mailgate Server - 
http://www.mailgate.org

...

uses crt,dos;
const dsegprincipale:integer=0;
      buffermax=1024;
      CR=#13;
      portadati=$03F8;
      IER=$03F9;
      LCR=$03FB;
      MCR=$03FC;
      LSR=$03FD;
      MDMMSR=$03FE;
      ENBLRDY=$01;
      MDMMOD=$0B;
      MDMCD=$80;
      INTCTLR=$21;
var vettoreasync:pointer;
    regs:registers;
    buffer:array[1..buffermax]of char;
    i,carinbuf,circout,circin:integer;
    orig:char;
procedure SvuotaBuffer;
begin
 circin:=1;
 circout:=1;
 carinbuf:=0;
 fillchar(buffer,sizeof(buffer),0);
end;
procedure InterAsyn;Interrupt;
begin
 inline($FB);
 if (carinbuf<buffermax)then
   begin
    buffer[circin]:=char(port[portadati]);
    if (circin<buffermax)then
       circin:=circin+1
    else
       circin:=1;
    inc(carinbuf,1);
   end;
 inline($FA);
 port[$20]:=$20;
end;
procedure PredisponiSeriale(seriale,
                            bps,
                            stop,
                            dati:integer;
                            parita:char);
var regs:registers;
    parametro:byte;
begin
 case bps of
   1200: bps:=4;
   2400: bps:=5;
 end;
 if stop=2then stop:=1
          else stop:=0;
 if dati=7then dati:=2
          else dati:=3;
 parametro:=(bps shl 5)+(stop shl 2)+dati;
 case parita of
   'E': parametro:=parametro+8;
   'O': parametro:=parametro+24;
 end;
 with regs do
   begin
    DX:=seriale-1;
 AH:=0;
 AL:=parametro;
 Flags:=0;
   end;
 intr($14,regs);
end;
procedure AttivaPorta;
var b:byte;
begin
 dsegprincipale:=dseg;
 svuotabuffer;
 getintvec($0C,vettoreasync);
 setintvec($0C,@interasyn);
 b:=port[INTCTLR];
 b:=b and $0EF;
 port[INTCTLR]:=b;
 b:=port[LCR];
 b:=b and $7F;
 port[LCR]:=b;
 port[IER]:=ENBLRDY;
 port[MCR]:=$08 and MDMMOD;
 port[MDMMSR]:=MDMCD;
 port[$20]:=$20;
end;
function LeggiCar:char;
var ch:char;
begin
 if carinbuf>0then
   begin
    leggicar:=buffer[circout];
    if circout<buffermax then
       circout:=circout+1
    else
       circout:=1;
    dec(carinbuf,1);
   end;
end;
procedure InviaCar(b:byte);
begin
 while((port[LSR]and$20)<>$20)do;
 port[portadati]:=b;
end;
procedure DisattivaPorta;
var b:byte;
begin
 b:=port[INTCTLR];
 b:=b or $10;
 port[INTCTLR]:=b;
 b:=port[LCR];
 b:=b and $7F;
 port[LCR]:=b;
 port[IER]:=$0;
 port[MCR]:=$0;
 port[$20]:=$20;
 setintvec($0C,VettoreAsync);
end;
procedure Comunica;
var outcar,incar:char;
begin
 SvuotaBuffer;
 repeat
  if(carinbuf>0)then
    begin
     textcolor(11);
     incar:=leggicar;
     if incar in [#32..#126]then
        write(incar)
     else if(incar=CR)then
        writeln;
    end;
  if keypressed then
    begin
     textcolor(12);
     outcar:=readkey;
     if(outcar<>#27)then
    begin
        inviacar(ord(outcar));
        if outcar=CR then
           writeln
        else
           write(outcar);
       end;
    end;
 until outcar=#27;
end;
begin
 clrscr;
 PredisponiSeriale(1,2400,1,7,'E');
 AttivaPorta;
 Comunica;
 writeln;
 write('Chiusura comunicazione...');
 disattivaporta;
 readkey;
end.