Kommunikation über RS232 mit Externem Gerät



  • Hallo zusammen,

    ich habe an den seriellen Port eines Linux Rechners einen Newport Motion Controller MM4005 angeschlossen.
    KDE Version 3.5.5
    Linux version 2.6.24.3
    Debian 4.1.1-21
    Machine: i686

    Ich möchte mit diesem Gerät kommunizieren, d.h. Befehle senden und Rückmeldungen empfangen. Laut Handbuch sendet das Gerät nur auf Anfrage Werte.
    Ich habe nun folgendes kleines C++ Makro zum Testen der Kommunikation

    char *buffer;
    float pos1,pos2;
    char* szData;
    int main()
    {
    int rs232ali=open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
    if (rs232ali == -1 )
    {
    perror("open_port: Unable to open /dev/ttyS0 - ");
    }
    else
    {
    printf("Port RS232 has been sucessfully opened and %d is the file description\n",rs232ali);
    }
    szData="1TP";
    write( rs232ali, szData, sizeof(szData));
    pos1=read(rs232ali,buffer,10);
    printf("Motor Status: Achse 1 ist an Position %d \n",pos1);
    close(rs232ali);
    }
    

    Der Rückgabewert sollte ein Float sein. Es kommt auch ein Wert zurück, jedoch nur 0, was nicht richtig ist. Dann habe ich folgendes versucht:

    szData="1MS";
    write( rs232ali, szData, sizeof(szData));
    pos1=read(rs232ali,buffer,10);
    printf("Motor Status: Achse 1 ist %d \n",pos1);
    

    Dieser Befehl sollte als Rückgabewert ein ASCII liefern. Ich bekomme aber -1, was meiner Meinung nach auf einen Fehler hindeutet.
    Ich habe auch folgendes versucht:

    szData="1MS";
    write( rs232ali, szData, sizeof(szData));
    

    Dies sollte eigentlich dazu führen, dass an dem Gerät ein Lämpchen angeht. Es tut sich jedoch nichts. Daher vermute ich, dass schon write nicht funktioniert.

    Kann mir vielleicht jemand helfen? Das wäre wunderbar.
    Vielen Dank.



  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hi,

    der Parameter "| O_NDELAY" sorgt dafür, das der Aufruf sofort beendet wird,
    wenn kein Zeichen vorhanden ist. Lasse diesen Parameter mal weg.

    Schau mal hier, das könnte Dir helfen. Leider kämpfe ich derzeit auch mit einer RS232 Verbindung. Hier jedoch mit einem Handshake, wo mir Zeichen verloren gehen.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-240887.html

    Deine Routine sollte damit aber zu bedienen sein.
    Verwende die Init und tty_read() .

    Gruss


Anmelden zum Antworten