Forum: PC-Programmierung Serielle Schnittstelle reagiert nicht


von Franz (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
ich bin mittlerweile ziemlich verzweifelt. Ich versuche seit Tagen, 
unsere Wechselrichter der Fa. Kaco auszulesen. Zunächst machte mir die 
Verkabelung der Umrichter mit dem PC Schwierigkeiten. Die beiden Adern 
des Rs485-Busses mussten getauscht werden, um eine Kommunikation 
hinzubekommen. Naja das läuft jetzt schonmal.
Nun möchte ich die Wechselrichter automatisch auslesen.
Dazu habe ich ein Programm in C geschrieben, welches automatisch die 
Anfrage an den Wechselrichter stellen soll und die Antwort zu 
testzwecken erst einmal darstellen soll. Nun habe ich das Problem, dass 
die Kommunikation mit dem Wechselrichter nicht klappt.
Sende ich dagegen die Anfrage direkt in Putty, funktioniert alles ohne 
Probleme.
Wo liegt nun der Fehler in meinem Programm. Ich habe mich ziemlich an 
den Artikel "PORTS unter GCC" gehalten.

Vielen Dank schon einmal.

von Udo S. (urschmitt)


Lesenswert?

Franz schrieb:
> Nun habe ich das Problem, dass
> die Kommunikation mit dem Wechselrichter nicht klappt.
> Sende ich dagegen die Anfrage direkt in Putty, funktioniert alles ohne
> Probleme.

Brauch der Wechselrichter evt. am Ende der Kommandosequenz ein CR-LF 
(return beim Putty)?
(Hex 0d 0a) bzw. in C einfach ein '\n' ans Ende des Kommandostrings.

von SNR (Gast)


Lesenswert?

Man könnte ja auch einfach mal das Kommando über Putty mitloggen (über 
einen anderen COM-Port o.ä).

von Udo S. (urschmitt)


Lesenswert?

Habe gerade mal in deinen Code geschaut.
Was mir auffällt:
beim Schreiben würde ich statt fest definierter Länge des Sendestrings 
eher strlen() benutzen.
Beim Empfangspuffer solltest du 1 Byte für das abschließende 0 
(Stringende in c) einplanen und die 0 auch an die korrekte Position 
setzen ehe du den Empfangspuffer mit Stringfunktionen 
weiterverarbeitest.

Zum Testen einer Software zur seriellen Kommunikation kann man auch RX 
und TX am PC verbinden (loopback-stecker) und so erst mal sehen daß das 
Senden und Empfangen von Daten überhaupt funktioniert

von Franz (Gast)


Lesenswert?

Das mit dem Loopback Stecker habe ich gemacht. Super Idee eigentlich, 
wieso bin ich da nicht selber drauf gekommen?
Nun habe ich jedoch das Problem, dass sich das Programm beim Ausführen 
aufhängt. Ich weiß nicht wieso, wobei ich auch bis auf die konstanten 
Strings nichts geändert habe.

Ja, die Wechselrichter brauchen in der Tat das <CR> Zeichen (13) am Ende 
der Aufforderung. Ich habe immer ein \n mit in den String gehangen und 
gehofft, das möge doch reichen.

Die Konstanten der Stringlängen habe ich jetzt erst einmal testweise so 
gesetzt. Ich wollte halt nur einmal sehen, ob die Daten wirklich in 
meinem Programm landen oder nicht. Alles andere wäre später dazu 
gekommen.

von Franz (Gast)


Lesenswert?

Achja,
vielen Dank für eure Mithilfe!

von Udo S. (urschmitt)


Lesenswert?

Franz schrieb:
> Nun habe ich jedoch das Problem, dass sich das Programm beim Ausführen
> aufhängt.

Was hängt sich auf? Debugger!

von Franz (Gast)


Lesenswert?

Was verstehst du unter einem Debugger? Öfter mal ein printf einfügen 
oder einen Richtigen?

von Udo S. (urschmitt)


Lesenswert?

Franz schrieb:
> Die beiden Adern
> des Rs485-Busses mussten getauscht werden, um eine Kommunikation
> hinzubekommen.

Noch was:
Du bist sicher, daß du nicht deine Schnittstelle gehimmelt hast?

von Franz (Gast)


Lesenswert?

Also ich habe jetzt mal ein paar Printfs eingebaut und wie es aussieht 
ist es nicht möglich, die serielle Schnittstelle zu öffnen. Mein 
Programm "serial port terminal" schafft es aber noch.
VG

von Udo S. (urschmitt)


Lesenswert?

Franz schrieb:
> Was verstehst du unter einem Debugger?
Du programmierst doch auf dem PC in C. Also hast du eine IDE mit 
Debugger. Nutze den, ist doch so einfach.

von Franz (Gast)


Lesenswert?

Leider nein. Zur Zeit benutze ich einfach gedit unter Ubuntu. Hat bisher 
auch immer gut geklappt. Nur leider jetzt nicht mehr.
VG

von Franz (Gast)


Lesenswert?

Was heißt "gehimmelt"? Den Begriff habe ich noch nie gehört.
Viele Grüße

von NurEinGast (Gast)


Lesenswert?

Franz schrieb:
> Ja, die Wechselrichter brauchen in der Tat das <CR> Zeichen (13) am Ende
> der Aufforderung. Ich habe immer ein \n mit in den String gehangen und
> gehofft, das möge doch reichen.

Nach meinem Verständniss kommt da was durcheinander.

\n = <LF> Line feed = 0x0A  ( 10 )
\r = <CR> Carriage retrun = 0x0D ( 13)

Wenn also der FU ein <CR> sehen will, dann probiere doch mal \r am Ende 
der Zeile. Viele Terminal Programme senden <CR><LF> zusammen am 
Zeilenende.


Und Debugger unter Unbunt : gib doch mal "ddd <ProgrammName>" ein.
Das ist doch ein Debugger. ( Grafisches Frontend für den gnu Debugger )

von Franz (Gast)


Lesenswert?

Die Schnittstelle funktioniert doch über "serial port terminal". Nur 
halt über mein kleines Programm nicht.
VG

von Udo S. (urschmitt)


Lesenswert?

Franz schrieb:
> Also ich habe jetzt mal ein paar Printfs eingebaut und wie es aussieht
> ist es nicht möglich, die serielle Schnittstelle zu öffnen.
Warum? Return codes und evt. Funktionen nutzen die genauere 
Fehlerursache melden.
Dann entsprechend im Internet suchen was das bedeuten kann.
Sorry ich habe vor 15Jahren das letzte mal serielle Schnittstelle 
programmiert insofern ist mein aktuelles Wissen der API und Parameter 
ziemlich eingerostet.

Franz schrieb:
> Mein Programm "serial port terminal" schafft es aber noch.
Wenn du mit der Terminalemulation noch arbeiten kannst dann ist 
zumindest die Schnittstelle noch ganz. Das ist doch positiv, dann liegt 
der Fehler nur in der Initialisierung und wie du die API 
(Programmierschnittstelle) benutzt.
ggf im Internet nach Beispielen suchen und erst mal irgendwas mit dem 
Loopbackstecker zum Laufen bringen

Viel Erfolg, ich bin dann weg, aber andere wissen da eh mehr...

von Udo S. (urschmitt)


Lesenswert?

Franz schrieb:
> Was heißt "gehimmelt"?

In den Elektronikerhimmel befördert...
Kannst aucg verbrutzelt, abgeraucht, geschossen, etc. sagen
Auf Deutsch kaputt gemacht :-)
Tschüss und schönes Wochenende
Viel Erfolg

von Franz (Gast)


Lesenswert?

Trotzdem Danke Udo!

Ich habe aber noch eine frage zu der Funktion
1
 int read(...)
 aus meinem Programm.

Wie mir aufgefallen ist, ist die Funktion ruck zuck mit der Arbeit 
fertig, auch wenn der Buffer noch gar nicht voll ist. Nun meine Frage:
Wie bekomme ich den Buffer voll, dh. es soll noch so lange gewartet 
werden, bis der Buffer voll ist. Teilweise wird nur ein Teil des 
Anwortstrings gespeichert und der Rest geht verloren.

VG Franz

von Uwe (Gast)


Lesenswert?

Da mußt du dich an das Protokoll vom Gerät halten bzw. du mußt dem 
Program beibringen was eine Endbedingung ist z.B. immer wiederholt lesen 
bis CR/LF kommt oder so.

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.