C-ben rs485 használata rs232-es porton.

 ( SzekiPepe | 2008. június 11., szerda - 21:03 )

Sziasztok,

Linux-on próbálkozok megoldani a következőt:
Van néhány rs485-ös buszon lévő modul nálam és szeretném C-ben
megoldani az adatkommunikációt. Lentebb elküldöm a port inicializálást
C-ben. Persze a modul rs232-re van kötve, USB-soros portot használok.
Ha windowson bekötöm az usb serial-t akkor minden rendben PORT
figyelővel. ( Ki kell kapcsolni a FIFO-t és 9600, 8N1-en beállításokkal
működik windowson. )

A probléma ott kezdődik, hogy az adatcsomagok szépen jönnek
befele, de az egyik modul 8. vagy 9. küldött byte-ja egy bizonyos
beállításnál hibásan érkezik meg ( 0x0D helyett 0x0A jön ).

Okozhatja ezt a kernel? Vagy esetleg valamit rosszull állítottam be hozzá?

Köszi a segítséget,
Pepe

( A kód ide tartotó része a köv postban lesz! )

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

A kód:
struct termios options;

tcgetattr(fd, &options);

cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);

options.c_cflag |= (CLOCAL | CREAD);

/* Karaktermeret, paritas beallitasa */
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;

/* Hardware, software flow control kikapcsolasa */
options.c_cflag &= ~CRTSCTS;
options.c_iflag &= ~(IXON | IXOFF | IXANY);

/* RAW input */
options.c_lflag &= ~(ICANON | ECHO | ISIG);

/* Port beallitasa az uj parameterekkel */
tcsetattr(fd, TCSANOW, &options);

/* rts, dts -> off */
setrts(fd,0);
setdtr(fd,0);

setrts es a setdtr be/ki kapcsolatja az rts/dtr jelet. Ha kuldeni
szeretnek kellene az rts bekapcsolnom, ez mukodik is gond nélkül.

Pepe

1 tipp. nekem úgy rémlik, hogy a windowson a 0x0D (\r) 0x0A (\n) karaktersorozat a sztring termináló karakter, míg linuxon 0x0A (\n), és ezért kapsz 0x0A-t lezáró karakternek.

de ez csak egy tipp.

Nincs sor vege a rendszerben - folyamatos byte streamet kapok, de lehet hasonlo az indoka! Utananezek.

Koszi!

Pepe

Hát tényleg ez volt a gond, ahogy olvastam az adatokat, pont az adatsor végére került.

Megoldás:
A szoftver flow kontrolt átírtam ilyenre:
options.c_iflag &= ~(IGNBRK | IGNCR | INLCR | ICRNL | IUCLC | IXANY | IXON | IXOFF | INPCK | ISTRIP);
options.c_iflag |= (BRKINT | IGNPAR);
options.c_oflag &= ~OPOST;
options.c_lflag &= ~(XCASE|ECHONL|NOFLSH);

Köszi,
Pepe