sorosport lábainak lekérdezése

Fórumok

Szervusztok!

A feladat a következő lenne. Sorosport lábait kéne lekérdeznem C-ben. Elolvastam pár howtot, köztük a Serial programming howtot, de nem sikerült kihámozni belőle. Nem kell semmi terminálhuzavona, simán egy láb értékét kéne lekérdeznem. Milyen howtot vagy egyéb leírást ajánlatok?

Hozzászólások

Akkor csak a vezérlőjelek állapotára vagy kíváncsi?
Itt találsz bővebben: Dr. Kónya László PC-elektronika 1991 ISBN 963 10 90116

Ha kicsit vársz, adok egy kis segítséget.

COM 1-nél: (3F8)

cts:=(port[$3fe] and 16) shr 4;
dsr:=(port[$3fe] and 32) shr 5;
ri:=(port[$3fe] and 64) shr 6;
dcd:=(port[$3fe] and 128) shr 7;

(Ez TP és DOS-os, de kiindulásnak jó lesz :) )

talán segít az alábbi kódrészlet... Linuxra lett írva és egy infravörös vevőt "irányít", de gondolom az főképp az API érdekel...
A devname az: /dev/ttyS0


#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termio.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/poll.h>
#include <signal.h>

#define BAUDRATE B9600

void power_on(int handle)
{
    unsigned int s;
    int         n;
    n = ioctl(handle, TIOCMGET, &s);
    s |= TIOCM_DTR | TIOCM_RTS;
    n = ioctl(handle, TIOCMSET, &s);
}

void power_off(int handle)
{
    unsigned int s;
    int         n;

    n = ioctl(handle, TIOCMGET, &s);
    s &= ~(TIOCM_DTR | TIOCM_RTS);
    n = ioctl(handle, TIOCMSET, &s);
}

int init_ir_adapter(const char *devname)
{
    int fd, n, d;
    char b[2];

    struct termios tio;
    fd = open(devname, O_RDWR | O_NOCTTY);
    if (fd < 0) {
        return 0;
    }

    bzero(&tio, sizeof(tio));
    tio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
    tio.c_iflag = IGNBRK | IGNPAR ;
    tio.c_oflag = 0;
    tio.c_lflag = 0;

    tcflush(fd, TCIFLUSH);
    tcsetattr(fd, TCSANOW, &tio);

    power_off(fd);
    usleep(250000);
    power_on(fd);
    usleep(250000);

    /* flushing buffer */
    ioctl(fd, TCFLSH, TCIFLUSH);

    b[0] = 'I';
    write(fd, &b[0], 1);
    usleep(2000);
    b[0] = 'R';
    write(fd, &b[0], 1);

    usleep(300000);

    d = ioctl(fd, TIOCINQ, &n);

    b[0] = 0;b[1] = 0;
    if (n == 2) {
        n = read(fd, b, 2);
        if ((b[0]=='O') && (b[1]=='K')) {
            return fd;
        }
    }
    close(fd);
    return -1;
}

Köszönöm, ebből már valahogy összeberehelem.

Na... ha direkt portot használsz, akkor számolnod kell azzal, hogy összetűzésbe kerülhetsz a soros port driverével, ha van ilyen a kernelben... Meg a nagy hátránya a direkt elérésnek, hogy nem sok esélyed van adatküldésre/fogadásra, mert ugye multitaszking oprendszereknél nem garantál neked semmi komolyabb időzítést meg semmi esélyed megszakításokat használni... Persze itt most csak néhány láb bizgetéséről van szó...

Persze hogy a LÁBÁT! Hát milyen lábai vannak egy nyomorult RS-232 vezérlőnek? Van neki Rx, Tx, GND, RI, DCD, CTS, DTR, RTS, DSR. Na ezekből az utóbbi 2 kimenet, azokat lehet pöcögtetni a TIOCMSET-tel. Az előttük levő 2 pedig bemenet, azokat lehet lekérdezni a TIOCMGET-tel. (Az RI-t meg a DCD-t még soha nem használtam, és nem tudom, hogy melyik kimenet, vagy bemenet.)
Ahhoz, hogy használni lehessen a CTS, DTR, RTS, DSR lábakat kézi vezérlésre, előbb ki kell kapcsolni a HW flowcontrol-t (ld. CRTSCTS és tcgetattr(...) illetve tcsetattr(...) ).
Hasznos olvasnivalók:
- man tty_ioctl
- man termios