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.
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.
Man könnte ja auch einfach mal das Kommando über Putty mitloggen (über einen anderen COM-Port o.ä).
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
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.
Franz schrieb: > Nun habe ich jedoch das Problem, dass sich das Programm beim Ausführen > aufhängt. Was hängt sich auf? Debugger!
Was verstehst du unter einem Debugger? Öfter mal ein printf einfügen oder einen Richtigen?
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?
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
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.
Leider nein. Zur Zeit benutze ich einfach gedit unter Ubuntu. Hat bisher auch immer gut geklappt. Nur leider jetzt nicht mehr. VG
Was heißt "gehimmelt"? Den Begriff habe ich noch nie gehört. Viele Grüße
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 )
Die Schnittstelle funktioniert doch über "serial port terminal". Nur halt über mein kleines Programm nicht. VG
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...
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.