Serielle Schnittstelle unter Linux

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Onraku
Beiträge: 43
Registriert: Fr Sep 09, 2011 2:14 pm

Serielle Schnittstelle unter Linux

Beitrag von Onraku » Fr Apr 19, 2013 2:27 pm

Ich habe einen alten Playstation-Controller, und lese den Zustand der Tasten mit einem Arduino aus. Alles was ich dabei nicht brauche fliegt erstmal raus, und übrigt bleibt ein Byte, welches acht Taster-zustände enthält.
Nun möchte ich damit in meinen PC, welcher mit einem USB-Kabel mit dem Arduino verbunden ist.
Der μC kann aber lediglich eine serielle Schnittstelle (RS232???) ansprechen, welche über einen FTDI-Chip realisiert wird.
Im Terminal bekomme ich mit

Code: Alles auswählen

screen /dev/ttyUSB0
genau das was ich haben will, auf der Seite des μC scheint soweit alles klar zu sein.

Aber wie kann ich mit einem Programm das gesendete Byte lesen, um es weiter zu verarbeiten?
Ich bin mittlerweile 4 Tage auf der Suche, egal womit ich Google füttere, ich bekomme nur Links zurück, die ich schon gesehen habe, finde keine Bibliothek die mir weiterhilft (was mir eigentlich am liebsten wäre), und sämtliche Versuche selbst etwas zu implementieren (Stichwort: <termios.h><fcntl.h>) erzeugen mehr Verwirrung als Klarheit.

Mein letzter Versuch in der Richtung sieht so aus:

Code: Alles auswählen

#include <stdlib.h>
#include <stdio.h>
#include <termios.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

int main(){

   struct termios tio;
   int tty_fd;
   fd_set rdset;
   unsigned char c=0;

   memset(&tio,0,sizeof(tio));
        tio.c_iflag=0;
        tio.c_oflag=0;
        tio.c_cflag=CS8|CREAD|CLOCAL;
        tio.c_lflag=0;
        tio.c_cc[VMIN]=1;
        tio.c_cc[VTIME]=0;

        tty_fd=open("/dev/ttyUSB0", O_RDWR | O_NONBLOCK);
        cfsetospeed(&tio,B9600);
        cfsetispeed(&tio,B9600);
        tcsetattr(tty_fd,TCSANOW,&tio);
        while (1)
        {
            read(tty_fd,&c,1);
            printf("%d\n",c);
        }
  return(0);
}
Mir ist klar das die Schleife alles andere als schön ist, und ich das Programm nur mit Gewalt beenden kann.
Als Ausgabe bekomme ich hier nur Nullen.

Als Bibliothek habe ich unter anderem "libserial" ausprobiert, mit gleichem oder ähnlichem Ergebnis, und bevor ich anfange darin herum zu pfuschen, wollte ich dann lieber was eigenes probieren. Der Code ist eine Mischung aus libserial, und Informationen (besser "Halbwissen") aus den "termios" und "fcntl"-Dokumentationen.

Kann mich hier jemand in die richtige Richtung schubsen, oder hat einen Link, der bei mir noch nicht lila ist :(

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Serielle Schnittstelle unter Linux

Beitrag von Kerli » Fr Apr 19, 2013 2:38 pm

Ich hab bis jetzt immer qextserialport verwendet. Du musst dazu allerdings Qt verwenden...
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Serielle Schnittstelle unter Linux

Beitrag von cloidnerux » Fr Apr 19, 2013 4:49 pm

Wenn ich richtig Informiert bin, kannst du einfach /dev/ttyXXX als Datei öffnen und mit den "normalen" Dateioperationen lesen und schreiben.
Das habe ich aber bisher nicht verifiziert, ich hab das letzte mal auch mit qextserialport gearbeitet.
Redundanz macht wiederholen unnötig.
quod erat expectandum

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Serielle Schnittstelle unter Linux

Beitrag von nufan » Fr Apr 19, 2013 8:01 pm

In Zukunft vielleicht für alle 3 interessant:
http://qt-project.org/wiki/QtSerialPort

Antworten