Programmieren der seriellen Schnittstelle...

D

dancedog

Neues Mitglied
Thread Starter
Dabei seit
13.03.2005
Beiträge
7
Reaktionspunkte
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
 
Komisch, dass das erste funktioniert, und das zweite nicht...

Ich seh da im Moment auch nichts.

Alex
 
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 ;-)
 
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
 
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.
 
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
 
Zurück
Oben Unten