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ások
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