Forum: Mikrocontroller und Digitale Elektronik Serielle daten vom Raspberry lesen


von baer (Gast)


Lesenswert?

Hallo,

ich möchte mit meinem Raspberry Serielle Daten lesen und Verarbeiten. 
Hierfür möchte (besonders der Performance willen) ein kleines C-Tool 
schreiben.

wie ich den Seriellen Port öffne und beschreibe bekomm ich hin... aber 
beim lesen hängt es
=> ich weiß, dass ich "eine zeit lang lesen" muss, weil ja auch die 
Serielle Schnittstelle braucht... aber wie mach ich das am 
geschicktesten, dass ich wirklich am Terminal lese bis zum nächsten 
"<cr><lf>"
1
//declarationen
2
...
3
int main()
4
const char * device = "/dev/ttyACM0";
5
fd = open( device, O_RDWR | O_NOCTTY | O_NONBLOCK );
6
7
if(fd>0)
8
{
9
//printf("Open successfully\n");
10
char * msg = argv[1];
11
//funktioniert!!!
12
iOut = write(fd, msg, sizeof(msg));
13
14
//geht so leider nicht!!!
15
read(rd, reply, 10);
16
printf("%s\n", reply);
17
18
close(fd);
19
}
20
...

ich bin für jeden Tipp dankbar ;)

wie schon oben erwähnt, arbeite ich mit einem Raspberry... momentan 
hängt über USB (9600 Baud) noch ein Arduino dran (auch hier wundert es 
mich, dass ich nirgendwo die "geschwindigkeit" declarieren kann), später 
soll ein Messmodul seine Dienste verrichten... einerseits werden die 
Daten in eine Datenbank geschrieben, andererseits, soll ein webinterface 
livedaten abrufen...

tausend Dank

von Peter II (Gast)


Lesenswert?

baer schrieb:
> aber wie mach ich das am
> geschicktesten, dass ich wirklich am Terminal lese bis zum nächsten
> "<cr><lf>"

einfach immer 1 Byte lesen und prüfen ob das ende erreicht wurde.

von baer (Gast)


Lesenswert?

erstmal vielen DANK...

evtl. hätte ich dazuschreiben müssen, dass meine C-Künste eher 
anfängerhaft sind...

Auf google finde ich nicht sonderlich viel (vorallem weil sie suche nach 
dem buchstaben C nicht immer gleich als "Programmiersprache" erkannt 
wird).

ich habe sowas schon getestet...
int ttg = 0;
char * res;
while (ttg < 999)  {
  res[ttg] = read(rd, reply, 10);

  ttg++;

}
printf("%s\n", res);


leider ohne erfolg...

ich fürchte, das read() alleine nicht ausreicht!?

&wie kann ich beim öffnen der Verbindung open( device, O_RDWR ), die 
Baud rate mit angeben?

von Jonas G. (jstjst)


Lesenswert?

baer schrieb:
> vorallem weil sie suche nach dem buchstaben C nicht immer gleich als
> "Programmiersprache" erkannt wird
Das Problem hab ich auch oft. Kennt jemand einen trick?

Gruß Jonas

von baer (Gast)


Lesenswert?

Hi,

ich habe mal den "buf" auf 255 erhöt.. nun bekomm ich überhaut mal was 
zurück:

char buf[255];
read(fd, buf, 255);
printf("%s\n", buf);

allerdings sieht der Wert so aus:
xòv¼CÞ~¸CÞ~·CÞ~
(und hat auch keine "Konsistenz")

mit der "Klasse" termios habe ich die Baud rate auf 9600 gesetzt... 
leider ohne Auswirkungen... <- weder lesen noch schreiben!

Momentan meldet der Arduino:
LED ist eingeschaltet!
ODER
LED ist ausgeschaltet!

allerdings nicht lesbar für den PI...

von nicht"Gast" (Gast)


Lesenswert?

Moin,

So einfach ist das nun auch wieder nicht. Du must dir deinen Port 
natürlich auch configurieren.

http://stackoverflow.com/questions/6947413/how-to-open-read-and-write-from-serial-port-in-c

Sieht auf den ersten Blick nach einem netten Beispiel aus.

PS: Wenn du C nicht kannst, dann würde ich an deiner Stelle etwas 
anderes benutzen. Python z.Bsp. (Bietet sich auf dem RaspPi ja an^^).

Um geschwindigkeit kannst du dir dann Sorgen machen, wenn es so weit 
ist. Dann kannst du auch C Module in Python einbinden. Das ist ziemlich 
einfach.
Wenn du gleich in C Startest holst du dir an anderer Stelle Probleme 
rein, die dir evtl. den Spaß verderben.

PPS: Steck mal das C in "" bei der Google Suche. Hilft..


Grüße,

von Heinz (Gast)


Lesenswert?

Ich mach das so:
1
uint16_t readLine (int uart0_filestream, char* line, uint16_t lineSize)
2
{
3
    uint16_t i;
4
    if (uart0_filestream != -1)
5
    {
6
        for(i=0; i < lineSize; )
7
        {
8
            int rx_length = read(uart0_filestream, (void*)(&line[i]), 1);
9
            if(rx_length > 0)
10
            {
11
                if(line[i] == '\n')
12
                    break;
13
                i++;
14
            }
15
            if(rx_length < 0)
16
            {
17
                printf("Error while receiving:0x%X\n",rx_length);
18
                return 0;
19
            }
20
        }
21
        line[i] = '\0';
22
        return i;
23
    }
24
    return 0;
25
}

von Wolfgang (Gast)


Lesenswert?

Jonas G. schrieb:
> Das Problem hab ich auch oft. Kennt jemand einen trick?

Nimm eine Sprache mit einem vernünftigen Namen, z.B. Fortran ;-)

von Jonas G. (jstjst)


Lesenswert?

Wolfgang schrieb:
> Jonas G. schrieb:
>> Das Problem hab ich auch oft. Kennt jemand einen trick?
>
> Nimm eine Sprache mit einem vernünftigen Namen, z.B. Fortran ;-)

Programmierer sollten halt etwas kreativer werden und ihre sprachen 
nicht nach dem Alphabet benennen :)

von baer (Gast)


Lesenswert?

@Heinz
erstmal vielen dank... das "Inspiriert" ... leider bekomm ichs trotzdem 
nicht ganz hin!

hast du evtl. einen kompletten Testcode? Mein Pi (bzw. gcc kann nicht 
viel mit uint16_t anfangen, allerdings müsste unsigned int auch gehen!?)

@nicht"Gast"
aufgeben ist für mich keine Alternative. Etwas was mit Python 
funktioniert habe ich bereits gefunden... allerdings bin ich kein freund 
von Python und möchte es meiden. Spaß hab ich selbst wenn ich etwas 
länger knobeln muss oder 10 mal nachfragen muss (solange es so liebe 
leut wie euch gibt...)

vom Prinzip funktioniert ja auch schon fast alles... lediglich beim 
"Einlesen" hänge ich jetzt! Das kann ja nicht "unmöglich" sein.


es gibt online schon ein paar seiten. Allerdings wie oben schon erwähnt, 
wenn man dann mal C-Code findet, ist es zu 90% für Arduino.

ich suche Mittlerweile nach "ttyACM0 read serial c" ... aber es gibt 
dann auch Unterschiede zwischen, das lief mal vor Jahren und das 
bräuchte man JETZT...

wenn jemand noch Hilfestellungen hat, oder das Script von Heiz 
komplettieren kann wäre nett...

=> die Frage die hier noch offen steht ist auch meine "Herangehensweise" 
...

funktioniert das wenn ich erst schreibe und dann lese und der arduino 
antwortet auf mein geschriebenes!?
=> oder muss ich da gleich sagen, dass ich nach dem schreiben lesen 
möchte... ich versteh zwar den "Ablauf" ganz gut, allerdings weiß ich 
nicht, wie es dann in C umgesetzt wird.

Vielen Dank

von Heinz (Gast)


Angehängte Dateien:

Lesenswert?

Bittesehr, ein Beispiel, habs nicht probiert, aber aus funktionierendem 
Source Code zusammengefügt.

von baer (Gast)


Lesenswert?

@Heinz

OMG ist das geil... kämst aus Franken würd ich dich aufn Bierchen 
einladen...

Vielen vielen Dank...

von Timo N. (tnn85)


Lesenswert?

baer schrieb:
> funktioniert das wenn ich erst schreibe und dann lese und der arduino
> antwortet auf mein geschriebenes!?
> => oder muss ich da gleich sagen, dass ich nach dem schreiben lesen
> möchte... ich versteh zwar den "Ablauf" ganz gut, allerdings weiß ich
> nicht, wie es dann in C umgesetzt wird.

Hä? Wer redet denn jetzt miteinander?

Der Arduino mit dem PC mit USB-Seriell-Konverter ?
Der Arduino mit dem RPI mit USB-Seriell-Konverter ?
Der Arduiono mit dem RPI über die UART (Pins)
Der RPI mit USB-Seriell-Konverter mit dem PC über USB-Seriell-Konverter?
Der RPI über die UART (Pins) mit dem PC mit USB-Seriell-Konverter?

Und was genau willst du eigentlich machen? Erkläre es doch mal in 
"Unverwirrend"

von baer (Gast)


Lesenswert?

@Timo
hat jeder außer du verstanden!!!

und um eine serielle Schnittstelle anzusprechen ist es völlig egal wie 
der letztendliche weg ist (auch wenn ich versteckt sogar meine Methode 
aufgezeigt habe) ... der C-code ist der selbe (lediglich der Parameter 
'vom Port' ändert sich)!
=> und direkt über dein Post ist auch die Lösung!

von Timo N. (tnn85)


Lesenswert?

Der Nominativ ist der Dativtod

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.