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
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,
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
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
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
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
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
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 :-)