Hallo Ich muss jetzt doch nochmals fragen. Hat irgend jemand von euch ein Programm mit dem man ganz einfach die daten am RX Pin der RS232 auslesen kann, wie das Angezeigt wird ist mir völlig egal, nur sollten man die Zeichen denen welche man geschickt hat zuordnen können (können auch nur high oder low bez. 0 und 1 sein). Hat jemand so eine C++ Source welche ich mir im Borland Builder anschauen und ausprobieren könnte, für mein Verständniss wäre dies OBERGENIAL !! Vielen Dank Gruss Dani
Ich verstehe dein Problem nicht. Du willst doch mit einem µC Daten an den PC senden. Dazu verpackt die µC-Hardware die Daten beim Versand in ein festes Format (Start/Stoppbit...). Auf PC-Seite liest dir das BC++Builder wieder byteweise(!) von der Schnittstelle. Du mußt dich weder auf der einen Seite, noch auf der anderen um einzelne Bits kümmern (das ist Luxus!). Lediglich die Baudrate und das Datenformat muß auf beiden Seiten identisch sein (z.B. 9600 und 8N1). Die bereits genannte Seite http://www.traverse.com/people/poinsett/bcbcomm.html beschreibt das anschaulich. Es ist nunmal leider nicht einfacher unter Windows die serielle Schnittstelle zu bedienen. Aber es gibt auch Komponenten, die die ganze Windowsprogrammiererei ein wenig verschleiern (ist dann VisualBasic-ähnlich), um dann nicht richtig zu funktinieren. :-( (Hab das schonmal ausprobiert - meine Erfahrung). Schmittchen.
Ok, dachte es ginge vielleicht doch noch einfacher. Ich, probiers mal und kämpf mich in die Materie rein. Falls ich auf weitere "Rätsel" stosse werd ich mich wieder melden :) Gruss Dani
Dein Problem ist nicht die serielle Kommunikation, sondern die Windowsprogrammierung. ;-) Schmittchen.
Wieso die Windowsprogrammierung ? Klar wird mir dies auch noch ein paar mal Sorgen bereiten, doch im Moment macht mir die SR232 Kommunikation mit all den elektronischen Komponenten mehr Sorge. Dani
Naja, eigentlich ist das Prinzip nicht so schwierig. Mit CreateFile einen Filehandle anfordern. Paar Parameter setzen. Mit ReadFile/WriteFile ins "File" schreiben. Der Rest ist Threadprogrammierung (damit dein (Haupt)programm nicht ständig auf eintreffende Zeichen warten muß). Das war mein erster Kontakt mit Threadprogrammierung und entsprechend kompliziert empfand ich das anfangs auch - komplizierter als die Schnittstelle zu bedienen. Daraus habe ich auch auf deine Schwierigkeiten geschlossen - vielleicht triffts das ja. Die Serielle Kommunikation beschränkt sich auf: "Ich schreibe irgendwo was rein und lese irgendwo was aus". Das Drumherum ist die Windowsprogrammierung. Schmittchen.
Ja, ich stehe tatsächlich noch ziemlich am Anfang der ganzen Geschichte. Die Threadprogrammierung ist mir leider nur als Ausdruck geläufig, gemacht hab ichs auch noch nie. Mein Ziel in naher Zukunft ist es, vom mC aus über den Pegelwanderl Daten an die Serielle Schnittstelle zu senden (z.B. in einem endlos Loop) und diese mit dem Borland Builder zu lesen, ohne irgendwas anderes. Für mich ist das irgedwie der Knackpunkt, ich kann mir vorstellen das man danach "nur" noch die Software auf beiden Seiten ausbauen muss, oder lieg ich da falsch ? Dani
> gemacht hab ichs auch noch nie Echt? Wir habens getan, zum allersten Mal... (SCNR). ... und wenn du den Codebrocken übernimmst, ihn für deine Bedürfnisse modifizierst und er dann funktioniert, dann fragt danach keiner mehr. Das Grundprinzip hast du ja verstanden. Eigentlich kannst du zunächst die ganze Sache auch ohne LeseThread umsetzen (Timeoutwert erhöhen), dann wartet dein Programm auf eintreffende Daten und macht sonst nix!! > oder lieg ich da falsch ? nein.
Hey macht's doch nicht so kompliziert. also erstmal falls du nur deine daten vom mikrocontroller checken möchtest. kannst du das ja mit hyperterminal tun, das in deinem windows-system bereits installiert ist. wenn du eine borland.exe erstellen möchtest, die mit deinem mikrocontroller irgendiwe kommuniziert,dann ist das auch kein problem. du nimmst einfach eine fertige komponente für die serielle schnittstelle, die es im internet zu hauf gibt und installierts diese. fertig ! damit kannst du dann mit ein paar kleinen funktionsaufrufen, alles realisieren, ohne über threadprogrammierung bescheid wissen zu müssen... so long michi
Hallo Michi Hast du einen brauchbaren Link für die Komponeneten ?? Gruss Dani
hab dir eine (welche ich selbst benutze) geschickt... gruß michi
hallo, hab ne frage an schmittchen, sag mal ich hab mir so die threadprogrammirung mal so im "vorbeigehen" angesehen und wollte mal eben wissen du lässt doch den thread, der auf die daten wartet, sicher im schlaf warten (nehm ich mal so an ) und der wird dann geweckt sobald daten eingetroffen sind. wenn du nun aber deine anwendung schließen willst oder generell die datenabfrage beenden willst, beendest du den thread von einem anderen oder beendet der sich intern ? was ich eigentlich wissen will ist: ob das beenden des threads extern so ohneweiteres möglich ist oder ob es da besondere dinge gibt auf die man achten sollte
Ich bin zwar nicht Schmittchen, ich antworte aber einfach trotzdem mal: Ein Thread lässt sich unter Windows nicht vernünftig beenden, weder von aussen noch von innen. Einen Thread lässt man immer einfach auslaufen. TerminateThread taugt nicht, da von Deinen Klassen keinerlei Destruktoren aufgerufen werden, außerdem bleibt der Thread-Stack erhalten (letzteren kann man auch manuell freigeben, aber wer macht das schon ...). Die für den internen Gebrauch gedachten Funktionen ExitThread, _endthread und _endthreadex taugen ebenfalls nicht, weil auch das ein sofortiges Abwürgen bedeutet. Der Thread-Stack wird zwar abgebaut, aber für Deine Destruktoren schaut's weiterhin schlecht aus. Die einzige Möglichkeit, die mir so spontan einfällt, ist eine Funktion über QueueUserAPC aufrufen zu lassen. Diese Funktion kann den Thread beenden, indem sie einfach eine Exception wirft (z.B. Zugriff auf Speicher über einen NULL-Pointer). Diese Exception kann der Thread dann fangen und auslaufen. Das setzt aber natürlich voraus, daß der Thread auch regelmäßig alertable gesetzt wird. Die Eleganteste zum Problem passende Lösung ist meiner Meinung nach, den Port OVERLAPPED zu öffnen. Dadurch kannst Du WaitCommEvent verwenden, ohne das Du damit den Thread blockierst. Nachfolgend setzt Du dann WaitForMultipleObjects mit 2 Events ein. Das erste Event ist das Event, das Du auch an WaitCommEvent übergeben hast und wird signalisiert, wenn etwas am Port passiert. Das zweite Event kannst Du von aussen signalisieren, wenn Du den Thread beenden willst. Der Thread erkennt das dann und läuft einfach aus.
Hey geht auch Visual Basic? In der Microsoft MSDN ist fast der komplette source code vom Hyper Terminal. Kann man sich das beste raussuchen. Läuft in VB 6 noch über Comm Objekt. In .NET gibt es diese nicht mehr. Wenn du von VB keine Ahnung hast ist das kein Problem. Kannte mich auch nicht aus und habe mal fluchs in nem Halben Tag das Programm zusammengeklickt. Gruß BigL
@ Michi, kannst du mir bitte auch die Komponente für die Rs Kommunikation per Mail senden, vielen vielen dank schonmal.
@ Michi, kannst Du mir vielleicht auch Deine Komponente schicken, hätte großes Interesse daran, Gruß Rainer. P.S.: Vielen Dank schon mal im Vorraus.
Hallo Ich hab einen Thread der Wartet ob Daten ankommen mit WaitCommEvent. Wie kann ich jetzt den Thread richtig beenden sprich WaitCommEvent auslösen ohne das Daten ankommen ??? Gruß Freddy
Wie ich schon schrieb: Du solltest nicht mit WaitCommEvent warten. Du solltest den Port lieber mit FILE_FLAG_OVERLAPPED öffnen. Dadurch kommt WaitCommEvent sofort zurück. Tritt jetzt eins der gewünschten Ereignisse ein, wird das Event, das Du über die OVERLAPPED-Struktur (WaitCommEvent, Parameter 3) angegeben hast, signalisiert. Du wartest jetzt ganz einfach darauf, daß das Event signalisiert wird. Wenn Du zusätzlich auf ein zweites Event wartest (WaitForMultipleObjects), kannst Du über dieses zweite Event dem Thread das Ende signalisieren.
Dann fragt WaitCommEvent im Polling Verfahren ab und das verbraucht etwas zuviel SystemRecourcen da ich das mit 20 Com Ports Gleichzeitig machen muss. Ich hab versuch WaitCommEvent auf Daten im RX Puffer und TX Puffer wird leer aber ich kann nicht mit WriteFile schrieben wenn WaitCommEvent Wartet. gruß Freddy
"Dann fragt WaitCommEvent im Polling Verfahren ab" Sagt wer? Wo nachzulesen? Das ist Quatsch, IMO. "Ich hab versuch WaitCommEvent auf Daten im RX Puffer und TX Puffer wird leer aber ich kann nicht mit WriteFile schrieben wenn WaitCommEvent Wartet." Logisch, deswegen FILE_FLAG_OVERLAPPED als Abhilfe.
HMM hab ich was falsch verstanden ??? Ich meine wenn ich mit overlapped öffen kommt waitcommevent immer sofort zurück und ich muss schauen wieso??? oder irre ich da ?
Du verlagerst das Warten nur um einen Funktionsaufruf. WaitForMultipleObjects legt den Thread ganz geauso schlafen wie es zuvor WaitCommEvent getan hat. Nur überwacht WatForMultipleObjects noch ein weiteres Event. Diese signalisierst Du selbst, wenn sich der Thread beenden (lies: auslaufen) soll.
Ok ich danke erst mal werd schauen ob das klappt und berichten. Danke für deinen Hilfe und falls es mir nicht mehr langt schön feiertage und guten Rutsch
@ Michi, kannst Du mir vielleicht auch Deine Komponente schicken, hätte großes Interesse daran, Gruß Patrick
Hallo Zusammen, ich suche ein einfaches Beispielprogramm (als Projekt mit 'FORM')für den borland builder, mit dem ich die RS232 Schnittstelle unter XP 'ansprechen' kann. Würde mir viele Zeit ersparen! Gruß, Christian
@Christian Sieh mal im Code-Forum nach Peter Dannegger´s Bootloader. Da habe ich eine Klasse für den C++-Builder für die serielle gepostet. Ist zwar für die Console. Aber einfache ändern, eine Form und ein Button rein und dann die Funktionen aufrufen. Für die Klasse ist es egal ob Form oder Consolenapplikation. Grüße Andreas
nim doch eine fertige Komponente: http://www.winsoft.sk/comport.htm ode ohne Komponente: http://www.fh-luebeck.de/content/01_33_02_10_07/6/0.html Kurs 8
Hallo alle zusammen , ich habe ein mega problem : ich muss so schnell wie möglich für mein üprojekt ein schnitstellenprogrammierung für den COM (R232) vollziehen. Unserer Lehrer helfen uns leider nicht sie sagen sie haben keine ahnung,. Egal also ich bräuchte vllt. einen Quelltext zum connecten zu Rs232 undwarten auf daten diese daten muss ich anschliesend in SQL eintragen aber das ist ein anderes kapitel ich bitte um hilfe ich bin echt am ende plz help :-( thx im vorraus
Hier ist ein Beispiel, aus- und umbauen kann jeder selber. Blackbird
wie muss ich das programm aufrufen mit cmd ? und welchem parameter (Comportnummer) oder kann ich die im programm festlegen ? danke schonmal
Du hättest wenigstens bis zur 19. Zeile lesen können: // Hauptprogramm: Aufruf mit: progname <COM-Port-Nummer>
ja deswegen ja meine frage Wie lautet die syntax für den aufruf mit comportnummer ......... vllt solltest du lesen lernen ..
hallo, ich muss ein prog schreiben, was daten über die serielle schnittstelle leitet. es soll auf der einen seite daten von einem thermostaten (julabo) empfangen und auf der anderen seiten wieder daten zurück schicken. also mit hilfe diverser codes habe ich es hinbekommen, dass er erfolgreich ein port öffnet... nun meine fragen: - wie kann man software-seitig sicher gehen, daß auch wirklich ein gerät an diesem port ist? kann man das irgend iwe prüfen? - wie genau müssen die daten aussehen, die ich sende? in der anleitung des thermostaten steht, die "übertragung der zeichen erfolgt gemäß din 66022 und din 66003, codetabelle 1". das sagt mir nicht wirklich was .... :( ich weiß nicht, ob ich die befehle in 'normalen' zeichen (a,b,c,..) oder in den hex-codes senden muss. ausserdem ist mir rätzelhaft, wie ich den string definieren muss (dword, char, ....)!? kann mir vielleicht irgend jemand helfen?
Hallo Michi, könntest du mir das tool zum auslesen der rs232 auchmal zusenden.wäre spitze danke..hab da gerade auch so meine probleme danke schonmal gruß markus
@Markus du hast schon gesehen, wann der Beitrag von Michi geschrieben wurde???
Hallo ich hab grad ein merkwürdies Problem - ich möchte mit einem GSM-Modem "reden" - via Hyperterminal geht es prima, wenn ich die typische Variante nehme, mit OpenFile/Writefile dann geht das mit allem, nur nicht mit dem virtuellen Treiber des webNwalk-Karte, da bekomme ich nur genau die Zeichen zurück, die ich selbst sende. Ein Test mit einem ftdi/USB-Teil ging ohne Probleme. Nehme ich HTerm zum testen, das Gleich wie bei mir. Was macht HyperTerminal da so anders? Probiere ich die "fertige Komponente" von winsoft.sk (siehe weiter oben), dann geht es mit dem kleinen Nebeneffekt, daß ich ein echo meiner eigenen Zeichen bekomme, aber auch die Antwort vom Modem. Was kann ich tun bzw. wie muß ich die COM-Schnittstelle implementieren, damit ichs zum Laufen bekomme (nutze BorlandBuilder 5). Würde das gerne direkt hinbekommen ohne Fremdkomponenten. LG Vajk
1. überdenke Deinen Code genau, bevor Du übermüdet postest. Ohne \r\n antwortet das Modem halt nicht, strcpy statt strcat 2. http://technet.microsoft.com/de-de/sysinternals/bb896644.aspx das ultimative Debug-Tool fuer serielle Schnittstellen brachte es an den Tag 3. Der Fehler sitzt wie so oft, vor der Tastatur :-)
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.