Forum: PC-Programmierung Debian Sarge und RS232/ttyS0 = Verzweiflung!


von Peter Ganser (Gast)


Lesenswert?

Hiiilfeeeeeee!

Ich dreh langsam ab hier! Ich benutzte Debian Sarge und versuche
RS232/ttyS0 - Daten vom Mikrokontroller einzulesen - funktioniert auch
ganz super (wie schon bei DOS und W98)...

DOCH stellt euch vor aus der RS232 wird von der PC-Seite etwas zum MC
gesendet!!!! Mein gcc-Programm öffnet das ttyS0-Device mit "fopen"
und dem Attribut "nur lesen"... und ich schreibe (vom PC) auch
nichts. Habe es auch schon mit "open()" versucht - das selbe
Ergebnis. Fragt mich nicht WAS da rauskommt, es dauert auf jeden Fall
ca. 5x so lange wie mein Zeichen(vom MC) und sieht nach einer 2-fachen
Wiederholung aus...

Gibts da draussen irgendeinen Linux-Freak dem das was sagt? Ich bin neu
bei Linux/Debian und wäre für jede Idee unglaublich dankbar. Habe sogar
schon mit "stty" rumexperimentiert weil ich dachte es wird ein
Softwarehandshake (XON/XOFF) gesendet, doch das wars wohl auch nicht.
Mir fällt echt nix mehr ein... heul *schnüff*

Ambodenzerstörtpeter

von Jens (Gast)


Lesenswert?

hmmh
wie schnell ist denn
echo hallo > /dev/ttys1??

ueebr den umweg kannst du auch daten ueber die rs232 senden

von Peter Ganser (Gast)


Angehängte Dateien:

Lesenswert?

???????? wie schnell???? Die Schnittstelle ist momentan auf 38.4kb
eingestellt und "hallo" wird völlig problemlos gesendet. (auf
/dev/ttyS0 weil /dev/ttyS1 habe ich nicht).

Doch mein Problem ist ja das "automatische" und ungewollte senden von
irgendwas beim ordnungsgemässem Empfang vom Daten. Wenn ich gewollt
Daten vom PC sende werden diese übrigens auch übertragen - mit der
ungewollten Übertragung von ???? Man kann sich vorstellen, dass man
damit Probleme hat einem Mikrocontroller etwas mitzuteilen.

Ich hänge noch ein Miniprogramm an bei dem der Fehler? schon
auftritt...
Peter

von Wolfram (Gast)


Lesenswert?

Hi Peter

Du koenntest erst mal probieren herauszubekommen was da gesendet
wird,in dem der Mikrocontroller das ganze zurücksendet.
möglicherweise ist ein serielles Terminal aktiv (sollte in
/etc/inittab
stehen)
probiere doch mal den Port lesend und schreibend zu öffnen ("r+")
sollte da noch ein Programm sein was zugreift sollte das scheitern
zur not kannst du ein fflush machen.
Zur Portabilität würde es sich empfehlen genau anzugeben ob Text oder
Binaermodus erwünscht ist,wenn ich mich recht entsinne behandeln das
Linux und Windows unterschiedlich.

von Peter Ganser (Gast)


Lesenswert?

Hi Wolfram!

Vielen Dank für deine Anregungen:
Das was da von Debian gesendet wird ist nicht "decodierbar". Wenn
sieht es eher nach 9600Baud wie eingestellte 38400B aus... und auch
dann ist es nicht "lesbar". Klingt blöd, doch ich kann dir nicht
erklären was ich da auf dem Oszilloskop sehe.. sieht schon
einigermassen synchronisiert aus, und meisst wird der selbe "Wert"
übertragen, doch die Anzahl schwankt und ist nicht synchron mit meinen
Mikrocontroller-Daten (Hahahah - hört sich wirklich sehr fachmännisch
an grins *dem Wahnsinn nahe*)

In /etc/inittab ist kein Terminal aktiv

Text/Binärmodus -> Nach meinem bisherigen Wissensstand gibt es bei
Linux nur Binärdateien. Doch auch alle Kombinationen "r+" "r+b"
"w+".... ändern nichts.

Auch fflush ändert nichts...

Trotzdem Danke und ein schönes Wochende!
Peter

von Lanius (Gast)


Lesenswert?

Vielleicht wird eine serielle Maus gesucht?

von Martin (Gast)


Lesenswert?

@Peter
Serielle Schnittstelle öffnet mit z.B mit:

fd = open("/dev/ttyS0", O_RDWR)

nichts mit fopen und "r+".
Dann muss die serielle Schnittstelle konfiguriert werden:

struct termios term_attr;
term_attr.c_cflag = B38400 | CS8  | CLOCAL | CREAD;
term_attr.c_iflag = 0;
term_attr.c_oflag = 0;
term_attr.c_lflag = 0;
tcsetattr(fd, TCSAFLUSH, &term_attr);

Jetzt kann geschrieben und gelesen werden:

write(fd,senddata_buffer,8);//8byte geschrieben
read(fd,revdata_buffer,8);//8byte gelesen

Dann serielle Schnittstelle schleissen:

close(fd);


Mann sollte auch alles mit if überprüfen, aber hier habe ich das
weggelassen.Dieser Code funktioniert schon, ob wohl da noch die
Funktion select(..) fiehl, damit kannst du dich später auseinander
setzen.

Ansonsten, diesen Code benutze ich momentan zu Komunikation zwischen
MCU<->PC:
http://www1.kielnet.net/home/marc.in/pc-oszilloskop/PC_src/transfer.h

Ein zimmlich genaue beschreibung wie man unter Linux (posix) auf
serielle Schnittstelle zugreift findest du hier:
http://www.easysw.com/~mike/serial/serial.html

Leider Englisch, dann gleich Online-Wörterbuch dazu:
http://dict.tu-chemnitz.de/

von Peter Ganser (Gast)


Lesenswert?

Hi Lanius und besonders Martin!

vielen Dank für eure Antworten! Ich habe meinen Fehler gefunden! Ich
musste mit "stty -F /dev/ttyS0 -echo" ein Echo?!? deaktivieren. Da
ich - um Betriebssystemrumwursteleien meinerseits auszuschliessen -
Sarge neu installierte, müsste dieses "echo-Problem" jedoch bei jedem
auftreten der Daten über die Seriellen Schnittstellen einliest...
zumindest bei Debian Sarge.

Und auch mit open(), denn damit habe ich es auch schon probiert.

Puh - endlich kanns mit dem Seismographen WEITERgehen!

Viiiieeeelen Dank an alle und ich wünsche euch ein schönes
Wochenende!!!

Peter

von Peter Ganser (Gast)


Lesenswert?

Ach ja Martin,

um auf dein "transfer.h" zugreifen zu können müsste ich mich über
KielNet einwählen - von einem anderen Provider aus klappts nicht...
Peter

von Martin (Gast)


Lesenswert?

>um auf dein "transfer.h".....
Ich denke das lag an der Berechtigung, die war falsch gesetzt.

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.