- Mitglied seit
- 15 Mrz 2010
- Beiträge
- 19
- Punkte für Reaktionen
- 0
- Punkte
- 0
Hallo zusammen,
ich bin seit einiger Zeit drüber, meine Wechselrichter mittels Fritz-Box (freetz) über ein RS232 Converter auszulesen. Über meinen XP-Rechner klappt diese Wunderbar. Ich bekomme leider die Einstellungen der Schnittstelle unter Linux nicht zum laufen.
Nach dem Senden der ersten 10 Bytes bekomme ich eine Antwort der Wechselrichter, wobei hier das erste Byte fehlt. Anschließend kann ich über mein c-Programm keinen Bytestrom mehr senden.
Nur das Ein/Ausstecken des Adapters, bzw. ein "echo hallo > /dev/ttyUSB0"
hilft weiter.
Ich habe schon alles versucht, komme aber leider nicht dahinter, was mir fehlt.
Hier sind die Einstellungen, die unter Windows von dem Programm des Herstellers durchgeführt werden:
Unter Windows setze ich nur folgendes:
Hier meine Einstellungen des ttyUSB0 auf Linux:
Hier der Ausschnitt des C-Codes, mit dem ich das alles setze:
Kann mir hier jemand weiterhelfen, bin echt am verzweifeln.
Danke
ich bin seit einiger Zeit drüber, meine Wechselrichter mittels Fritz-Box (freetz) über ein RS232 Converter auszulesen. Über meinen XP-Rechner klappt diese Wunderbar. Ich bekomme leider die Einstellungen der Schnittstelle unter Linux nicht zum laufen.
Nach dem Senden der ersten 10 Bytes bekomme ich eine Antwort der Wechselrichter, wobei hier das erste Byte fehlt. Anschließend kann ich über mein c-Programm keinen Bytestrom mehr senden.
Nur das Ein/Ausstecken des Adapters, bzw. ein "echo hallo > /dev/ttyUSB0"
hilft weiter.
Ich habe schon alles versucht, komme aber leider nicht dahinter, was mir fehlt.
Hier sind die Einstellungen, die unter Windows von dem Programm des Herstellers durchgeführt werden:
Code:
IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate
Baud Rate=19200
IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate
IOCTL_SERIAL_SET_RTS: Set RTS
IOCTL_SERIAL_SET_RTS: Set RTS
IOCTL_SERIAL_CLR_DTR: Clear DTR
IOCTL_SERIAL_CLR_DTR: Clear DTR
IOCTL_SERIAL_SET_LINE_CONTROL: Set line control
WordLength=8
StopBits=1 stop bit
Parity=No parity
IOCTL_SERIAL_SET_LINE_CONTROL: Set line control
IOCTL_SERIAL_SET_CHARS: Set special characters
EofChar=0x1a
ErrorChar=0x0
BreakChar=0x0
EventChar=0x1a
XonChar=0x11
XoffChar=0x13
IOCTL_SERIAL_SET_CHARS: Set special characters
IOCTL_SERIAL_SET_HANDFLOW: Set handshake information
ControlHandShake=0
FlowReplace=64
XonLimit=1024
XoffLimit=1024
IOCTL_SERIAL_SET_HANDFLOW: Set handshake information
IOCTL_SERIAL_CLR_RTS: Clear RTS
IOCTL_SERIAL_CLR_RTS: Clear RTS
IOCTL_SERIAL_SET_TIMEOUTS: Set timeouts
ReadIntervalTimeout=4294967295
ReadTotalTimeoutMultiplier=4294967295
ReadTotalTimeoutConstant=4294967294
WriteTotalTimeoutMultiplier=0
WriteTotalTimeoutConstant=200
IOCTL_SERIAL_SET_TIMEOUTS: Set timeouts
IOCTL_SERIAL_SET_WAIT_MASK: Set current event mask
WaitMask=RXCHAR: Any Character received, RXFLAG: Received certain character, CTS: CTS changed state, DSR: DSR changed state, RLSD: RLSD changed state, BREAK: BREAK received, ERR: Line status error occurred, RING: Ring signal detected
IOCTL_SERIAL_SET_WAIT_MASK: Set current event mask
IOCTL_SERIAL_SET_QUEUE_SIZE: Set queue size
InSize=4096
OutSize=2048
IOCTL_SERIAL_SET_QUEUE_SIZE: Set queue size
IOCTL_SERIAL_SET_WAIT_MASK: Set current event mask
WaitMask=None
IOCTL_SERIAL_SET_WAIT_MASK: Set current event mask
IOCTL_SERIAL_CLR_DTR: Clear DTR
IOCTL_SERIAL_CLR_DTR: Clear DTR
IOCTL_SERIAL_PURGE: Purge requests
Purge mask=RXABORT: Receive buffer, RXCLEAR: Write buffer
IOCTL_SERIAL_PURGE: Purge requests
IOCTL_SERIAL_PURGE: Purge requests
Purge mask=TXABORT: Read requests, TXCLEAR: Write requests
IOCTL_SERIAL_PURGE: Purge requests
Unter Windows setze ich nur folgendes:
Code:
mode com1 baud=19200 data=8 parity=n octs=off odsr=off xon=off dtr=on rts=off to=off
Status von Gerät COM1:
----------------------
Baudrate: 19200
Parität: None
Datenbits: 8
Stoppbits: 1
Zeitlimit: OFF
XON/XOFF: OFF
CTS-Handshaking: OFF
DSR-Handshaking: OFF
DSR-Prüfung: OFF
DTR-Signal: ON
RTS-Signal: OFF
Hier meine Einstellungen des ttyUSB0 auf Linux:
Code:
speed 19200 baud; rows 24; columns 80;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = <undef>; eol = <undef>; eol2 = <undef>; swtch = <undef>;
start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 8; time = 50;
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten -echo -echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
Hier der Ausschnitt des C-Codes, mit dem ich das alles setze:
Code:
inittty()
{
ffd = fopen(devicename,"r+");
if(!ffd){
printf("fil_des.c -> open_file -- open() return Wert == -1 : ABBRUCH\n");
exit(0);
}
read_fd = fileno( ffd );
setbuf ( ffd , NULL );
fcntl(read_fd, F_SETFL, FASYNC | O_NONBLOCK );
bzero(&newtio, sizeof(newtio)); /* clear struct for new port settings */
tcgetattr(read_fd,&oldtio);
newtio=oldtio;
newtio.c_cflag &= ~PARENB;
newtio.c_cflag &= ~CSTOPB;
newtio.c_cflag &= ~CSIZE;
newtio.c_cflag = BAUDRATE | CS8;
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_oflag |= OPOST;
newtio.c_oflag |= ONLCR;
newtio.c_lflag &= ~(ICANON|ECHOE| ECHO|ISIG );
newtio.c_cflag &= ~CRTSCTS;
newtio.c_iflag &= ~(INPCK | ISTRIP|PARMRK|IGNPAR);
newtio.c_cc[VSTART] = 0x11;
newtio.c_cc[VSTOP] = 0x13;
newtio.c_cc[VEOF] = 0x00;
newtio.c_cc[VMIN] = 8;
newtio.c_cc[VTIME] = 50;
tcflush(read_fd, TCIFLUSH);
tcflow(read_fd, TCOOFF);
int r= tcsetattr(read_fd,TCSAFLUSH,&newtio);
int dtr_bits = TIOCM_DTR;
int rts_bits = TIOCM_RTS;
int le_bits = TIOCM_LE;
int led_bits = N_TTY;
ioctl(read_fd,TIOCMBIS,&le_bits);
ioctl(read_fd,TIOCMBIS,&dtr_bits);
ioctl(read_fd,TIOCMBIS,&rts_bits);
ioctl(read_fd,TIOCSETD,&led_bits);
}
Danke
Zuletzt bearbeitet: