Seriovy port jeste jednou

Nesvacil Jiri nesvacil.jiri
Středa Březen 17 11:54:54 CET 2004


Tohle by snad mohlo stacit. Je to ovsem pro PC. S casovanim je predevsim
problem spise v PC, kdy se shodi signal RTS a program v PC jiz ma nekolik
byte v UARTu, vlastne shodim RTS a jeste prijde nekolik bytu. DSR a DTR muze
byt propojeno na konektorech obou stran (Linux je take nepouziva). Obecne by
asi melo platit, ze nastavim aktivni RTS a po prichodu casti bytu ho shodim
a z druhe strany jiz neprijde nic, jenze to je asi nerealizovatelne. Takze
ze zarizeni nastavit RTS a deaktivovat az zjistuji, ze se bizim ke konci s
bufferem. Ovsem musime pocitat s tim, ze prijdou jeste nejake byty. Je to
sice divne, ale tokto to u me chodi. Jestli ma nekdo lepsi napad, tak at se
ozve. Mozna ze by se nasel nejaky standard nekde v katalogach u cipu UARTu,
ale jak se vyporadat s programem, ktery kazdy napise jak chce.
JN

/* prenos.cpp, (c) 1992, Jiri Nesvacil */

#include<dos.h>

#define ON  1
#define OFF 0
#define ANO 1
#define NE  0

static char Jmeno[]={"(c) 1992, Jiri Nesvacil\x0\x0\x0"};
static int PrvVol={ANO};
static int Check={NE};


 void s_rts( int port, int nastav)
  {
  asm {
      mov  dx,port
      add       dx,4
      mov ax,nastav
      add al,al
      xchg ah,al

      in al,dx
      and al,0fdh
      or al,ah
      out dx,al
      }
  }

 int c_stav( int port)
  {
  int navrat;
  asm {
      mov  dx,port
      add dx,5
      in al,dx
      mov navrat,ax
      }
  navrat=navrat&0xFF;
  return(navrat);
  }

 int c_cti( int port)
  {
  unsigned char znak;
  int pomocna;
  long pocet;
  for( pocet=200000; pocet > 0 ; pocet-- ) {
    pomocna=c_stav( port);
    if( pomocna & 30) return( -1);
    if( pomocna & 1) break;
    }
  if( pocet == 0) return( -1);
  asm {
      mov dx,port
      in al,dx
      mov znak,al
      }
  return(( int)znak);
  }



void fox_bin( char far *kam) {
  int err=NE;
  int pocet;
  int com;
  int port;
  int znak;

  if( Kontrol( ) == NE) {
    *kam='E';
    return;
    }

  /* test existence comunikacni linky */
  if( *kam < '1' || *kam > '4') return;
  com=*kam-'1';
    asm {
      push      es
      push      bx
      mov       ax,040h
      mov       es,ax
      mov       bx,com
      add       bx,bx
      mov       ax,word ptr es:[bx]
      mov       port,ax
      pop       bx
      pop       es
      }
  if( port == 0) return;

  /* inicilazace komunikacni linky */
  if( (kam[1] & 0xdf) == 'I') {
    asm {
      push dx
      mov dx,com
      mov ah,0
      mov al,0e3h
      int 14h
      pop dx
      }
    return;
    }

  if( kam[1] != ' ') return;

  /* zkus precist znak nulovani vstupniho bufferu */
  asm {
      mov dx,port
      in al,dx
      }
  /* vynulovani chyb */
  c_stav( port);

  s_rts( port, ON);
  for( pocet=0; pocet < 10;pocet++) {
    znak=c_cti( port);
    if( znak == -1) {
      err=ANO;
      break;
      }
    if( znak < 16) {
      c_cti( port);
      break;
      }
    kam[pocet]=(char )znak;
    }
  s_rts( port, OFF);
  if(  err || pocet == 10 ) *kam='E';
  return;
  }


----- Original Message -----
From: Martin LOCKER <locker@vosrk.cz>
To: Multiple recipients of list <hw-news@list.gin.cz>
Sent: Monday, January 17, 2000 10:36 AM
Subject: Seriovy port jeste jednou


> Zkusim dotaz kolem serioveho portu trochu
> specifikovat, na minuly dotaz mi prisly
> odpovedi na neco jineho nez potrebuji.
> U seriove komunikace se pouzivaji pro hardwarovy
> handshaking signaly RTS/CTS, DSR/DTR.
> Potrebuji naprogramovat tento handshaking, ale
> nemohu zjistit jak cela transakce probiha. Je mi
> jasne co signaly znamenaji, ale nevim, kdy ktery
> nahodit a shodit?
> Nevim jestli vubec existuje nejaky standard
> tohoto rizeni, ale dane zarizeni funguje s PC.
> Jak v dosu, kdyz zapnu hw handshaking, tak ve
> Windowsech.
>
> Diky za pomoc
>
> Martin Locker
> e-mail: locker@vosrk.cz









Další informace o konferenci Hw-list