Programmieren der seriellen Schnittstelle...

  1. dancedog

    dancedog Thread StarterMacUser Mitglied

    Mitglied seit:
    13.03.2005
    Beiträge:
    7
    Zustimmungen:
    0
    Hi, ich muss für ein Schulprojekt etwas mit dem Intelligent Interface von Fischertechnik programmieren. Diese Hardware ist schon etwas älter und benötigt einen seriellen Port. Ich hab mir einen Usb-Seriell Adapter besorgt und installiert (taucht unter /dev/tty.usbserial-blabla) auf.

    Nun habe ich folgendes Problem:
    So funktioniert das raussenden über die Schnittstelle:
    Code:
    #include<stdio.h>
    #include<unistd.h>
    #include<fcntl.h>
    
    int main()
    {
            FILE *fd;
    
            fd= fopen("/dev/tty.usbserial-FTCTD5IY","w");
    
            int i;
            for(i=0;i<=10000;i++);
            {
            fputc(193,fd);
            fputc(1,fd);
            }
    
            fclose(fd);
    }
    
    Dass das nicht schön ist, weiss ich. Deshalb habe ich mit termios auch etwas feineres versucht - klappt aber nicht. Jetzt bin ich mal ganz banal daran gegangen und hab es über Low-Level versucht:

    Code:
    #include<stdio.h>
    #include<string.h>
    #include<unistd.h>
    #include<fcntl.h>
    #include<errno.h>
    #include<termios.h>
    
    int main()
    {
            int fd;
            fd = open("/dev/tty.usbserial-FTCTD5IY", O_RDWR | O_NOCTTY | O_NDELAY);
            if(fd == -1)
            {
                    perror("Fehler beim Oeffnen:");
            }
    
            unsigned char befehl1=193;
            unsigned char befehl2=1;
    
            int i=0;
            for(i=0;i<20;i++)
            {
                    int rt=10;
                    rt = write(fd,&befehl1,1);
                    int rt2=10;
                    rt2 = write(fd,&befehl2,1);
    
                    if(rt == -1 || rt2 == -1)
                    {
                            perror("Fehler beim Schreiben");
                    }
            }
    
            close(fd);
    }
    
    Hierbei bleibt das Programm beim ersten write-Befehl hängen und macht nichts mehr!

    Innerhalb meine termios-Programms findet folgendes statt:
    -->schnipp
    Code:
    unsigned char firstbyte = 0xc1; //das gleich wie dez. 193
    rt1=write(fd, &firstbyte, 1);
    if(rt1 == -1)
         printf("Schreiben auf Schnittstelle: %s\n",strerror(errno));
    
    <---schnapp

    Wenn ich das Programm nun ausführe, kommt folgendes:
    --> Schreiben auf Schnittstelle: Resource temporarily unavailable


    Gibts da bei Apple einen Kniff, von dem ich nichts weiß?

    Hoffe, Ihr könnt mir helfen....bin langsam etwas ratlos.
    Achja, an den Permissions dürfte es nicht liegen, die sind:
    crw-rw-rw- 1 root wheel 8, 6 9 Aug 18:22 /dev/tty.usbserial-FTCTD5IY

    Gruß,
    Leon
     
    dancedog, 09.08.2006
  2. below

    belowMacUser Mitglied

    Mitglied seit:
    15.03.2004
    Beiträge:
    13.289
    Zustimmungen:
    1.086
    Komisch, dass das erste funktioniert, und das zweite nicht...

    Ich seh da im Moment auch nichts.

    Alex
     
    below, 10.08.2006
  3. vava

    vava

    vava, 10.08.2006
  4. dpr

    dprMacUser Mitglied

    Mitglied seit:
    04.04.2006
    Beiträge:
    519
    Zustimmungen:
    0
    Schuß ins Blaue, aber da es aus Deinem Beispiel nicht hervorgeht: Du hast die Schnittstelle aber schon mittels tcsetattr und den korrekten Werten für z.B. Parität, Stopbit etc. pp. initialisiert?

    http://www.erlenstar.demon.co.uk/unix/faq_4.html#SEC53

    EDITh meint: Und wieder zu langsam, aber offensichtlich auf dem richtigen Weg ;-)
     
  5. dancedog

    dancedog Thread StarterMacUser Mitglied

    Mitglied seit:
    13.03.2005
    Beiträge:
    7
    Zustimmungen:
    0
    Danke für eure Tipps. Besonders der Link zum Quelltextbeispiel ist richtig gut - irgendwie habe ich das Beispiel beim Streifzug durch die Dokumentation nicht gesehen - das werde ich mir näher anschauen.

    Ich melde mich nochmal und erzähle, woran es lag.

    Gruß,
    Leon
     
    dancedog, 10.08.2006
  6. moses_78

    moses_78MacUser Mitglied

    Mitglied seit:
    08.04.2005
    Beiträge:
    1.264
    Zustimmungen:
    22
    darf man fragen, was ,,tty.usbserial-FTCTD5IY´´ für eine
    schnittstelle ist, und vor allem, wo die sich befindet?

    mich interessiert das thema z.zt. nämlich auch.

    edit. hat sich erledigt, hätte das eröffnungsposting
    besser lesen sollen.
     
    moses_78, 10.08.2006
  7. danlo

    danloMacUser Mitglied

    Mitglied seit:
    03.09.2005
    Beiträge:
    372
    Zustimmungen:
    0
  8. dancedog

    dancedog Thread StarterMacUser Mitglied

    Mitglied seit:
    13.03.2005
    Beiträge:
    7
    Zustimmungen:
    0
    Funktioniert soweit, aber Schnittstelle schmiert ab

    So, das Programm funktioniert jetzt nach vielen Stunden grübeln und frickeln endlich. Leider habe ich jetzt ein neues Problem, bei dem ich nicht so genau weiterweiß:
    Ich lasse das Programm einmal durchlaufen - alles läuft prima. Ich lass das Programm ein zweites mal laufen (das läuft bei mir noch über eine for schleife ab, die 50 mal durchläuft, später soll dies durch eine while ersetzt werden mit einem signal oder ähnlichem (interrupt?) und dann sich ordnungsgemäß beenden) und bei der mitte bleibt es stehen und das wars. Programm reagiert nicht mehr, man darf mit kill -9 oder terminate in xcode abschießen. Danach ist die serielle Schnittstelle noch immer geöffnet und somit darf man in win-manier neu starten.....

    Gibt es eine Möglichkeit, einen Filedeskriptor nachträglich gewaltsam zu schließen? Und gibt es vielleicht funktionierene Tools im Netz die mir sagen "Hallo du doofer programmierer, du hast hier ein speicherloch aufgerissen, weswegen du keine freude haben wirst" ?


    Schonmal Danke im voraus,
    Leon
     
    dancedog, 11.09.2006
Die Seite wird geladen...