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?
- 2473 megtekintés
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.
- A hozzászóláshoz be kell jelentkezni
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 :) )
- A hozzászóláshoz be kell jelentkezni
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;
}
- A hozzászóláshoz be kell jelentkezni
Köszönöm, ebből már valahogy összeberehelem.
- A hozzászóláshoz be kell jelentkezni
javaslom: man ioperm(), inb(), outb()
Példaprogram -> ftp: public@meditor.hu
A jelszó egy [enter]
innen: c_examples alól a musica.c, amely megmutatja, hogyan
kell c alól direktbe portot kezelni. (A program egyébként
a PC hangszóróját pöcögteti.)
Üdv: meditor
- A hozzászóláshoz be kell jelentkezni
ezt még jobban köszönöm :)
- A hozzászóláshoz be kell jelentkezni
Azért a TIOCMGET, TIOCMSET kicsit rugalmasabb, pl. nem kell hozzá portcímeket hardkódolni, vagy vadászgatni. Meg megy USB-s soros vonallal is.
- A hozzászóláshoz be kell jelentkezni
A chip LÁBÁT akarja pöcögtetni, ehhez szerintem közvetlen
porthozzáférés kell.
- A hozzászóláshoz be kell jelentkezni
Elvileg Gumstixon fog futni, szerintem nem probléma.
- A hozzászóláshoz be kell jelentkezni
Mi az a Gimstix?
> Sol omnibus lucet.
- A hozzászóláshoz be kell jelentkezni
gumstix: http://www.gumstix.org/
Engemet csak az erdekelne, hogy van-e magyarorszagi vendor?
Udv Zoli
- A hozzászóláshoz be kell jelentkezni
Sajnos nincs, a cég akinek kell a cucc hoz be nekünk.
- A hozzászóláshoz be kell jelentkezni
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ó...
- A hozzászóláshoz be kell jelentkezni
Nem kell olyan hű de nagy mintavételezés, szóval nagy eséllyel nem lesz belőle probléma.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni