Hallo Leute,
ich habe hier ein eigenartiges Problem. Also ich habe ein Gerät, was mit mir per RS232 kommuniziert. Das Betriebssystem des Hosts ist Linux, die Gegenseite ist ein Mikrocontroller. Das funktioniert auch alles soweit. Aber ich habe folgendes Problem.
Ich sende ein 0xA8 und müsste ein Echo empfangen. Ich empfange aber nur 0x28. Mit anderen Worten: Es fehlt das erste Bit.
Folgender Code ist verantwortlich (Fehlerbehandlungen sind entfernt):
int devicehandle;
struct termios options;
unsigned char buffer[1];
//RS232-Kanal öffnen (lesen und Schreiben erlaubt)
devicehandle=open(device, O\_RDWR | O\_NOCTTY | O\_NDELAY);
fcntl(devicehandle, F\_SETFL, 0);
//RS232 konfigurieren
tcgetattr(devicehandle, &options);
//setzte baudrate
cfsetispeed(&options, B38400);
cfsetospeed(&options, B38400);
//Read und Local setzen
options.c\_cflag |= (CLOCAL | CREAD);
//gerade Parität, 1 Start&Stopbit, 8 Datenbits
options.c\_cflag |= PARENB; /\* Enable parity \*/
options.c\_cflag &= ~PARODD; /\* Turn odd off =\> even \*/
options.c\_cflag &= ~CSTOPB; /\* Set 1 Stopbit \*/
options.c\_cflag &= ~CSIZE; /\* Mask the character size bits \*/
options.c\_cflag |= CS8; /\* Select 8 data bits \*/
//Disable hardware flowcontrol
options.c\_cflag &= ~CRTSCTS;
//Raw Data Ausgabe
options.c\_oflag &= ~OPOST;
options.c\_oflag |= ONLCR;
//Raw data Einlesen mit Parity-check
options.c\_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c\_iflag |= (INPCK | ISTRIP);
//Set timeout to 1s
options.c\_cc[VMIN] = 0;
options.c\_cc[VTIME] = 10;
//Software flowcontrol ausschalten
options.c\_iflag &= ~(IXON | IXOFF | IXANY);
//Neue Einstellungen sofort auf Port übertagen
tcsetattr(devicehandle, TCSAFLUSH, &options);
//Puffer leeren
tcflush(devicehandle, TCIFLUSH);
//Hier geht das senden und empfangen los.
buffer[0]=0xA8;
printf("Sende %02X\n", buffer[0]); //reelle Ausgabe ist hier: A8
write(devicehandle, buffer, 1);
tcdrain(devicehandle); //warten, bis alles gesendet.
read(devicehandle, buffer, 1);
printf("Empfange %02X\n", buffer[0]); //Ausgabe sollte sein A8, ist aber 28
close(devicehandle);
Sieht für mich irgendwie normal aus. Das Oszi-Bild ist auf Sende- und Empfangsseite identisch. Ich gehe also davon aus, dass er tatsächlich ein richtiges Echo schickt.
Ich versteh die Welt nicht mehr.
Günther