Forum: PC-Programmierung Visual Studio C# Serielle Daten anzeigen /verstehe befehle nicht


von DAVID B. (bastler-david)


Angehängte Dateien:

Lesenswert?

Hallo
Ich möchte den SerialPort überwachen und möchte nur angezeigt bekommen 
das Daten übertragen werden welche das möchte ich nicht sichtbar machen 
nur das Signale gesendet werden.
Port Öffnen und so geht alles.

habe mal was ZUM ZEIGEN gebastelt.
Es soll immer um springen solange Daten gesendet werden, soll 0 
(leuchten ??)
Wenn KEINE Daten gesendet werden soll 1 (leuchten ?)
Mit welchen code stelle ich das am besten an ?
Vielen Dank.

von Hans Christian Knäckebröt (Gast)


Lesenswert?

Serialport.datareceived ist dein Freund.

von Wolfgang H. (drahtverhau)


Lesenswert?

Warum verwendest du nicht die entsprechenden Events?

von Hans Christian Knäckebröt (Gast)


Lesenswert?

So, wenn der Bastler ausgeschlafen hat, kann er das hier nehmen und 
glücklich werden:

https://msdn.microsoft.com/de-de/library/system.io.ports.serialport.datareceived(v=vs.110).aspx

von Georg (Gast)


Lesenswert?

DAVID -. schrieb:
> Ich möchte den SerialPort überwachen

Hans Christian Knäckebröt schrieb:
> Serialport.datareceived ist dein Freund

usw. aber wahrscheinlich alles falsch. Er möchte wohl nicht seine eigene 
Software überwachen (wenn er eine geschrieben hätte, würde er wohl kaum 
fragen, wie man den Status anzeigt), sondern das Verhalten einer 
seriellen Schnittstelle, über die ein ANDERES Programm etwas sendet oder 
empfängt. Damit dürfte er überfordert sein, aber dafür gibt es Software, 
z.B. serial port monitor.

Georg

von DAVID B. (bastler-david)


Lesenswert?

Das Bild oben entspricht in keiner weise mein eigentlichen Programm.
Sonder ist NUR zum verdeutlichen meines Problems.

Hans Christian Knäckebröt schrieb:
> Serialport.datareceived ist dein Freund.

Den Code habe ich schon gefunden und versucht aber
Wie genau kann ich das einen Radiobutton Zuordnen ?
Und NEIN ich hab ein eigenes Programm auch wenns mehr einer bastel Bude 
entspricht.

Meine fähigkeiten sind immer noch sehr oberflächlich.

Welche events kommen da in frage ?
Vielen Dank

: Bearbeitet durch User
von Hans Christian Knäckebröt (Gast)


Lesenswert?

Möchtest du so eine Art Port activity LED haben?
Dann würde ich in dem Event schreiben:
Radiobutton.state = true

Und dazu einen Timer laufen lassen, der den rb alle 100ms auf false 
zurücksetzen.

Oder so.

von Lars (Gast)


Lesenswert?

HI,

so weit ich weiß legst du eine Threshhold fest ab wann der "Interrupt" 
von deiner Seriellenschnittstelle auslöst. Wenn das erreicht ist kannst 
du mit den handler von datareceived drauf reagieren.

Finde ich allerdings nicht sooo toll. Ich würde die abfrage pollen ist 
dann auch zu Linux kompatibel :)

von DAVID B. (bastler-david)


Lesenswert?

Hans Christian Knäckebröt schrieb:
> Möchtest du so eine Art Port activity LED haben?
> Dann würde ich in dem Event schreiben:
> Radiobutton.state = true
>
> Und dazu einen Timer laufen lassen, der den rb alle 100ms auf false
> zurücksetzen.
>
> Oder so.

Das mit dem Timer versuche ich dann gleich mal.
Wie kann ich einen Pin eine anzeige zuweisen und ja es soll eine port 
activity (mir ist das wort nicht eingefallen) anzeige werden aber für 
jeden pin einzlen wenn das geht.
Vielen Dank

von Hans Christian Knäckebröt (Gast)


Lesenswert?

Lars schrieb:
> Finde ich allerdings nicht sooo toll. Ich würde die abfrage pollen ist
> dann auch zu Linux kompatibel :)


Sein Titel: Visual Studio C# Serielle Daten anzeigen /verstehe befehle 
nicht

Merkste was?

Ausserdem, den Serial Port pollen machen wirklich nur Leute, die es 
nicht besser wissen. Also 99,9% der absoluten Einsteiger, bis sie daran 
verzweifeln, dass sich ihr Programm daran erhängt und die GUI 
unbenutzbar wird.

von Lars (Gast)


Lesenswert?

Deswegen geht das Port polling in Linux auch nicht und Linux systeme 
laufen tendentiel besser.. beim Portpolling muss man halt wissen was man 
macht.

ABer ich halt mich dann mal raus... ich sag mal so meine Programme 
laufen alle optimal.. und Laufzeit optmiert mit polling schon seid 20 
Jahren auch schon ohne Visual C# ...

von Lars (Gast)


Lesenswert?

Lars schrieb:
> Deswegen geht das Port polling in Linux auch nicht und Linux
> systeme
> laufen tendentiel besser.. beim Portpolling muss man halt wissen was man
> macht.
>
> ABer ich halt mich dann mal raus... ich sag mal so meine Programme
> laufen alle optimal.. und Laufzeit optmiert mit polling schon seid 20
> Jahren auch schon ohne Visual C# ...


Ich nehme alles zurück und behaupte das Gegenteil.
Entschuldigt meien threads und beachtet diese bitte nicht... select bei 
Linux ist auch kein pollen ich mache quasi beides.. :/..

einmal geschrieben nie weider reingeschaut ...

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Vielleicht verstehe ich deine frage nicht, aber:
Wenn ein Programm den Port öffnet ist er belegt und du kannst von außen 
nicht mehr auf den Port zugreifen.

von Frank L. (frank_l)


Lesenswert?

Hallo David,

wie reggie schon schrieb, einen Port der von einer anderen Anwendung 
belegt ist, kannst Du ohne tiefgreifende Kenntnisse im Betriebssystem 
nicht so einfach überwachen.

Wenn Du aber Deinen eigenen Port den Du über SerialPort ansteuerst 
überwachen willst, dann ist der PinChanged Event der Klasse Dein Ding.

https://msdn.microsoft.com/de-de/library/system.io.ports.serialport.pinchanged(v=vs.110).aspx

https://msdn.microsoft.com/de-de/library/system.io.ports.serialpinchange(v=vs.110).aspx

Über diesen Event bekommst Du Auskunft über die einzelnen Statis der 
Pins.

Gruß
Frank

von DAVID B. (bastler-david)


Angehängte Dateien:

Lesenswert?

Wenn ich es mit zb
case SerialPinChange.Ring:
versuche bekomme ich immer.
der name "serialPinChange.Ring ist im aktuellen kontext nicht enthalten.

Wie oder besser Wo füge ich den das ein ?

SerialPinChange.CDChanged
SerialPinChange.CtsChanged
SerialPinChange.DsrChanged
SerialPinChange.Break

Vielen Dank

von Thorsten (Gast)


Lesenswert?

Hallo,

sieht man sofort das er Anfänger ist, deshalb sollte er erstmal das 
Pollen hinbekommen, danach auf Events umsteigen. Ich glaube nicht, dass 
es sinnvoll ist direkt mit schwierigen Sachen zu starten. Ansonsten 
könnte man auch die GUI in einen eignen Thread pachen, aber egal.

Nun zum eigentlichen Thema:

Um deine Anforderungen besser zu vestehen benötigen wir noch ein paar 
Informationen bzw. hab ich folgende Dinge verstanden.

Dein externes Gerät benutzt wirklich die Hardware Pins wie z.b. DTR,...?
Das ist wirklich selten geworden das Geräte die Handshakepins benutzen, 
vorallendingen von zweiten von USB to Serial Converter, deshalb noch 
eine weitere Frage von mir.

1. Reicht es nicht aus einfach zu prüfen, ob ein Byte über die serielle 
Schnittstelle angekommen ist?

2. Wie sieht dein HW Aufbau aus? Das Gerät ist direkt an deine COM 
Schnittstelle am PC angeschlossen?

Hier findest Du ein schönes Beispiel von MS. Ist auch schon etwas viel 
für ein blutigen Anfänger, aber das Verständnis sollte erarbeitbar sein.

https://msdn.microsoft.com/de-de/library/system.io.ports.serialport%28v=vs.110%29.aspx

In dieser Methode werden die Daten empfangen und in dem String Message 
gespeichert und in der Console angezeigt, wenn dein Gerät nun Daten 
sendet, dann solltest Du die Werte als String in der Console sehen.
1
public static void Read()
2
    {
3
        while (_continue)
4
        {
5
            try
6
            {
7
                string message = _serialPort.ReadLine();
8
                Console.WriteLine(message);
9
            }
10
            catch (TimeoutException) { }
11
        }
12
    }

von Sven L. (sven_rvbg)


Lesenswert?

Da hat einer mal ein ähnliches Problem gehabt und einen möglichen 
Lösungsansatz bekommen: 
http://www.mycsharp.de/wbb2/thread.php?threadid=111160

Thorsten schrieb:
> Hallo,
>
> sieht man sofort das er Anfänger ist, deshalb sollte er erstmal das
> Pollen hinbekommen, danach auf Events umsteigen. Ich glaube nicht, dass
> es sinnvoll ist direkt mit schwierigen Sachen zu starten. Ansonsten
> könnte man auch die GUI in einen eignen Thread pachen, aber egal.

David erstellt hier aller halben Jahre einen Thread in dem er wissen 
will wie er irgendwas, was die serielle Schnittstelle betrifft 
bewerkstelligen kann. Mir ist nicht bekannt das er es bis heute 
irgendwie geschafft hat.

Ich würde ihm raten die GUI mal außen vor zu lassen, bis er in einer 
Konsolenanwendung das geschafft hat was er will und dann die GUI 
drumherum zu bauen. Leider liest er aber auch immer nur das was er lesen 
will.

Ich hatte Ihm in einem anderem Thread mal zu einem Velleman USB-IO Board 
geraten, mit dem er auf einfachste Art und Weise mal zu eine Erfolg 
gekommen wäre... sei es drum...

von DAVID B. (bastler-david)


Lesenswert?

Das ich keine Ahnung habe steht ja denke ich oben schon klar.

Die MS links habe ich alle schon durch (habe schon paar Monate still und 
heimlich versucht) den code schnipsel versuche ich später noch.

Noch Interessanter sieht aber die Lösung aus dem letzen link von sven 
aus.

Und ja auch solche fertigen Platinen wie zb K8055 habe ich mir angesehen 
und auch die android app bewundere ich sehr aber leider haben die fast 
immer nur digitale Eingänge die mir gar nix bringen.

Der serielle Port kann immer hin analoge Signale erkennen und selber 
ausgeben.
ich werde dann heute abend mal versuchen ob ich damit weiter kommen.
vielen dank

von c-hater (Gast)


Lesenswert?

Lars schrieb:

> Deswegen geht das Port polling in Linux auch nicht

Quatsch. Natürlich kannst du unter Linux die serielle Schnittstelle 
pollen. Allerdings sind Anfänger meist selbst dazu zu blöd... Die Lesen 
in aller Regel einfach blockierend, weil die simplen Programmbeispiele, 
die diese Blinder Wichser typischerweise aus dem Netz zusammenkopieren 
und dann für eigenen Code halten, einfach auch nur genau dies tun...

> und Linux systeme
> laufen tendentiel besser

Quatsch. Windows läuft genau wie Linux immer genau so gut, wie es um die 
Fähigkeiten des Administrators des Systems bestellt ist. Also laufen in 
aller Regel beide Systeme beschissen, weil mindestens 99% ihrer User 
schlicht und einfach keine Ahnung haben...

> ABer ich halt mich dann mal raus... ich sag mal so meine Programme
> laufen alle optimal.. und Laufzeit optmiert mit polling schon seid 20
> Jahren auch schon ohne Visual C# ...

Wenn du die Sprache, in der du deine Programme verfasst, etwa so gut 
beherrschst wie deine Muttersprache, dann vermag ich das kaum zu 
glauben...

von DAVID B. (bastler-david)


Lesenswert?

Von Linux halte ich gar nix.habe seit 16 (2000) Jahren mit Windows zu 
tuhen.
Sorry ganz vergessen zu beantworten ...

Thorsten schrieb:
> Um deine Anforderungen besser zu verstehen benötigen wir noch ein paar
> Informationen bzw. hab ich folgende Dinge verstanden.
>
> Dein externes Gerät benutzt wirklich die Hardware Pins wie z.b. DTR,...?
> Das ist wirklich selten geworden das Geräte die Handshakepins benutzen,
> vorallendingen von zweiten von USB to Serial Converter, deshalb noch
> eine weitere Frage von mir.
>
> 1. Reicht es nicht aus einfach zu prüfen, ob ein Byte über die serielle
> Schnittstelle angekommen ist?
>
> 2. Wie sieht dein HW Aufbau aus? Das Gerät ist direkt an deine COM
> Schnittstelle am PC angeschlossen?



Also ich verwende ein 4x Funk empfänger mit je 4 Ausgängen. Und ein 
alter kassen PC mit ebenfalls 4 echten onboard seriellen ports.
Auf der der Ic nur 1 2 3 4 als zahl sendet mehr nicht.( ausgang 1 sendet 
nur 1/ ausgang 2 sendet nur 2)
da ich aber mit 1 2 3 4 nicht viel anfangen kann wollte ich das ich im 
Programm was unter Windows 7 64 bit läuft/weiter laufen soll
eine optische Möglichkeit haben das ich sehe das der IC mir was mit 
teilt.
Hoffe kommt so einigermaßen rüber.

1:
Ehm wie meinst du das ?

2:JA
Ich habe den IC besser gesagt densen 4 Ausgänge über 1 Kohm auf CD CTS 
DSR und gelötet.
Strom kommt über USB.

Mit den Programm Terminal zeigt es mir auch an das CTS CD DRS richtig 
sind und leuchten auf sobald der IC sendet.

Und Das ich den Port immer nur von einen Programm nutzen kann ist mir 
seit Monaten bekannt aber danke der info :-)

Ich habe jetzt mal:
}

        static void port_PinChanged(object sender, 
SerialPinChangedEventArgs e)
        {
            SerialPort port = sender as SerialPort;

            //Eingangssignal einlesen
            switch (e.EventType)
            {
                case SerialPinChange.Break:
                    break;
                case SerialPinChange.CDChanged:
                    Console.WriteLine("CD Signal" + 
port.CDHolding.ToString());
                    break;
                case SerialPinChange.CtsChanged:
                    Console.WriteLine("CTS Signal: " + 
port.CtsHolding.ToString());
                    break;
                case SerialPinChange.DsrChanged:
                    Console.WriteLine("DSR Signal" + 
port.DsrHolding.ToString());
                    break;
                case SerialPinChange.Ring:
                    break;
                default:
                    break;
            }

Ins Project übernommen und Microsoft visual Studio meldet keine Fehler 
SCHÖN.
Da kommen mir ein paar weite fragen auf was ist oder wo finde ich diese 
Console ? zb bei >>Console.WriteLine<<
Und Welcher code ist für zb Radiobutton zuständig um von deaktiviert auf 
aktiviert zu wechseln ??

Vielen DANK

von Georg (Gast)


Lesenswert?

DAVID -. schrieb:
> Der serielle Port kann immer hin analoge Signale erkennen und selber
> ausgeben.

Der Username DAVID ------ geistert hier doch schon mehr als 1 Jahr herum 
- kann man wirklich, unter Mithilfe des Forums, nach einem Jahr immer 
noch so vollkommen ohne Ahnung sein? Sind wir wirklich so schlecht?

Georg

von Sven L. (sven_rvbg)


Lesenswert?

Schade mein Beitrag letzte Nacht hat den Serverausfall nicht überlebt.

David, die Vellemannkarte hat zwei analoge Ein- und Ausgänge.

Im allgemeinen ist das Ding dank der mitgelieferten DLL sehr einfach zu 
verwenden, in VB.Net, VC++, C#, sogar ASP.net.

Aber zu dir. Du solltest dich mit Grundlagen beschäftigen, d.h ein 
geeignetes Buch nehmen und dich durcharbeiten.

Zuerst wirst Du lernen wie man auf der Konsole zwei Zahlen einliest und 
addiert, irgendwann gehts Richtung GUI und dann wirst Du lernen wie man 
GUI dynmaisch zur Luafzeit erzeugt.

Wenn Du mal die Grundkonzepte verstanden hast, wird es vielleicht auch 
mal was mit der seriellen Schnittstelle etc.

Immer nur Codeschnipsel zusammen zu kopieren und hoffen das es klappt 
hat mit Programmieren nichts zu tun und bringt dich nicht weiter!

von Thorsten (Gast)


Lesenswert?

Ist ja nicht schlimm, wenn er rumgeistert und um Hilfe bittet, natürlich 
sollte er auch Eigeninitaive zeigen. Bei jedem Menschen ist die 
Lernkurve und Lernverhalten anders, ich spreche aus Eigenererfahrung, 
weil ich anders lerne als die meisten Menschen, deshalb sind Bücher und 
Blogs manchmal recht schwierig.

@David:

Ok, jetzt verstehe ich deine Aufgabenstellung und deine Hardware.
Wenn Du mir und anderen Helfern einen gefallen tun willst, dann packe 
doch bitte dein VS C# Projekt Ordner als Zip Datei und lad die Datei 
hier hoch. Andere und ich hätten nochmal die Möglichkeit sich das 
Projekt anzuschauen, weil deine Methode so kein Fehler aufzeigt muss der 
Fehler wo anders liegen.

Bzgl. Console.WriteLine:

Wenn es eine WindowsForm Anwendung ist, dann werden solche Informationen 
im Ausgabefenster (Default) unten rechts angzeigt.

Wenn deine Methoden in der Form selber sind, dann kannst du auf die 
Eigenschaften der Controls relativ leicht zugreifen. Solltest Du eine 
eigene Klasse erstellt haben mit Methoden ist es etwas schwieriger aber 
auch lösbar.

Beispiel, verändert mein Radiobuttoneigenschaft im Form_load:
1
private void Form1_Load(object sender, EventArgs e)
2
{
3
  radioButton1.Checked = false; // aus
4
  radioButton1.Checked = true; // an
5
}

von Wolfgang H. (drahtverhau)


Lesenswert?

Hallo!

Ich würd mal das hier empfehlen:

http://www.vb-paradise.de/index.php/Thread/117228-Serielle-COM-Daten-auswerten/

(Auch die links am Ende des Thread beachten)

Keine Angst weils VB ist. Code lässt sich hiermit übersetzen:

http://codeconverter.sharpdevelop.net/SnippetConverter.aspx

Gruß

von DAVID B. (bastler-david)


Angehängte Dateien:

Lesenswert?

Das wäre SEHR nett ich habe mich in den letzten tagen auch noch mal 
intensiver damit befasst und schon teil erfolge gehabt ( in ein andren 
bereicht der Software)

Was aber ein erkennen der Pins angeht leider keinerlei erfolge.
Es Passiert einfach nix und da habe ich das pin erkennen erst mal raus 
genommen und mich andren aufgaben angenommen.
Es wäre schön wenn die button DSR CTS RXD und CD (hoffe sind die 
eingangs Pins) solage leuchten wie daten (egal welche) da empfangen 
werden.

Ich habe die Button mal zensiert da keinen meine passwörter und Inhalte 
angehen.(hoffe ist ok)

Ich musste feststellen das ich das Projekt nur noch mit visual Studio 
2015 öffnen kann mit 2010 gehts nicht mehr :-( wer weis was ich da 
verborgen habe.
Network 4.5 ?

Vielen Lieben dank für deine/euere Hilfe

von Wolfgang H. (drahtverhau)


Lesenswert?

Hast Du Dir die links angesehen?

Hast Du schon mal eine Beschreibung der ganzen seriellen Schnittstelle 
durchgelesen?

Ich denke es fehlen Dir noch Grundlagen, denn die Schnittstelle erkennt 
eben keine analogen Signale...

Zerteile deine Probleme in kleinere Stücke und dann fang nochmal an.

von Thorsten (Gast)


Lesenswert?

Hallo, ich hab mir deinen Code angeschaut, aber um ein gleiches 
Verständnis zu haben hier nochmal was ich verstanden hab.

Dein Kassen-PC mit 4x RS232 Schnittstellen sendet ASCII Zeichen 1 auf 
Comport 1, Zeichen 2 auf Comport 2 etc. und bedingt dabei die 
Steuerleitungen.

Auf einem anderen PC soll die C# Anwendung die einzelnen COMPorts 
Steuerleitungen abhorchen und den Zustand auf der GUI anzeigen.

Richtig? Wenn ja, wieso schaltest Du nicht die events für deine COMPorts 
ein?
Und mittels Invoke gibst du den Zustand auf deine GUI aus?

Der Kassen-PC sendet wirklich nur 1 und kein CR + LF?

von DAVID B. (bastler-david)


Lesenswert?

Hallo
Vielen Dank fürs ansehen des codes!
Du hast es fast richtig verstanden es geht nicht um 2 PCs sondern um 
einen funk Empfänger der mir auf seinen 4 Ausgängen je die zahlen 1 auf 
Ausgang 1 bis 4 sendet für Ausgang 4 sendet.

also ZB Pin DSR bekommt vom IC IMMER nur 1 gesendet.
CD ZB immer nur die zahl 2

wenn also DSR die 1 bekommt sollte der nennen wir ihn mal Button 1 
leuchten.

Das mit den analogen Signalen weis ich noch nicht wie ich das anstelle.
vorrang hat erst mal der funk empfänger ic da dieser schon signale 
ausgibt mit einen Pegel um die 3-5 volt.

>>Hast Du schon mal eine Beschreibung der ganzen seriellen Schnittstelle
>>durchgelesen?

nein zum ansehen der links bin ich noch nicht gekommen folgt aber später 
noch.

>>Ich denke es fehlen Dir noch Grundlagen, denn die Schnittstelle erkennt
>>eben keine analogen Signale...

Offiziell möglicherweise nicht, inoffiziell kann sies woll.
Beweis folgt heute Abend sobald ich wieder vor ort bin.

von Wolfgang H. (drahtverhau)


Lesenswert?

Häää??? Was is los? Ich versteh kein Wort.

Wie sieht's mit Schaltplan o. Ä. Aus???

von Thorsten (Gast)


Angehängte Dateien:

Lesenswert?

Puh, nun komme ich nicht mehr mit. Bitte zeige das Datenblatt vom 
Funkempfänger.

Hat der Funkempfänger 4 Digitale Outputsignale? Oder gibt er seriellen 
Text aus?

Naja, anhand von dem Beispiel 
http://www.codeproject.com/Articles/678025/Serial-Comms-in-Csharp-for-Beginners 
hab ich eine andere Version gebastelt. Sicherlich nicht das beste, aber 
wenn RTS geschaltet wird, dann wechselt der Radiobutton mit.

Und wenn serielle Textdaten empfangen werden, dann werden diese in der 
Textbox angezeigt.

von DAVID B. (bastler-david)


Lesenswert?

So mal zu dein verlinkten links:
Ich bin mir nicht ganz sicher wie oder an welche ich stelle ich das 
jetzten muss aber ich versucht es mal.

Was die Erkennung analoger Signal angeht so habe ich mal SELBER ein 
video gemacht wo ich zeigen kann das es geht.
Ich habe leider kein Smartphones so mit musste es mein alten nokia n79? 
tuhen.

Nach dem widerstand von 10 Kohm liegen an CTS 4,10 volt an und der strom 
liegt bei 1,25 mA was ich als unbedenklich abhacke.

https://youtu.be/qdSoj7NOaDg

Und ein Schaltplan ja sek daran solls nicht liegen.
hänge ich gleich an

OHHH VIELEN LIEBEN DANK für deine mühe ich gucke es mir gleich an.

: Bearbeitet durch User
von DAVID B. (bastler-david)


Lesenswert?

Mensch Trosten du bist ein held.
Wenn ich mein CI an CTS anstecke und er ein Signal aus gibt ändert sich 
genau wie ich das möchte radioButton1 / SET
Und habe es auch mit akku versucht (gleich spannung) und selbst das geht 
SUPER SUPER
Leider nur da.
wenn ich das jetzt noch auf alle 3 andern pins legen kann so das jeder 
sein eigenen Radiobutton verändern kann und das auf alle 4 serielle 
Ports bin ich am ziel!!

von Sven L. (sven_rvbg)


Lesenswert?

WAS hat der Anschluss eines 12V 7Ah Bleiakkus an die Statussignale einer 
seriellen Schnittstelle mit analogen Signalen zu tun?

Wenn man genau zwei Zustände (an/aus) hat, dann sind das binäre/duale 
Signale.

Wenn ich die Spannung vom Akku messe und den Wert an den Rechner 
übermittel, dann habe ich ein analoges Signal aufgenommen und 
verarbeitet.

Und könntest Du, auch wenn Du dich freust, versuchen wenigstens etwas 
Rechtschreibung und Grammatik zu verwenden, sodass man deine Sätze auch 
versteht?

: Bearbeitet durch User
von Thorsten (Gast)


Lesenswert?

Schön das es funktioniert und ich konnte mich etwas mit Delegate und 
Invoke einarbeiten.

@Sven:

Die Batterie war vermutlich zum testen und ist ganz legetim.

@David:

Anstatt mit Batterie an deinem PC die Signale zu simulieren, kannst Du 
so wie ich gestern kurz die Programme installieren.

http://www.heise.de/download/product/virtual-serial-port-driver-19450
Damit kannst Du Dir Virtuelle COMPorts erstellen und diese wie ein Kabel 
miteinander verbinden.

http://www.der-hammer.info/terminal/
Damit kannst Du die Signalzustände ändern und anzeigen lassen. Ich hab 
gestern kurz zwei das Programm gestartet und mit meinen Virtuellen 
seriellen Schnittstellen geprüft, ob die Steuersignale sich setzen 
lassen, danach hab ich eine Instanz geschlossen und mein 
Beispielsprogramm getestet, damit spart man sich den Hardwareaufbau und 
umgeht erstmal eventuelle Hardwarefehler, den eine Baustelle zur 
Fehlersuche reicht.

Auch wenn mein Code nicht dokumentiert ist, sollte sich nach kurzer 
Einarbeitung dieser Code leicht erweitern lassen. Falls Du das nicht 
möchtest, solltest Du einen Studenten bitten deine Software 
zuprogrammieren gegen etwas Taschengeld.

von Kunibert Kappes (Gast)


Lesenswert?

Thorsten schrieb:
> @Sven:
>
> Die Batterie war vermutlich zum testen und ist ganz legetim.

Er meine sicher das "analoge" Signal.

> Auch wenn mein Code nicht dokumentiert ist, sollte sich nach kurzer
> Einarbeitung dieser Code leicht erweitern lassen.

Aber Vorsicht:
"The PinChanged event is raised on a secondary thread. Because this 
event is raised on a secondary thread, and not the main thread, 
attempting to modify some elements in the main thread, such as UI 
elements, could raise a threading exception."

Ein einfacher Aufruf des Delegaten reicht hier also nicht aus.

von Kunibert Kappes (Gast)


Lesenswert?

Nachtrag: Du hast natürlich Invoke schon verwendet; ich meinte, dass man 
darauf wirklich achten muss und David nicht bei Änderungen das Ganze 
vereinfachen darf.

von Thorsten (Gast)


Lesenswert?

In meinem Beispiel wird delegate und Invoke benutzt, aber wenn ich meine 
persönliche Meinung kundtun darf ist dieses Delegate und Invoke grausam, 
fast so schlimm wie C/C++ Kyrto Pointer etc. geschreibe.

von Kunibert Kappes (Gast)


Lesenswert?

Thorsten schrieb:
> In meinem Beispiel wird delegate und Invoke benutzt, aber wenn ich
> meine persönliche Meinung kundtun darf ist dieses Delegate und Invoke
> grausam, fast so schlimm wie C/C++ Kyrto Pointer etc. geschreibe.

[Halb OT]
Es geht etwas kürzer; du musst im Beispiel z.B. nicht den Namen des 
jeweiligen Controls benutzen (radioButton1.InvokeRequired, 
radioButton1.Invoke etc.), sondern nur InvokeRequired / Invoke, da du 
dich ja ohnehin in der Form befindest.
Manchmal geht es auch mit kleinen Hilfsmethoden und Lambdas eleganter.

private void InvokeUI(Action action)
{
  BeginInvoke(new MethodInvoker(action));
}


...
InvokeUI(() => { label.Text = "Aha"; });

Aber so häufig wie "früher" braucht man das dank TPL bzw. async/await 
ohnehin nicht mehr (in anderen Szenarien; in deinem Beispiel wird es 
einem wegen der Framework-"Callbacks" natürlich aufgezwungen).
[/Halb OT]

von Thorsten (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

@Kunibert

Hab mir dein Vorschlag angeschaut und wenn ich es richtig verstehe wird 
damit ein anoymnus delegate benutzt, richtig?

Anbei eine neue Version mit dem Vorschlag von Kunibert und einer 
zusätzlichen Steuerleitungsanzeige.

von Sven L. (sven_rvbg)


Lesenswert?

Kunibert Kappes schrieb:
> Thorsten schrieb:
>> @Sven:
>>
>> Die Batterie war vermutlich zum testen und ist ganz legetim.
>
> Er meine sicher das "analoge" Signal.

richtig, da ja behauptet wurde, die serielle Schnittstelle kann analoge 
Signale verarbeiten, was sie eben nicht kann!

Ansonsten @Thorsten:
Finde Klasse das Du Ihm da ein konkretes Bsp. gegeben hast!

von DAVID B. (bastler-david)


Lesenswert?

Das ist super nett Torsten vielen lieben dank.
Sehe ich das richtig das der code streifen :

}

        void PinChanged(object sender, SerialPinChangedEventArgs e)
        {
            SerialPinChange SerialPinChange1 = 0;
            SerialPinChange1 = e.EventType;
            switch (SerialPinChange1)
            {

                case SerialPinChange.CtsChanged:
                    if (theSerialPort.CtsHolding)
                    {
                        InvokeUI(() => { radioButton1.Checked = true; 
});
                    }
                    else
                    {
                        InvokeUI(() => { radioButton1.Checked = false; 
});
                    }
                    break;
                case SerialPinChange.DsrChanged:
                    if (theSerialPort.DsrHolding)
                    {
                        InvokeUI(() => { radioButton2.Checked = true; 
});
                    }
                    else
                    {
                        InvokeUI(() => { radioButton2.Checked = false; 
});
                    }
                    break;

            }

        }

        private void InvokeUI(Action action)
        {
            BeginInvoke(new MethodInvoker(action));
        }

Für das erkennen und anzeigen zuständig ist ?

von Thorsten (Gast)


Lesenswert?

@Sven

Jetzt ist es eine Definitionsache was Analog und Digital bedeutet. Die 
Schnittstelle kann nicht direkt Spannungen präzise messen, aber 
innerhalb der Hystherese erkennt die Schnitstelle schon 
Analogespannungen eben als logisch 0 oder 1.

von Sven L. (sven_rvbg)


Lesenswert?

Aber wir wissen beide wie es gemeint war...

von Thorsten (Gast)


Lesenswert?

Der Codestreifen ist ein Eventhandler. Der Pinchange- und 
Datareceivevent wird in der Methode OpenCOMPort eingeschaltet über
1
theSerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
2
theSerialPort.PinChanged += new SerialPinChangedEventHandler(PinChanged);

Und in der Methode CloseCOMPort ausgeschaltet und zwar mit
1
theSerialPort.DataReceived -= new serialDataReceivedEventHandler(DataReceived);
2
theSerialPort.PinChanged -= new SerialPinChangedEventHandler(PinChanged);

Mit der Switch Case Abfrage wird, welcher Pinchange stattgefunden hat 
z.B. RTS und dann über die Methode InvokeUI die Controls vom UI 
geändert.

Wieso dieser anoyme delegate und BeginInvoke benutzt wird liegt daran, 
dass die UI und SerialPort in jeweils einen eignen Thread laufen und das 
geht wohl nur über delegates und invokes.

Wenn Du nun 3 weitere serielle Schnittstellen benutzen willst, 
erweiterst du es wie in deinem Programm und schaltest für jeden den 
Pinchange event ein, dann in der Methode vom Eventhandler fragst Du 
wieder mit der Switch Case Anweisung den Zustand ab und änderst deine 
UI. Also nur noch ein bisschen Copy&Paste und die Methoden umbnennen.

von DAVID B. (bastler-david)


Lesenswert?

Habe ich gemacht kannste noch mal drüber gucken?
und sagen obs so richtig ist.

 SerialPinChange SerialPinChange1 = 0;
            switch (SerialPinChange1)
            {

                case SerialPinChange.CtsChanged:
                    if (theSerialPortA.CtsHolding)
                    {
                        InvokeUI(() =>
                        {
                            radioButton1.Checked = true;
                        });
                    }
                    else
                    {
                        InvokeUI(() =>
                        {
                            radioButton1.Checked = false;
                        });
                    }
                    break;
                case SerialPinChange.DsrChanged:
                    if (theSerialPortA.DsrHolding)
                    {
                        InvokeUI(() =>
                        {
                            radioButton2.Checked = true;
                        });
                    }
                    else
                    {
                        InvokeUI(() =>
                        {
                            radioButton2.Checked = false;
                        });
                    }
                    break;

            }

        }

        void PinChanged(object sender, SerialPinChangedEventArgs e)
        {
            SerialPinChange SerialPinChange1 = 0;
            SerialPinChange1 = e.EventType;
            switch (SerialPinChange1)
            {

                case SerialPinChange.CtsChanged:
                    if (theSerialPortB.CtsHolding)
                    {
                        InvokeUI(() =>
                        {
                            radioButton1.Checked = true;
                        });
                    }
                    else
                    {
                        InvokeUI(() =>
                        {
                            radioButton1.Checked = false;
                        });
                    }
                    break;
                case SerialPinChange.DsrChanged:
                    if (theSerialPortB.DsrHolding)
                    {
                        InvokeUI(() =>
                        {
                            radioButton2.Checked = true;
                        });
                    }
                    else
                    {
                        InvokeUI(() =>
                        {
                            radioButton2.Checked = false;
                        });
                    }
                    break;

            }

        }

        private void InvokeUI(Action action)
        {
            BeginInvoke(new MethodInvoker(action));


            SerialPinChange SerialPinChange1 = 0;
            switch (SerialPinChange1)
            {

                case SerialPinChange.CtsChanged:
                    if (theSerialPortC.CtsHolding)
                    {
                        InvokeUI(() =>
                        {
                            radioButton5.Checked = true;
                        });
                    }
                    else
                    {
                        InvokeUI(() =>
                        {
                            radioButton5.Checked = false;
                        });
                    }
                    break;
                case SerialPinChange.DsrChanged:
                    if (theSerialPortC.DsrHolding)
                    {
                        InvokeUI(() =>
                        {
                            radioButton6.Checked = true;
                        });
                    }
                    else
                    {
                        InvokeUI(() =>
                        {
                            radioButton6.Checked = false;
                        });
                    }
                    break;

            }

             switch (SerialPinChange1)
            {

                case SerialPinChange.CtsChanged:
                    if (theSerialPortD.CtsHolding)
                    {
                        InvokeUI(() =>
                        {
                            radioButton7.Checked = true;
                        });
                    }
                    else
                    {
                        InvokeUI(() =>
                        {
                            radioButton7.Checked = false;
                        });
                    }
                    break;
                case SerialPinChange.DsrChanged:
                    if (theSerialPortD.DsrHolding)
                    {
                        InvokeUI(() =>
                        {
                            radioButton8.Checked = true;
                        });
                    }
                    else
                    {
                        InvokeUI(() =>
                        {
                            radioButton8.Checked = false;
                        });
                    }
                    break;

            }

Ich bekomme keine Fehler angezeigt also siehts gut aus testen kann ichs 
erst später.

von DAVID B. (bastler-david)


Angehängte Dateien:

Lesenswert?

:-(
Dein programm tut was es soll ! SUPER

Mein programm tut was es will nicht so gut.

Habe dein Code übernommen und angepasst MVS zeigt mir auch keine Fehler 
an aber der zustand von den 12 Radiobutton ändert sich nie bei keinen 
port.

Könntes du noch mal Drüber sehen ?
Vielen dank

von Hans Christian Knäckebröt (Gast)


Lesenswert?

Junge junge, hoffentlich sind die Ferien bald vorbei...

von Zeno (Gast)


Lesenswert?

DAVID -. schrieb:
> Habe dein Code übernommen und angepasst MVS zeigt mir auch keine Fehler
> an aber der zustand von den 12 Radiobutton ändert sich nie bei keinen
> port.

Wie viele Rechtschreib- und Grammatikfehler sind wohl in diesem einen 
Satz? Dabei ist der Satz in dieser Hinsicht noch harmlos. Wenn Du so 
liederlich programmierst wie Du schreibst, dann kann da nichts heraus 
kommen.

Sicher macht jeder Fehler - ich auch. Aber was Du hier ablieferst ist 
schon eine Zumutung für den Leser. Du machst es den Lesern hier im Forum 
sehr schwer, Dein Anliegen zu verstehen und Dir zu helfen.
Ich denke auch Du solltest Dich erst einmal mit den Grundlagen befassen. 
Eine serielle Schnittstelle kann keine analogen Signale übertragen. Also 
befasse Dich erst mal mit den Grundlagen, fange auch beim Programmieren 
klein an und arbeite Dich Schritt für Schritt nach oben. Du mußt schon 
verstehen was Du da machst und dann wird auch die Hilfe der Forumsuser 
bei Dir ankommen.

Zeno

von Thorsten (Gast)


Lesenswert?

Hallo,

eventuell deutsch nicht seine Muttersprache.

@David

Tut mir leid, aber das passt nichtmal Ansatzweise. Du hast selbst die 
Methoden falsch zusammenkopiert und es hat erhlich gesagt null Sinn und 
Verstand was Du da treibst.

Du schaltest nirgends die Eventhandler an, obwohl ich es oben noch 
erklärt hab, desweiteren um es einfach zu halten würde ich für jede 
Schnittstelle einen eignen Pinchangeeventhandler benutzen.

Wie ich schon gesagt hatte such Dir einen Studenten der Dir das Programm 
schreibst gegen Taschengeld oder setze Dich mit der Materie auseinander.

von DAVID B. (bastler-david)


Lesenswert?

Hallo
LANGE hats gedauert aber ich habe es scheinbar mit EUER Hilfe 
hinbekommen.
Torsten wie kann ich mich erkenntlich zeigen ?

Da mein Programm immer abstütz wenn ich den pin CDChanged verbinde gehe 
ich davon aus das es nicht ohne weiteres möglich ist diesen pin wie DSR 
abzufragen ?
Habe es mit

                    case SerialPinChange.CDChanged:
                    if (theSerialPort.CDHolding)
                    {
                        InvokeUI(() =>
                        {
                            radioButton3.Checked = true;
                        });
                    }
                    else
                    {
                        InvokeUI(() =>
                        {
                            radioButton3.Checked = false;
                        });
                    }
                    break;
Versucht es verursacht auch keine Fehler bin ich den pin verwende dann 
beendet sich das Programm ohne Meldung

Für Ring gibt es erst gar keine vorgaben in der System.IO.Ports

Naja immer hin 2 pins zum abfragen sind schon mal besser wie 0 :-)

VIELEN DANK EUCH

von Thorsten (Gast)


Lesenswert?

Keine Ahnung ob man auch CD nutzen kann. Einzigen gefallen den du mir 
und anderen tun kannst ist dich hinzusetzen und lernen.

Ich haette für dein Problem eher ein FTDI 232RL genommen (USB/Serial 
Adapter), weil der eine gute DLL, sogar .net bietet und 4 Digitale I/O 
hat.

von DAVID B. (bastler-david)


Lesenswert?

Meinst du so was ?
http://www.ebay.de/itm/x-10-FT232RL-FTDI-USB-zu-TTL-Serien-Converter-Adapter-Modul-5V-3-3V-Fur-Arduino-/291756391053?var=&hash=item43ee093a8d:m:mpw4cnnQYzOYDJSEdE-2O-A

ist nur die frage ob die chips originale oder nachbauten sind die sich 
beim Treiber installieren abschalten.

Ich habe schon ein vor langer zeit gekauft (cp2102) der ist auch USB den 
bekomme aber keinen com port sondern als silicon labs cp210x usb to uart 
bridge com 3.
Ich kann mit meinen Programm zwar den Port offenen aber auf weiteres 
reagiert die Chip nicht alle 3 pins (rxd/txd/RST haben 3.3 volt gegen 
masse und mehr pins gibts bei dem nicht.

Und mit dem 2ten dieses mal mit kabel:
http://www.ebay.de/itm/USB-zu-RS232-TTL-serieller-UART-Wandler-Adapter-Chip-PL2303HX-l-1met-1St-/272299876167?hash=item3f66565f47

Ist es das selbe.

Ich werde woll mal einen dieser FT232RL versuchen.
USB wäre schon gut.
Kann ich den genau so wie bei seriell ansprechen oder muss ich da was 
beachten ?

Vielen DANK

von Thorsten (Gast)


Lesenswert?

>Ich habe schon ein vor langer zeit gekauft (cp2102) der ist auch USB den
>bekomme aber keinen com port sondern als silicon labs cp210x usb to uart
>bridge com 3.

Passt.

>Ich werde woll mal einen dieser FT232RL versuchen.
Entschuldigung ich meinte FT245R, aber aufpassen die Pins können nur 
5V/3,3V.

Ansonsten, wenn dein Kassen-PC einen Parallelport hat, dann könnte man 
auch diesen nutzen.

stackoverflow.com/questions/4607935/c-sharp-lpt-inpout32-dll

von Thorsten (Gast)


Lesenswert?

Der FT232R bietet auch ein paar I/O's siehe Seite 4

http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT232R.pdf

von DAVID B. (bastler-david)


Lesenswert?

Ja der hat einen parallelenport aber ich lese immer wieder das dieser 
unter Windows 7 nicht mehr genutzt werden kann und in Windows 10 nicht 
mehr existiert.

Ich würde gerne USB nehmen schon um in Zukunft auf der Sicherung Seite 
zu sein.
So weit ich weis sind serielle Anschlüsse beinah ausgestorben und noch 
mal ein borad mit >4< stück zu finden wird Woll ein ding von unmöglich.

Ich werde schon doch den FT232RL testen da erkenne ich die pins wieder 
ist mir zum anfangen einfacher würde ich sagen.

Danke für deine mühe.

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.