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