Forum: PC-Programmierung Borland C++ prog. zum ausl. der RS232


von Dani (Gast)


Lesenswert?

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

von Schmittchen (Gast)


Lesenswert?

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.

von Dani (Gast)


Lesenswert?

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

von Schmittchen (Gast)


Lesenswert?

Dein Problem ist nicht die serielle Kommunikation, sondern die 
Windowsprogrammierung. ;-)

Schmittchen.

von Dani (Gast)


Lesenswert?

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

von Schmittchen (Gast)


Lesenswert?

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.

von Dani (Gast)


Lesenswert?

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

von Schmittchen (Gast)


Lesenswert?

> 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.

von Michi (Gast)


Lesenswert?

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

von Dani (Gast)


Lesenswert?

Hallo Michi

Hast du einen brauchbaren Link für die Komponeneten ??

Gruss
Dani

von Michi (Gast)


Lesenswert?

hab dir eine (welche ich selbst benutze) geschickt...
gruß michi

von eugen d (Gast)


Lesenswert?

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

von René König (Gast)


Lesenswert?

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.

von BigL (Gast)


Lesenswert?

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

von Patrick Kremer (Gast)


Lesenswert?

@ Michi, kannst du mir bitte auch die Komponente für die Rs
Kommunikation per Mail senden, vielen vielen dank schonmal.

von Rainer Rakow (Gast)


Lesenswert?

@ 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.

von Frederik (Gast)


Lesenswert?

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

von René König (Gast)


Lesenswert?

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.

von Frederik (Gast)


Lesenswert?

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

von René König (Gast)


Lesenswert?

"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.

von Frederik (Gast)


Lesenswert?

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 ?

von René König (Gast)


Lesenswert?

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.

von Frederik (Gast)


Lesenswert?

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

von Patrick (Gast)


Lesenswert?

@ Michi, kannst Du mir vielleicht auch Deine Komponente schicken, hätte
großes Interesse daran,

Gruß Patrick

von Christian (Gast)


Lesenswert?

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

von Andreas (Gast)


Lesenswert?

@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

von Stefan (Gast)


Lesenswert?

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

von Ramon (Gast)


Lesenswert?

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

von Blackbird (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist ein Beispiel, aus- und umbauen kann jeder selber.


Blackbird

von Ramon (Gast)


Lesenswert?

wie muss ich das programm aufrufen mit cmd ? und welchem parameter
(Comportnummer) oder kann ich die im programm festlegen ? danke
schonmal

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

Du hättest wenigstens bis zur 19. Zeile lesen können:
// Hauptprogramm: Aufruf mit: progname <COM-Port-Nummer>

von Ramon (Gast)


Lesenswert?

ja deswegen ja meine frage Wie lautet die syntax für den aufruf mit
comportnummer .........   vllt solltest du lesen lernen ..

von draco (Gast)


Lesenswert?

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?

von markus (Gast)


Lesenswert?

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

von Werner A. (homebrew)


Lesenswert?

@Markus
du hast schon gesehen, wann der Beitrag von Michi geschrieben wurde???

von Vajk .. (vajk)


Lesenswert?

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

von Vajk .. (vajk)


Lesenswert?

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
Noch kein Account? Hier anmelden.