Serielle Schnittstelle reagiert nicht

Gast #2499795
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.
Angehängte Dateien:
#2499834
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.
#2499853
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
Gast #2499898
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.
Gast #2499923
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 )
#2499925
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...
Gast #2500100
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren