[rešeno] Serial port RS232 in ECHO OFF v C-u
vilko
Član
Pozdravljeni,
Kar se linuxa in C-a tiče, sem začetnik, zato prosim za potrpljenje in pomoč.
Nabavil sem Beagleboard
http://beagleboard.org/hardware
Na njem je Aengstrom Linux, za katerega mislim, da ni veliko drugačen kot so ostali Linuxi, vsaj ne v tistem delu, ki me tisšči. Naprava naj bi postala neke vrste master, ki naj bi upravljala mikroprocesorje tipa AVR (s tem imam nekaj malo izkušenj) po serijski liniji. Tako sem se lotil pisanja testnega programa, ki komunicira po serijeskem portu z enim mojim mikroprocesorje in sem uspel. RS232 sem se učil po sledečem dokumentu:
http://www.easysw.com/~mike/serial/serial.html
Problem nastane, ko je potrebno RS232 linijo (ki je full duplex) premostiti na RS485 linijo (parico, ki je Semiduplex, a multi user). Nagaja mi ECHO ki ga linux vrača na linijo, in s tem povzroči kolizijo.
Vprašanje, pri katerem mi prosim pomagajte: Kako linuxu dopovedati, da ne želim ECHO na serijskih vratih.
Poizkušal sem v C-u s tem da sem varriiral parametre options.c_iflag , ki sledijo:
A brez uspeha. Echo je bil vedno prisoten.
Kar se linuxa in C-a tiče, sem začetnik, zato prosim za potrpljenje in pomoč.
Nabavil sem Beagleboard
http://beagleboard.org/hardware
Na njem je Aengstrom Linux, za katerega mislim, da ni veliko drugačen kot so ostali Linuxi, vsaj ne v tistem delu, ki me tisšči. Naprava naj bi postala neke vrste master, ki naj bi upravljala mikroprocesorje tipa AVR (s tem imam nekaj malo izkušenj) po serijski liniji. Tako sem se lotil pisanja testnega programa, ki komunicira po serijeskem portu z enim mojim mikroprocesorje in sem uspel. RS232 sem se učil po sledečem dokumentu:
http://www.easysw.com/~mike/serial/serial.html
Problem nastane, ko je potrebno RS232 linijo (ki je full duplex) premostiti na RS485 linijo (parico, ki je Semiduplex, a multi user). Nagaja mi ECHO ki ga linux vrača na linijo, in s tem povzroči kolizijo.
Vprašanje, pri katerem mi prosim pomagajte: Kako linuxu dopovedati, da ne želim ECHO na serijskih vratih.
Poizkušal sem v C-u s tem da sem varriiral parametre options.c_iflag , ki sledijo:
// sledeči c_lflag je originalen .......
options.c_lflag |= (ICANON | ECHO | ECHOE ); /* canonical (line oriented) input - must terminate with LF or CR */
// options.c_lflag |= (ICANON ); // vseeno dobivam echo
// options.c_lflag |= (ICANON ); // tudi popolnoma brez parametrov dobivam echo
// sedaj poizkusim resetirati echo:
// options.c_lflag &= ~( ECHO | ECHOE ); // še vedno dobivam echo ampak pri tej opciji nimam več kontrole
// lahko ustavim program, potem pa ne bere več ukazov in moram startati nov Putty
options.c_iflag &= ~(IXON | IXOFF | IXANY); /* disable SW flow control */
/* Set the new options for the port... */
tcsetattr(fd, TCSANOW, &options);
fd = open(\"/dev/ttyS2\", O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);
if (fd == -1) perror(\"open_port: Unable to open /dev/ttyS0 - \");
else fcntl(fd, F_SETFL, FNDELAY);
return (fd);
A brez uspeha. Echo je bil vedno prisoten.
Komentarji
Vključil sem v program sledeči ukaz, da bi izklopil echo: Program se obnaša enako, a echo je izginil pri tipkanju komand v bash, tako
da moram tipkati na slepo in komanda se izvede izza vilko# sem vtipkal dir, ki se ne vidi in dobil odziv, torej je echo izklopljen v bash-u, kaj pa v mojem programu? nič, še vedno je ostal, kar vidim na osciloskopu.
Dajmo, dajmo, naj mi nekdo pomaga! prosim! Saj ste na tem forumu zbrani mojstri za Linux in C, kaj ne?
Napaka, ker sem enostavno kopiral vzorce.
Vzorec je imel open izza tcsetattr ukaza, torej tcsetattr ukaz ni imel pravega fileid parametra in je postavljal parametre na standartni terminal namesto na mojega.
kogar zanima, vsej je napiesano v
http://pubs.opengroup.org/onlinepubs/009604599/basedefs/xbd_chap11.html#tag_11
S tem dokumentom je verjetno ta tema zaprta.
Lep pozdrav