Newsgroup: it.comp.lang.pascal
Titolo: porte seriali

ciao a tutti
dovrei scrivere un piccolo programma che permetta a due computer di
comunicare tra loro tramite le porte seriali. I due computer sono MS-DOS;
volevo scriverlo in Turbo Pascal oppure (meglio) in Assembler.
Qualcuno mi può dare qualche dritta, link, tutorials (anche in inglese)?
grazie, ciao


Ti mando una unit per gestire le porte seriali.
Se non riesci a utilizzarla scrivimi una e-mail.
Ciao
Unit Seriali;
Interface
Uses Dos;
Const BufferMAX = (1024*4)-1;
Const      COM1 = 1;
           COM2 = 2;
           COM3 = 3;
           COM4 = 4;
        Nessuna = 0;
           Pari = 3;
        Dispari = 1;
        Segnata = 5;
        Marcata = 5;
         Spazio = 7;
Var CarInBuffer : Boolean;
    CarInBuf,
    CircOut,
    CircIn : Integer;
Procedure AttivaSER(PortSER : Integer);
Procedure DisattivaSER;
Procedure SvuotaBufferSER;
Function RiceviSER : Char;
Procedure InviaSER(Car : Char);
Procedure InitSeriale(Seriale : Integer; Baud : Longint; Parita,BitChar,BitStop : Integer);
Implementation
Type TypeBuffer = Array[1..BufferMAX] Of Char;
Var Seriale : Integer;
    Porta : Word;
    Buffer : ^TypeBuffer;
    Interr : Byte;
    VecchioInt : Pointer;
Procedure SvuotaBufferSER;
 Begin
    CircIn := 1;
    CircOut := 1;
    CarInBuf := 0;
    FillChar(Buffer^,BufferMAX,0);
 End;
Procedure InterrSeriale; Interrupt;
 Begin
    Inline($FB);
    If (CarInBuf < BufferMAX) Then Begin
      Buffer^[CircIn] := Chr(Port[Porta]);
      If (CircIn < BufferMAX) Then Inc(CircIn)
        Else CircIn := 1;
      Inc(CarInBuf);
     End;
    CarInBuffer := CarInBuf > 0;
    Inline($FA);
    Port[$20] := $20;
 End;
Function RiceviSER : Char;
 Var Ch : Char;
 Begin
    If CarInBuf > 0 Then Begin
       RiceviSER := Buffer^[CircOut];
       If CircOut < BufferMAX Then Inc(CircOut)
         Else CircOut := 1;
       Dec(CarInBuf);
     End;
    CarInBuffer := CarInBuf > 0;
 End;
Procedure InviaSER(Car : Char);
 Begin
    While (Port[Porta+5] And $20) <> $20 Do;
    Port[Porta] := Ord(Car);
 End;
Procedure AttivaSER(PortSER : Integer);
 Var B : Byte;
 Begin
    New(Buffer);
    Seriale := PortSER;
    Case Seriale Of
      1 : Porta := MemW[$0040:$0000];
      2 : Porta := MemW[$0040:$0002];
      3 : Porta := MemW[$0040:$0004];
      4 : Porta := MemW[$0040:$0006];
     End;
    If Seriale = 1 Then Interr := $0C Else Interr := $0B;
    SvuotaBufferSER;
    GetIntVec(Interr,VecchioInt);
    SetIntVec(Interr,Addr(InterrSeriale));
    B := Port[$21];
    B := B And $EF;
    Port[$21] := B;
    B := Port[$3FB];
    B := B And $7F;
    Port[$3FB] := B;
    Port[$3F9] := $01;
    Port[$3FC] := $08 Or $0B;
    Port[$3FE] := $80;
    Port[$20] := $20;
 End;
Procedure DisattivaSER;
 Begin
    SetIntVec(Interr,VecchioInt);
    Dispose(Buffer);
 End;
Procedure InitSeriale(Seriale : Integer; Baud : Longint; Parita,BitChar,BitStop : Integer);
 Var ValBaud : Word;
     Setta : Byte;
     Porta : Word;
     Reg : Registers;
 Begin
    Intr($11,Reg);
    If Seriale <= ((Reg.AX And $0E00) Div 512) Then Begin
      Case Seriale Of
        1 : Porta := MemW[$0040:$0000];
        2 : Porta := MemW[$0040:$0002];
        3 : Porta := MemW[$0040:$0004];
        4 : Porta := MemW[$0040:$0006];
       End;
      Setta := 0;
      If Baud =    110 Then ValBaud := $0417 Else
      If Baud =    150 Then ValBaud := $0300 Else
      If Baud =    300 Then ValBaud := $0180 Else
      If Baud =    600 Then ValBaud := $00C0 Else
      If Baud =   1200 Then ValBaud := $0060 Else
      If Baud =   1800 Then ValBaud := $0040 Else
      If Baud =   2400 Then ValBaud := $0030 Else
      If Baud =   3600 Then ValBaud := $0020 Else
      If Baud =   4800 Then ValBaud := $0018 Else
      If Baud =   9600 Then ValBaud := $000C Else
      If Baud =  14400 Then ValBaud := $0008 Else
      If Baud =  19200 Then ValBaud := $0006 Else
      If Baud =  38400 Then ValBaud := $0003 Else
      If Baud =  57600 Then ValBaud := $0002 Else
      If Baud = 115200 Then ValBaud := $0001
        Else ValBaud := 119000 Div Baud;
      Port[Porta+3] := 128;
      Port[Porta+1] := Hi(ValBaud);
      Port[Porta] := Lo(ValBaud);
      Case BitChar Of
        5 : Setta := Setta Or 0;
        6 : Setta := Setta Or 1;
        7 : Setta := Setta Or 2;
        8 : Setta := Setta Or 3;
       End;
      If BitStop = 1 Then Setta := Setta Or 0
        Else Setta := Setta Or 4;
      Case Parita Of
        Nessuna : Setta := Setta Or (0 Shl 3);
           Pari : Setta := Setta Or (3 Shl 3);
        Dispari : Setta := Setta Or (1 Shl 3);
        Segnata : Setta := Setta Or (5 Shl 3);
         Spazio : Setta := Setta Or (7 Shl 3);
       End;
      Port[Porta+3] := Setta;
     End;
 End;
Begin
   Seriale := COM1;
   Porta := MemW[$0040:(COM1-1)*2];
End.

Nella mia home page:
http://CariStudenti.CS.UniBO.IT/~caucci/index.shtml
potrai trovare un semplice programma asm8086 che permette di chattare tra
due computer. Clicca su "I miei programmi" e preleva il file CHAT232.ASM .
Per compilarlo ho usato TASM e TLINK.
Scrissi questo programma 3 anni fa per un progetto scolastico, sicuramente
contiene qualche bug, se ne scopri qualcuno, fammelo sapere   ;-)
ciao!
int _,__,___=0x3e8,____,_____[2,21,1978];main(){for(;__<=___;_____
/*  Luca Caucci'78  */ [__++]++);for(__=1,printf("e = 2.");____=0,
/*
cau...@cs.unibo.it
*/ __<=___;printf("%06d",____),++__)for(_=___;
_>=2;_____[_]=(____+=___*___*_____[_])%_,____/=_--);printf("\n");}
