PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RS232 Programmierung



mynonA
13.08.03, 10:13
hallo, ich möchte mich mal unter linux mit der rs232 programmierung ausseten (und meine RS232 klasse (komplett winapi) portieren, könnte mir einer links geben zu den kommandos zur rs232 ansteuerung (ps wie die rs232 aufgebaut ist weiß ich also die leitungen,... es geht mir nur um das programmieren)

slime
14.08.03, 13:10
hi,
also was du willst ist also die programmiertechnischen grundlagen um die serielle schnittstelle anzusteuern?

ich hba einfach mal im lirc_serial modul nachgesehen. außerdem ist beim kernel bei drivers/i2c/i2c-elv.c auch noch eine datei in der der par-port angesteuert wird. ich hab die beiden sachen gemixt und mir ein modul für mein serielles i²c interface gebaut.
das sieht dann ungefähr so aus:


#define BASE (unsigned int)(data)
#define DATA BASE /* Serial Data Port */
#define MSR (BASE+6) /* Modem Status Registe (READ) */
#define MCR (BASE+4) /* Modem Control Register (WRITE) */

static void bit_elvs_setscl(void *data, int state)
{
if (state) {
PortData |= 0x02; /* setze high */
} else {
PortData &=0xfd; /* setze low */
}
outb(PortData, MCR);
}

im prinzip ist das einzige was du brauchst inb() und outb(); wenn du kernel-sachen baust musst du zudem noch die adress-region für dich beanspruchen.


if (check_region(base,8) ) {
return -ENODEV;
} else { /* test for serial adapter */
/* hier hab ich mal was gekürzt, es wird nachgesehen ob die hardware auch vorhanden ist */
request_region(base,8,"i2c (serial adapter)");
}


ich hoffe mal das war ungefähr das was du wissen wolltest.
mfg carsten

zonendoedel
14.08.03, 18:31
Kannst aber auch über das Betriebsystem gehen, und die Geräte /dev/ttyS0 und /dev/ttyS1 ansprechen.
Ich habe damit mal eine alte Digicam angeschlossen

Includes in etwa

#include <termios.h>
#include <sys/types.h>
#if HAVE_SYS_TIME_H
# include <sys/time.h>
#endif
#include <sys/fcntl.h>
#include <sys/param.h>

dann z.B. Baudrate setzen

/* termios */
struct termios tio;

if (tcgetattr(fd, &tio) < 0)
{
return RC_BAUD_SET;
}

tio.c_iflag = 0;
tio.c_oflag = 0;
tio.c_cflag = CS8 | CREAD | CLOCAL;
tio.c_lflag = 0;
tio.c_cc[VMIN] = 1;
tio.c_cc[VTIME] = 5;
cfsetispeed(&tio, baudconv(baud));
cfsetospeed(&tio, baudconv(baud));
tcsetattr(fd, TCSANOW, &tio);

oder Schreiben auf das Device
wlen = write(fd0, &buf[i], 1);

oder was lesen

// den descriptor set loeschen
FD_ZERO(&rdfd);

// den device descriptor von serial eintragen
FD_SET(fd0, &rdfd);

maxfd = fd0;
// timeout: 2sec
t.tv_sec = 2;
t.tv_usec = 0;
switch (select(maxfd + 1, &rdfd, NULL, NULL, &t))
{
case -1:
if (errno == EINTR)
break;
return RC_SELECT;
case 0:
dprintf((stderr, "read timeout.\n"));
return RC_TIMEOUT;
default:
break;
}

// wenn von meinem descriptor was da ist
if (FD_ISSET(fd0, &rdfd))
{
len = read(fd0, buffer,lenght);
}

usw.