Serial Port Kommunikation funktioniert mit STTY und CAT - nicht aber mit C++



  • Hi! 🙂

    Ich möchte mit meinem C++ Programm, welches auf einem "Digi Connect Modul 9210" (dort läuft ein Embedded Linux) laufen soll, Daten auf einen Serial Port schreiben und anschließend die Antwort von einem Sensor lesen.
    Den Port öffnen und darauf schreiben funktioniert, leider bekomme ich aber keine Antwort. Die grundlegenden Einstellungen (9600 Baud, 8 Datenbits, 1 Stopbit, keine Parity) sind korrekt, da ich von Windows aus mit diesen Einstellungen mit dem Sensor kommunizieren kann.
    Ich kann auch auf der Konsole im Embedded Linux folgendes eingeben:

    stty -F /dev/ttyS0 raw ispeed 9600 ospeed 9600 cs8 -ignpar -cstopb -echo
    cat < /dev/ttyS0 & echo $'\xFF\xFF\x02\x80\x00\x00\x82' > /dev/ttyS0
    

    und bekomme eine Antwort angezeigt. Leider nur seltsame Zeichen, da ich nicht weiß wie man die Ausgabe auf Hexadezimal umstellen kann.

    Hier ist das Programm, das ich versuche auszuführen:

    #include <stdio.h>
    #include <string.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <termios.h>
    #include <unistd.h>
    #include <stdlib.h>
    
    int main(int argc, char** argv)
    {
    	int fd; // port file descriptor
    	char port[20] = "/dev/ttyS0"; // port to connect to
    	fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY); // connect to port
    	if(fd == -1)
    	{
    		printf("Error while opening the port.\n");
    		return 1;
    	}
    	printf("Port opened successfully.\n");
    
    	fcntl(fd, F_SETOWN, getpid());
    	struct termios settings;
    	tcgetattr(fd, &settings);
    	settings.c_cflag &= ~(CBAUD | CSIZE | PARENB | CSTOPB);
    	settings.c_cflag |= B9600;
    	settings.c_cflag |= CS8;
    
    	tcflush(fd, TCIFLUSH);
    	tcsetattr(fd, TCSANOW, &settings); // apply the settings
    
    	int len = 7;
    	unsigned char bytes[len];
    	bytes[0] = 0xFF;
    	bytes[1] = 0xFF;
    	bytes[2] = 0x02;
    	bytes[3] = 0x80;
    	bytes[4] = 0x00;
    	bytes[5] = 0x00;
    	bytes[6] = 0x82;
    
    	int wr = write(fd, bytes, len);
    
    	if(wr != 7)
    	{
    		printf("Error while sending!\n");
    	}
    
    	int i;
    	for(i=0; i<len; i++)
    	{
    		printf("%X ", (unsigned int)bytes[i]);
    	}
    	printf("\n");
    	printf("%d bytes sent.\n", wr);
    
    	unsigned char answer[30];
    	sleep(1);
    	int rd = -1;
    
    	while (rd==-1)
    	{
    		printf("Trying to read...\n");
    		rd = read(fd, answer, 30);
    		sleep(1);
    	}
    
    	printf("%d\n", rd);
    
    	for(i=0; i<rd; i++)
    	{
    		printf("%X ", (unsigned int)answer[i]);
    	}
    	printf("\n\n");
    
    	close(fd);
    	return 0;
    }
    

    Hier ist die Ausgabe:

    / # ./TestSensor 
    Port opened successfully.
    FF FF 2 80 0 0 82 
    7 bytes sent.
    Trying to read...
    Trying to read...
    Trying to read...
    Trying to read...
    Trying to read...
    Trying to read...
    ^C
    

    Die read Funktion gibt also immer -1 zurück... Ich vermute, dass meine Serial Port Einstellungen falsch sind. Leider kenne ich mich nicht so gut mit den ganzen möglichen Einstellungen aus. Vielleicht sieht jemand ja einen offensichtlichen Fehler, warum es nicht funktioniert, aber anscheinend mit STTY und CAT klappt.
    Vielen Dank! 🙂



  • Hi,

    Das Problem ist gelöst, für alle die vielleicht dasselbe Problem haben:
    Ich musste in meiner /etc/inittab des Digis folgende Zeile auskommentieren:

    ::respawn:/bin/cttyhack /bin/sh -l
    

Anmelden zum Antworten