Forum: PC-Programmierung RS232 mit Visual Studio 2003 - C#


von Christoph Peters (Gast)


Lesenswert?

ich bin am verzweifeln

ich programmiere mit dem Visual Studio .NET 2003 und benötige die
serielle schnittstelle (RS232)

wichtig: nicht nur asyncroner datenverker (RX/TX) sondern auch das
setzen der Pins RTS und DTR sind für meine anwendung wichtig. keine
beschrenkung auf nur 4 ports (COM1...COM4) sondern mindestens 20 ports
müssen unterstützt werden, besser wären noch mehr

ich habe bereits mehrere codebeispiele aus dem internet ausprobiert,
habe aber keine so richtig zum laufen bekommen.

hat jemand eine fertige voll funktionierende bibliotek für mich oder
ähnliches?

wäre euch für jede art von hilfe sehr sehr dankbar!!

danke
christoph

von T.Stütz (Gast)


Lesenswert?

- Suchmal in der (mitgelieferten) MSDN nach "Serial Communications in
Win32" da steht alles drin

- mit SetCommState und entsprechenden dcb.fRtsControl sowie
dcb.fDtrControl können die Controllleitungen direkt gesetzt werden oder
du stellts das so ein wie benötigt (beim senden von Zeichen an/aus
etc..)

- Die Anzahl der COM-Ports die unterstützt werden ist
Betriebssystemabhängig. Das verwenden der COM-Ports ist einfach:
CreateFile mit "Datei"namen "\\.\COM1" bis "\\.\COM255".

Wozu wird eigentlich mehr als 2 COM-Ports benötigt, 20 sind schon echt
der Hammer ???

Es gibt auch sogenannte RS232-Umschalter (per LPT) die bis zu 16
RS232 - Anschlüsse an einen COM-Port anbinden.

Gruss

von Tobi (Gast)


Lesenswert?

bei com1-9 kann man auch nur COM1 usw schreiben, da kann die pfadangabe
entfallen.

über den dcb kann man nur umständlich die statusleitungen setzten,
besser ist dafür EscapeCommFunction und GetCommModemStatus

von Christoph Peters (Gast)


Lesenswert?

wir haben in der firma nen nport von moxa, der hat alleine schon 16
comports, die über ethernet erreichbar sind und unter windows als
virtuelle comports erscheinen

ich mach mich mal an die msdn, guck mal ob ich das hinbekomme. wäre
super, falls jemand da schon was fertig hat, dann bitte her damit, mir
rennt die zeit davon

danke
christoph

von Andreas (Gast)


Lesenswert?

...wobei das Handshake (RTS/DTR) nichts mit synchron zu tun hat!

Andreas

von Jürgen Schuhmacher (Gast)


Lesenswert?

Christoph, ich habe eine Weile mit dem Pendant der MOXAs gearbeitet:
http://home.arcor.de/devicemaster/

Der vertrat auch 16 Ports. Die waren aber frei im Namen konfigurierbar.
Wie macht das der MOXA-Treiber?

Bei den Programmen, die Comtrol Corporation rausgibt, ist eine
Beisiel-Appl. die alle Leitungen einzeln setzt.

Ausserdem kann ich Dir www.iftools.com empfehlen. Die dortige CTB-Lib
ermöglcht auch einen einfachen Zufriff auf die Ports. Falls Du dieses
wx-System nicht nuzzen kannst, könntest Du aber die Portierung und die
Beispielapllikation selber durchsehen, um zu erfahren, wie genau man
mit Ports operiert.

von Christoph Peters (Gast)


Lesenswert?

danke leute, hab die perfekte componente gefunden. ist c# quelltext und
baut complet auf der Winapi auf. einfach super
wer den quelltext haben will, bitte melde, schick euch den dann per
mail

danke
christoph

von T.Stütz (Gast)


Lesenswert?

Bitte lass uns nicht dumm sterben und sag uns wie/woher dieser C#
quelltext ist...

Gruss

von Christoph Peters (Gast)


Angehängte Dateien:

Lesenswert?

CommBase.cs und myRS232 in projekt einbinden und los gehts.

myRS232 hab ich geschrieben und setzt der CommBase nur nen schönen hut
auf g

was das teil kann:
- RX/TX
- RTS/DTR setzen und sogar der TX-pin kann auf 1 oder 0 mit break
gesetzt werden. in der myRS232 heißt das property glaub ich O_Break
oder so.
- baudrate und comport kann eingestellt werden! alle anderen
schnittstellenparameter wie stopbits,parity etc. natürlich auch, sind
nur noch keine propertys mit get/set in der myRS232 implementiert.
könnt ihr ja machen und dann wieder hier reinposten.

für mein projekt brauche ich momentan nicht mehr einstellungen, daher
erweiter ich die komponente wenn ich mal wieder mehr zeit habe.

fänd es super, wenn ihr den thread hier mit euren erfahrungen aktuell
haltet. scheibt einfach wenn ich das ding erweitert habt oder es
benutzt habt und euch fehler aufgefallen sind.

gruß
christoph

von Geri (Gast)


Lesenswert?

Hallo Christoph

Vielen Dank, dass du uns deine sehr umfangreiche RS232-Libray zur
Verfügung stellst! Einen Verbesserungsvorschlag hätte ich allerdings
noch. Schön wäre, wenn die Library in eine Komponente verpackt wäre und
die Empfangsroutine als Ereignis
z.B. onReceive(string s) und / oder
onReceiveBinard(buffer buf) für die Binärübertragung
als Schnittstelle zur Verfügung stellt.

Wie gesagt, nur ein Vorschlag, jedenfalls eine tolle Arbeit

Beste Grüsse
Gerhard

von Christoph Peters (Gast)


Lesenswert?

ich habe vor das teil noch umfangreicher und sauberer zu gestalten, wie
ich das in eine komponente packen, weiß ich noch nicht, aber das finde
ich schon heraus. momentan wenig zeit, deswegen dauert es noch ein
wenig.

danke an alle für die vorschläge und anregungen, auch an die, die mir
diese per mail zukommen lassen haben.
vieleicht wird ja auch ein kleines open source projekt draus.

gruß
christoph

von Geri (Gast)


Lesenswert?

Hallo Christoph

Ich kann dir hier dann vielleicht ein paar Tipps geben, wie man zu
einer Komponente kommt.

Beste Grüsse

Gerhard

von Oma-mit-Dackel (Gast)


Angehängte Dateien:

Lesenswert?

Hi

ich weiss leider nicht wie deine Erfahrungen mit der MSComm32.ocx
aussehen und ob es da eine Einschränkung in Bezug auf sychron/asynchron
b.z.w. die Anzahl der ComPorts gab. Bei mir hat es jedenfalls immer
bestens funktioniert. Momentan steuer ich damit einen AT90S2313 von
einem Tool erstellt in VS2004 C++.net. Die Schaltung selbst ist ein
230V Dimmer und per RS232 schicke ich den Startzeitpunkt der Zündung in
den Atmel. Die Datei abspeichern und unter Extras->Toolboxelemente
hinzufügen/entfernen -> Reiter ComSteuerelemente -> Button Durchsuchen
... dann wenn gefunden doppelklicki. Es erscheint dann in der Toolbox
unter Komponenten als Telefonhörer-Icon(zumindest bei mir) Ich werde
mal versuchen dein Programmbeispiel in ein Benutzersteuerelement zu
stopfen. Wäre dann wohl das einfachste...per Drag and Drop auf die Form
ziehen und alles in Property's ansprechen.

Gruss die Oma

von Tilman (Gast)


Lesenswert?

Hallo everybody !
Christoph, danke für Deine Programme. Sie sind super. Leider habe ich
mit "ComBaseTerminal" das gleiche Problem wie mit "Telix", oder
"Hyper Terminal". Ich verbinde meinen iPaq H5500 via Bluetooth über
eine Com Schnittstelle mit meinen Laptop. Mit dem Programm "Com Test"
für den iPaq kann ich Daten vom Pocket PC auf meinen Laptop schicken.
Diese erscheinen dann im Textfenster z.B. Deines Programmes
"ComBaseTerminal". Wenn ich aber was senden will (vom Laptop auf den
Pocket PC), gibt's regelmässig einen gnadenlosen Systemabsturz. Blauer
Bildschirm mit einer Fehlermeldung, die nur etwa 1 Sekunde lang zu sehen
ist. Dann Neustart. Das kann und will ich nicht gut finden. Woran kann
das nur liegen ? Wie gesagt, das gleiche Problem habe ich auch mit
anderen Programmen. Einzig und allein das famose Programm "Advanced
Serial Port Monitor 3.0" ist in der Lage, Daten auf meinen PPC über
Bluetooth zu senden, ohne dabei einen Absturz zu verursachen.

Ich bin dankbar für jede Hilfe beim Finden der Ursache des Problems.
Tilman.

von Christoph (Gast)


Lesenswert?

nur so als info, ich hab den ComBaseTerminal nicht selbst geschrieben,
hab die quelltexte irgendwo im netz gefunden und fald sie ziemlich blöd
an anderer stelle einzubinden. deswegen hab ich die CommBase.cs der
myRS232.cs vererbt und das ding somit einfacher nutzbar gemachen.

@Tilman
keine ahnung was bei dir los ist, aber blue screen hört sich sehr nach
Win98 an, was für ein Betriebssystem nutz du? schon mal daran gedacht,
dass es auch was mit den bluetooth treibern zu tun haben kann?
vielleicht ist bei denen was krum.

freut mich übrigens sehr, dass die myRS232 bei so vielen anklang
findet, danke für die mittarbeit.

gruß christoph

von Tilman (Gast)


Lesenswert?

Ach so...Du  meinst also, da könnte ein Zusammenhang bestehen zwischen
dem BLAUEN Bildschirm und BLUE Tooth ? Da bin ich ja noch gar nicht
drauf gekommen ! Vielleicht sollte ich ja mal WiFI ausprobieren und
gucken, welche Farbe der Bildschirm dann annimmt.
...nix für ungut, aber zu so später Stunde muss man einfach auch mal
ein Spässle machen können.
Jedenfalls habe ich WIN XP als OS. Ich hab inzwischen ein weiteres
Programm gefunden, das HERVORRAGEND funktioniert. "ByteWedge" von
Fogsoft. Da das also funktioniert, kann das Problem definitiv kein
genereller Fehler der BlueTooth Hard- oder Software sein. Es muss ein
Fehler in der Verbindungssoftware sein.
Ich freu mich schon auf die Fehlersuche. Der Absturz geschieht wie
gesagt NUR beim Senden von PC auf iPaq.

von Slowflyer (Gast)


Lesenswert?

Hallo,

sehr gute Arbeit! Mit soetwas kann man was anfangen. Ich bräuchte nur
eine kurze Erklärung: Welche Funktion hat der Timer?

Gruß Willi

von Nightfall (Gast)


Lesenswert?

Hallo,

das myRS232_cs_net2003.zip ist schon so ziemlich genau das, was ich
brauche. Allerdings habe ich keinerlei Java-Kenntnisse. Ich muss ein
Programm zur Ansteuerung einer RS232 schreiben, die mit einem FPGA
kommunizieren soll. Wie kann ich das Programm am besten an Visual
Studio.NET anpassen?

Gruß

Nighfall

von Slowflyer (Gast)


Lesenswert?

Die Klasse ist für das .Net in der Sprache C# geschrieben. Dafür
brauchst du keine Java sondern C#-Kenntnisse.

von Nightfall (Gast)


Lesenswert?

Äh ich meinte die .csproj Dateien. Die bekomm ich mit .NET nicht auf.

von Christoph Peters (Gast)


Lesenswert?

Wo genau ist dein Problem? musst schon etwas näher beschreiben was du
tun willst.
wenn du die RS232 in einem C#-Projekt verwenden willst, brauchst du nur
.cs Dateien in deinem Projekt einbinden.
Combase.cs und myRS232.cs
das ist alles

bekommst irgendwas nicht mit deinem .NET geöffnet. welche version von
.NET hast du und bist du sicher dass du auch C# installiert hast und
nicht nur Visual Basic oder so?

gruß Christoph

von Nightfall (Gast)


Lesenswert?

Also folgendermaßen:

Ich möchte einzelne Zeichen über Serielle Schnittstelle (die RS232)
senden und empfangen. Dazu benötige ich die Einstellungen für
Baudrate,Paritätsbit, ect. Ich benötige das ganze für C mit
parameterübergabe und so. (Sorry, wenn ich mich etwas unprofesionell
ausdrücke, doch meine C-Kenntnisse sind etwas eingerostet. Ist ein
Weilchen her, dass ich zuletzt was programmiert habe).
Nun habe ich hier dein ComBaseTerminal gefunden, das alle Anforderungen
vordergründig erfüllt. Nach geringfügigen Anpassungen hätte ich meines
Erachtens das, was ich brauche. Wenn ich jetzt aber die Projektmappe
ComBaseTerminal.sln mit Microsoft Visual C++ .NET öffnen möchte, kommt
eine Fehlermeldung die mich darauf hinweist, dass "die Anwendung für
Projekt ComBaseTerminal.csproj" nicht installiert ist. Und "stellen
Sie sicher, dass die Anwendung für den Projekttyp (.csproj)installiert
ist".

von Nightfall (Gast)


Lesenswert?

Also, hab nochmal mit meinem Systemadmin geredet. Das Problem ist, das
wir nur die Visual Studio.Net C - Version haben. C-Sharp (C#)
funktioniert da leider nicht. Mein Fehler. Lässt sich die Klasse in C++
Code umwandeln? Ich habe leider keinerlei Kenntnisse, von den
Unterschieden zwischen C# und C++. Oder bekomme ich vielleicht irgendwo
einen günstigen C# Compiler? Hoffe ihr könnt mir helfen.

von Christoph Peters (Gast)


Lesenswert?

wenn du willst kann ich dir ne dll erzeugen, die bindest du unter
verweise ein und fertig. sollte funktionieren. versuche das mal im
laufe des tages hier rein zu stellen.

gruß
christoph

von marco (Gast)


Lesenswert?

>>Oder bekomme ich vielleicht irgendwo
einen günstigen C# Compiler?

Borland C# Builder -> afaik freeware

von Christoph Peters (Gast)


Angehängte Dateien:

Lesenswert?

hier hab dir die quelltexte unter C# zu einer classlibrary compiliert.
jetzt kannst du die in der zip befindlichen dll einfach in dein projekt
unter verweise einfügen und darauf zugreifen.

viel erfolg
christoph

von Olaf (Gast)


Lesenswert?

Marco,
schau mal in das Verzeichnis
c:\windows\mircosoft.net\framwork\<version>\

dort solltest Du den c# compiler csc.exe finden.

Olaf

von Kürsat Kantas (Gast)


Lesenswert?

Hallo Leute,

ich brauche eure Hilfe und zwar habe ich mir die Datei von Cristoph
runtergeladen und für meine RS232 Anwendung verwendet aber ich habe
folgendes problem.

Die Daten die über die Schnittstelle empfangen werden sind permanent
gesendete Daten. Leider empfange ich diese aber nicht permanent.

In der Funktion Open wird zwar ein Thread gestartet um diese Daten zu
bearbeiten aber irgendwie klappt es nicht so ganz.

Habt Ihr eine Idee ?

Gruß Kürsat

von Christoph Peters (Gast)


Lesenswert?

hi

ein gerät sendet also ununterbrochen daten und du versuchst sie zu
empfangen, aber du empfängst nicht alles?

du kannst mit myRS232 nur maximal 4069 bytes empfangen, das ist die
größe des empfangsbuffers. vielleicht erhöhst du die größe des buffers
einfach. was mciht stutzig macht ist, bei einem buffer overflow wird
eine Error Exception ausgelöst, sodass es dir aufgefallen wäre. ich
kann nur von mir behaupten, dass myRS232 bei mir einwandtfrei
funktioniert.
schau mal ob das nicht auch ein hardwarefehler sein kann oder teste den
empfang mal mit dem HyperTerminal von windows oder so. dann weißt du ob
es wirklich an der software liegt oder vielleicht doch nicht.
eine frage noch. mit wieviel baud sendest du?

von Oma-mit-Dackel (Gast)


Lesenswert?

Hi,

kannst du nicht dafür sorgen dass der Sender Daten nur bei Änderung
sendet? In diesem Zustand musst du ständig auslesen, wenn dein PC da
nicht hinterherkommt gehen dir viele Daten verloren! Was sind das für
Daten und welches Gerät sendet diese ?

Gruss die Oma

von Kürsat Kantas (Gast)


Lesenswert?

Hallo
Also ich sende 19200 Baud. Das Gerät das die Daten senden Funktioniert
einwand frei. Ich hatte die Anwendeung bereits Programmiert aber in
C++. Da läuft es perfekt und ich verliere keine Botschaften vom Sender.
Aber ich muss die Anwendung in C# einbinden können weil für eine Spätere
Anwendung eine GUI gebastelt werden soll und die GUI wird mit C#
realisiert.

Wenn es ein Bufferoverflow entsteht weiß es der Sender und sendet dann
ein Bufferoverflow- Frame. Weil der Sender diese Botschaften wiederum
von einem anderen Gerät empfängt.

Also die Sache sieht so aus. Ich habe ein Gerät das CAN Daten von einem
Spammer empfängt. Die empfangenen Daten sollen über die RS 232
Schnittstelle an den PC gesendet werden. Da habe ich dein Quellcode
versucht einzubauen aber mein PC empfängt die Botschaftten
1. verzögert
2. unterbricht es den Empfang nach dem 2 Datenframe

Kann ich mit deinem Code (Christian) vom COM Port Daten emfangen ?
Wenn ja wie ? Würde mich freuen wenn ihr mir da Helfen könntet.

Gruß
Kürsat

von Kürsat Kantas (Gast)


Lesenswert?

Sorry die Frage war kann ich permanent Daten empfangen ?

von Christoph Peters (Gast)


Lesenswert?

> Sorry die Frage war kann ich permanent Daten empfangen ?
ich denke mal daten mit deinem pc und der myRS232 willst du permanent
daten empfangen?!
dann ist die antwort ja, du kannst indem du in einer schleife z.B.
einem Timer immer den Buffer ausließt. das geht mir Readstr oder
Readbytes

von slaud (Gast)


Lesenswert?

1
#region Using directives
2
3
using System;
4
using System.Collections.Generic;
5
using System.ComponentModel;
6
using System.Data;
7
using System.Drawing;
8
using System.Windows.Forms;
9
10
#endregion
11
12
namespace _04serielle_schnitstelle
13
{
14
    partial class Form1 : Form
15
    {
16
17
        public Form1()
18
        {
19
            InitializeComponent();
20
21
        }
22
23
        private void serialPort1_ReceivedEvent(object sender,
24
System.IO.Ports.SerialReceivedEventArgs e)
25
        {
26
            try
27
            {
28
29
                empfangen = serialPort1.ReadExisting();
30
                empfang = true;
31
32
            }
33
            catch
34
            {
35
                textBox1.Text = ("fehler");
36
            }
37
38
        }
39
40
        private void button1_Click(object sender, EventArgs e)
41
        {
42
            if (serialPort1.IsOpen)
43
                MessageBox.Show("Fehler serialport bereits
44
verwendet");
45
             
46
            else
47
            {
48
                this.serialPort1.Open();
49
                button1.Enabled = false;
50
                button2.Enabled = true;
51
                button3.Enabled = true;
52
                button4.Enabled = true;
53
                button5.Enabled = false;
54
                textBox2.Enabled = true;
55
                label1.Text = ("Status: port open");
56
57
58
            }
59
        }
60
61
        private void button2_Click(object sender, EventArgs e)
62
        {
63
            if (serialPort1.IsOpen)
64
            {
65
                this.serialPort1.Close();
66
                button1.Enabled = true;
67
                button2.Enabled = false;
68
                button3.Enabled = false;
69
                button4.Enabled = false;
70
                button5.Enabled = true;
71
                textBox2.Enabled = false;
72
                label1.Text = ("Status: port closed");
73
            }
74
        }
75
76
        private void button3_Click(object sender, EventArgs e)
77
        {
78
            string senddata;
79
            senddata = textBox2.Text;
80
            this.serialPort1.Write(senddata);
81
            textBox2.Text = ("");
82
            label5.Text = ("Gesendet:" + senddata);
83
        }
84
85
        private void button4_Click(object sender, EventArgs e)
86
        {
87
            textBox1.Text = ("");
88
        }
89
90
        private void timer1_Elapsed(object sender,
91
System.Timers.ElapsedEventArgs e)
92
        {
93
            if (empfang == true)
94
                {
95
                    textBox1.Text = (textBox1.Text + empfangen);
96
                    empfang = false;
97
                }
98
99
            if
100
                (abfragen == true)
101
                    {
102
                        label7.Text = (label7.Text + " " +
103
serialPort1.PortName);
104
                        label8.Text = (label8.Text + " " +
105
serialPort1.BaudRate);
106
                        label9.Text = (label9.Text + " " +
107
serialPort1.DataBits);
108
                        label10.Text = (label10.Text + " " +
109
serialPort1.StopBits);
110
                        abfragen = false;
111
                    }
112
113
        }
114
    }
115
}


hab mal einen code geschrieben for dot net framework 2.0
wo die serielle unterstützt wird

hat ziemlich elegant ausgesehen und auch gut funktioniert

von slaud (Gast)


Lesenswert?

man könte auch ein panel oder etwaws machen und des für invalidate
erklären fals daten angekommen sind und das neue zeichen dann in einen
ausgabestring schreiben ist nur zur erleuterung der grunzäzlichen
einfachheit bei.net2.0

müste mit der aktuellen betta eigentlich ähnlich funktionieren

von Kürsat Kantas (Gast)


Lesenswert?

Ich habe das Problem gelöst.

von Eddy Pfeifer (Gast)


Lesenswert?

@ Christoff
Vielen Dank vür den Code, war genau das wonach ich gesucht habe.
Mann findet leider nicht sehr viele Beispiele zur rs232 für Visual
Studio im Netz.

@Kürast
Hallo Kürast,
wie hast du das Problem gelöst?
Ich habe es in eine Endlosschleife reingepackt in der die read()
Funktion aufgerufen wird und wenn Daten da sind, werden sie auf der
Console ausgegeben.

Es funktioniert auch, nur geht dabei die CPU-Last auf 50% (P4 3,2)
Ich denke für für den Echtbetrieb ist es dann zu viel.

Kannst du deine Lösung hier reinstellen?

Gruß

Eddy

von Hans W. (Firma: Wilhelm.Consulting) (hans-)


Lesenswert?

@eddy

gegen die cpu-last (zumindest unter c++) hilft ein Sleep ;) aber bitte
über 10ms ;)... 100 sollten eigetnlich wunderbar funktionieren..hängt
aber vom buffer,... ab.

aja und in irgendeinem anderen rs232-thread hab ich in den letzten 2-3
tagen mal etwas aus der msdn gepostet... da gings um das ansprechen von
ports über com9 ;) da musst nämlich irgendwas anders machen...

73

von Kürsat Kantas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Eddy,

ich musste das Projekt modifizieren da ich meinen kompletten Quellcode
freigeben darf. Aber du kannst mit dem gegebenen Projekt RS232
Schnittstelle permanent abhören. Du kannst es so modifizieren wie du es
möchtest.

Mit freundlichem Gruß

Kürsat

nicht Kürast :-)

von Johann Gysin (Gast)


Lesenswert?

Hallo zusammen

Wer sich noch kein Visual Studio gekauft hat, dem kann ich die C#
Express Edition nur wärmstens ans Herz legen. Ist im Moment noch
kostenlos und darin ist eine tolle Klasse für den RS232 Port enthalten
(.NET Framework 2.0), welche bestens funktioniert.

Grüsse
Johann

von Chris (Gast)


Lesenswert?

Wo bekommt man eigentlich die C# Express Edition her wenn man kein DSL
hat? Als Beilage hab ich's noch nicht entdeckt.

Chris

von Johann Gysin (Gast)


Lesenswert?

Eventuell kannst Du bei Microsoft eine CD bestellen, aber ich bin mir
nicht sicher.
Jedenfalls wird es ab mitte November die definitifen Versionen im
Kaufhaus geben und auch sehr günstige Versionen, welche den Express
Editions entsprechen.

Grüsse
Johann

von Christian Sulzberger (Gast)


Lesenswert?

Hallo Alle
Ich habe das Problem, dass bei mir der COM-Port als Belegt ausgewiesen
wird (keine Ahnung warum, keine Anwendung greift darauf zu).Wenn ich
die angeschlossene Komponente (eine Waage) abschliesse und wieder
anschliesse funkt meine Anwendung wieder.
Mit dem Code von Christoph kann ich nur aus der Anwendung geöffnete
COM-Ports schliessen. Hat einer von Euch eine Idee wie ich die
COM-Ports einem "Reset" unterziehen kann?
Grüße Christian

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mit dem ProcessExplorer kannst Du herausfinden, welches Programm Dateien
und auch Schnittstellen blockiert. Dazu die Funktion "search handle"
aufrufen und wahlweise "COMn" oder "Serialm" angeben (n durch
Schnittstellennummer, m durch Schnittstellennummer - 1 ersetzen).
Ein so gefundenes Handle kann, wenn man den zugehörigen Prozess
betrachtet, auch hinterrücks geschlossen werden.


Den ProcessExplorer gibts für lau bei www.sysinternals.com

von Christian Sulzberger (Gast)


Lesenswert?

Danke, das Tool kann was!

von dominik (Gast)


Lesenswert?


von Joe (Gast)


Lesenswert?

Hi,

habe die myRS232 & CommBase Klassen in ein Projekt eingebunden. Soweit
funktioniert alles problemlos.

Nur:

Öffne ich z.B. für Tests den COM Port mit einem anderen Tools (z.B.
WinNav und vorher ein VB 6 Tool) und schicke damit Daten - o.k.
Öffne ich dann mein Tool und schicke Daten - o.k.
Öffne ich z.B VB 6 Tool schicke Daten - ComEventBreak

Es scheint als ob der ComPort unter Windows evtl. mit anderen Settings
geschlossen wurde oder abgestürzt ist?!?!?

Hat jemand eine Ahnung - bin seit ca. 4 Tagen schon dran, jedoch noch
kein Erfolg in Aussicht.

MfG
Joe

von Tabaluga (Gast)


Lesenswert?

Ich will nun auch den Code nutzen, bin aber leider blutiger Anfänger.
Ich hab mir die DLL runtergeladen und kann das Projekt offensichtlich
nicht öffnen, da ich eine zu alte Version von VB.NET habe. Ach ja, ich
will das in VB.NET programmieren.
Verstehe ich das richtig, dass ich die Library trotzdem benutzen kann,
da sie schon kompelliert ist, oder geht das nur, wenn ich C benutze und
eine neuere Version hab.

Ich habe die Version von 2002 (VB Version 7)

Kann mir jemand da weiterhelfen?

Gruß Tabi

von Lars Baldauf (Gast)


Lesenswert?

Ich habe so meine liebe mühe mit dem CommBase.cs ich schicke 15 Bytes
über Funk auf meine Rs232 Schnittstelle. Von zeit zu zeit jedoch kommen
anscheinend nur 12 oder 13 Byte an... Wer kann mir helfen?

von Markus Landolt (Gast)


Lesenswert?

Habe das Problem, dass meine Applikation (Windows-App in C#) mehrere
COMM-Schnittstellen zur gleichen Zeit unterstützen muss (Senden und
Empfangen von SMS über mehrere Module).
Hierbei kommt es nach einigen Tagen vor, dass das Handle einer
geöffneten COM-Schnittstelle verloren gehen kann.

Wie kann ich herausfinden (Codetechnisch) welcher COM-Port welche
Handle besitzt???  (such Handle von COM-Schnittstelle "2" z.B)

Muchas gracias!!!!!

von Slowflyer (Gast)


Lesenswert?

Hi Leute,

ich verwende für C# als Entwicklungsumgebung das SharpDevelop 2.0 (ist
noch Beta genauso wie das .NEt-Framework 2.0 Beta2). Das .NET-Framework
2.0 bringt von Haus aus eine Bibliothek für die serielle Schnittstelle
mit (System.IO.Ports). Vielleicht hilft euch das weiter.

Gruß, Slowflyer

von Mike32m (Gast)


Lesenswert?

Hi Leute,

kann man das .Net-Framework 2.0 auch mit Visual Studio .Net 2003
(Professional) benutzen ?

Gruß, Mike

von Slowflyer (Gast)


Lesenswert?

Das weiss ich nicht, da ich kein VS habe. Ich wüsste jedoch nicht was
dagegen sprechen würde.

von Mark K. (Gast)


Lesenswert?

Hallo,

da ich leider noch keine Ahnung habe von RS232 programmierung, wollte
ich fragen, ob es eine Grundlegende Doku gibt, die das ganze einem in
C# halbwegs verständlich beschreibt.


Gruß
Mark K.

von Tabaluga (Gast)


Lesenswert?

Hi!

Ich kenne keine Solche Doku. Was mir ganz gut geholfen hat, war ein
funktionierendes Programm, aus dem ich mir das nötige raus gesucht
habe. Allerdings ist das in VB.net programmiert. Aber vielleicht hilft
dir das ein wenig weiter...
http://www.codeworks.it/net/VBNetRs232.htm

Hilfreich kann auch Wissen über die Arbeitsweise von RS232 sein.
http://www.beyondlogic.org/

Gruß Tabi

von Eltman (Gast)


Lesenswert?

hi

Johann Gysin du hast ja anscheint schon was mit der Net2.0 und C#
gemacht. Senden geht bei mir schon , ist ja auch kein großes Problem.
Nur mir dem Empfangen habe ich so meine Probleme.
Es gibt ja eine Funktion Datareceive die aufgerufen wird wenn Daten
ankommen. Ich wollte jetzt Testweise diese Daten in ein Textbox
schreiben, bekomme aber ne Fehlermeldung das die Textbox in einen
anderen Thread erstellt wurde.
Wie kann ich das umgehen.

Gruß Eltman

von slaud (Gast)


Lesenswert?

hab ich auch schon gemerkt und zwar kann man in der ereignisrotiene vom
serial port recive event nich direkt in eine text box oder ähnliches
schreiben

aber in geine globale variable und dan irgend etwas für invalidate
erklären

von Gøran Homberg (Gast)


Lesenswert?

Hola,
Hab grad auch mit der System.IO.Ports.SerialPort Klasse zu tun und bin
kurz vor der Weisglut ;)

Aber erstmal zu Eltmans Porblem.
Was Slaud angesprochen hat funktioniert auch, aber du kannsts acuh
einfacher ham.

Im Eventhandler ne Methode aufrufen die Dir dann den Text in z.B. ner
Textbox setzt. Funzt einwandfrei.

Nu zu meinem Problem ;)
(Visual Studio 2005, C# .Net 2.0)

Ich versuche mit SerialPort.ReadExisting() den kompletten
Rückgabestring auszulesen. Leider wird mir dieser immer wieder
zerhackstückelt und teilweise auch in vertauschter character
reihenfolge... Ich geh hier bald am Krückstock da mir echt keine Lösung
mehr einfällt. Wenn alles zerhackstückelt, aber in der richtigen
reihenfolge kommt... was solls... aber dann auch noch vertauscht... bin
ja nicht moses :(

Falls jemand ne Idee zu hat, wäre ich um die Lösung extremst dankbar
:)

Grüße aus Mannheim,
Gøran

von Gøran Homberg (Gast)


Lesenswert?

Achso, hier noch n kleiner Codeschnipselt für Eltmans...

        private void SerPort_DataReceived(object sender,
SerialDataReceivedEventArgs e)
        {
                try
                {
                    SetReply();
                }
                catch (Exception ex)
                {
                    System.Console.WriteLine(ex.ToString());
                }
        }

private void SetReply()
{
    // Vorsicht vor enventuell nicht abbildbaren characters wie STX,
etc.
    textbox1.text = SerPort.ReadExisting();
}

von Eltman (Gast)


Lesenswert?

Danke für den kleiner Codeschnipselt.
Mit dem Problem zerhackstückelter String, da gibt es bei der Seriellen
Schnittstelle und VS2005 die Einstellung
ReceivedBytesThreshold das steht meist auf 1, sobald ein Bytes
empfangen wurde wird er Event ausgelöst.

Eltman

von Eltman (Gast)


Lesenswert?

Mein kommunikation mit dem Controller funktioniert jetzt eigentlich
richtig gut. Hab aber auch Enfangs und End Zeichen eingeführt.

Eltman

von Gøran Homberg (Gast)


Lesenswert?

Hola,

hab mein Problem eben auch gelöst. Ich verwende einfach die Methode
ReadTo(xxx); und verwende xxx = Delimiter ( in meinem Falls \r). Siehe
da, die sache funzt ;) Jetzt bekomm ich immer einen Antwortstring der
genau bis zum Delimiter reicht. Mehr wollte ich nicht. Jetzt kann ich
endlich die Read-Properties für meinen Laser sicher setzen... Ok, noch
ein Trick hat das ganze benötigt, aber der tut hier nix zur Sache denk
ich ;) War Anwendungsspezifisch.

Dann sind ja nu alle happy, oder? :) :) :)

Greetings

von lordi (Gast)


Lesenswert?

hi, das mit den zerstückelten infos habe ich anders gelöst.

bei meinem projekt muss ich ein lesegerät einlesen.
ReceivedBytesThreshold hat mir nicht geholfen, weil die informationen
immer eine unterschiedliche länge haben und dadurch dann eintweder kein
event ausgelöst wurde bzw. auch zu früh.

habe dann einfach den ReceivedBytesThreshold auf 1 gelassen und in der
funktion, welche einliest, am anfang einen thread.sleep eingebaut von
0,5 sekunden. diese zeit bemerkt man bei der ausführung nicht und die
daten werden in der zeit komplett in den puffer geladen aus dem dann
ausgelesen wird. ergebnis war, das jedesmal eingelesen wurde und alle
daten auf einmal ankamen.

ob es in deinem fall auch eine lösung ist, musst du wissen... kommt
halt drauf an, was du auslesen willst.

von Wolfram (Gast)


Lesenswert?

Warum benutzt du keine Timeouts?

von pencho (Gast)


Lesenswert?

@Wolfram

Was wären die Vorteile eines Timeouts gegenüber einer Timer? Ich möchte
einen kontinuirlichen Datenstrom aus einem virtuellen Seriellenport
lesen und habe mir das ganze genauso vorgestellt - z.B alle 300-400 ms
die daten aus dem Puffer auszulesen. Könnte ich das mit Timeouts machen
und wenn ja wie? Wenn du irgendwelche Informationsquellen hast, dann her
damit!
Danke!

von Wolfram (Gast)


Lesenswert?

Die Frage ist was du machen willst,
also Master Slave Kommunikation oder kontinuierliches einlesen eines
Streams den das Meßgerät selbstständig sendet.
Im 1. Fall würde ich mit Timeout arbeiten (Master sendet und der Slave
muss in einer bestimmten Zeit geantwortet haben.Wenn nicht gibt es
einen Timeout Fehler und du musst entscheiden wie du damit umgehst.
Im 2. Fall würde ich einen Thread verwenden der ständig die
Schnittstelle pollt. Sind dort ein oder mehrere Bytes vorhanden werden
diese gelesen. Der Thread muss in der Lage sein den Anfang des Paketes
zu finden, wenn er den Datenstrom aus irgendeinem Grund verliert muss
er eben erneut den Anfang finden. Das Paket muss er dekodieren und die
Informationen weitermelden z.B. per event. Wenn gerade nichts von der
Schnittstelle kommt sollte er sich für eine bestimmte Zeit schlafen
legen. Ob er mit Timeout arbeitet ist letzten Endes deine Entscheidung
je nachdem was einfacher ist.
1. Möglichkeit kein Timeout ReceivedBytesThreshold auf 1
Das heisst jedes Byte wird einzeln abgeholt ,was den Rechner belastet
2. Möglichkeit ReceivedBytesThreshold > 1 (=x)
Wenn es ein kontinuierlicher Datenstrom ist kein Problem ansonsten wird
er eben x Bytes warten bis du informiert wirst und wenn er am Ende des
Paketes ist wird es möglicherweise bis zum Eintreffen des nächsten
Dauern, das musst du einschätzen ob es akzeptabel ist.
3. Möglichkeit mit Timeout
Die Nachteile der 2. Möglichkeit werden aufgehoben ,man muss halt nur
mit diesem Fehler umgehen

von pencho (Gast)


Lesenswert?

Danke für deine Antwort!
Ich habe es jetzt gut verstanden was du mit dem Timeout meinst. Ich
denke für den Anfang wäre für mich die 2. Möglichkeit am einfachsten zu
realisieren. Wobei ich eigentlich asynchron arbeiten werde und keinen
Thread benutzen werde. Den Puffer werde ich entsprechend vergrössern.
Der Datenstrom ist wirklich kontiuirlich - obwohl der Serielle Port mit
115kbaud eingestellt ist, werde ich eigenlich viel mehr information
bekommen. Ich lese einen Bluetooth und die können bis zu 70kbyte/s
schaffen.
Das ist auch einbisschen verwirrend für mich der Port ist nur mit 115
kbaud geoffnet und man kann mit ca 60-70 KB/s Datenstrom rechnen. Diese
Resultate habe ich mit dem Terminal Programm von Tobias geschafft.
Na ja ich werde es ausprobieren und nach einigen Tagen wieder
berichten.

von Wolfram (Gast)


Lesenswert?

Wenn du asyncron arbeiten willst, erhöhe den Schnittstellen Puffer und
rechne von vornherein damit, dass du Zeichen verlierst.
Ich weiss nicht was du gemessen hast
115kbaud sind 115 Kilobit/s
das sind je nach Stopbitanzahl, Datenbitanzahl
ca. 11..12 Kbyte/s.

von pencho (Gast)


Lesenswert?

@Wolfram
Wenn ich z.B 2 Rechner per Bluetooth über dem SPP(serial port profil)
verbinde, dann wird eine viruelle Serielleschnittstelle vom Bluetooth
Trieber angelegt. Wenn ich z.B. mit HTerm eine 3 MB grosse Datei über
diese virtuelle Serielleschnitstelle(z.B COM10)schicke, wobei die
Schnittstelle mit 115 kbaud geöffnet ist dann zeigt das HTerm ca. 60
kbyte/s. Und das entspricht auch ungefähr die Geschwindigkeit vom
Bluetooth.
Ich hoffe jetzt ist einbisschen klarer geworden.

von pencho (Gast)


Lesenswert?

>Wenn du asyncron arbeiten willst, erhöhe den Schnittstellen Puffer und
>rechne von vornherein damit, dass du Zeichen verlierst.
>Ich weiss nicht was du gemessen hast

Da ich aber keine Daten verlieren will werde ich wie du mir
vorgeschlagen hast mit einen Thread arbeiten. Ich habe schon 2 Threads
im Programm und wollte eigentlich noch einen vermeiden. Aber Empfängen
von allen Daten ist wichtiger.

von Wolfram (Gast)


Lesenswert?

ich habe deine Aussage bezüglich geschwindigkeit mal in den HTERM
Thread
gepostet...

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

@pencho:
Ich jabe das gerade noch einmal ausprobiert und bei mir zeigt das
Programm bei SendFile mit 115200baud dauerhaft 11.25k an ('echte'
Serielle sowie virtuelle an USB). Dei Frage wäre, ob der virtuelle Port
die Daten vllt zwischenpuffert und dadurch schneller annimmt als
rausschickt. Sollte sich feststellen lassen, wenn auch noch länger nach
Beendigung des Sendens Daten eintrudeln.

Oder der Treiber ist buggy und hält sich nicht an die Geschwindigkeit,
die eingestellt wurde. Müsste man mal auf der Empfangsseite messen, wie
schnell die Daten ankommen.

Hat sonst noch jemand einen Seriell-Bluetooth-Wandler zur Verfügung und
kann das ganze testen?

von pencho (Gast)


Lesenswert?

Hallo Tobi,

  um das ganze zu testen brauchst du keinen Seriell-Bluetooth-Wandler,
sondern nur 2 PCs mit Bluetoothdongels. Beim Bluetooth gibt es s.g.
Profile, damit verschiedene Verbindungstypen untersützt werden können
wie Headset, PAN, SPP u.s.w.SPP(Serial Port Profil) ist als ersatz für
eine Serielle Verbindung per Kabel von 2 PCs gedacht. Wenn man die
Bluetoothgeräte per SPP verbindet, dann stellt der entsprechende
Bluetoothtreiber einen virutellen Seriellen Port, den man ganznormal
öffnen kann. Ich habe an den beiden PCs HTerm gestartet und die
entsprechenden Ports geöffnet - mit 115kbaud. Und wenn ich die 3MB
grosse Datei geschickt habe war ich von den Geschwindigkeit überascht -
die Datai wurde wirklich so schnell gesendet und ich denke dein Programm
hat die richtige Geschwindigkeit angezeigt. So die 60-70 kbyte/s ist
auch die Geschwindigkeit vom Bluetoot.

Deswegen denke ich nicht das nicht dein Programm einen Bug hat(hätte
auch im anderen Thread gepostet) sondern es ist irgendwas mit dem
Bluetoothtreiber. Ist für mich nur interesant warum das so ist, und ob
noch jemand das bestätigen kann.

von pencho (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich bin es wieder. Hier habe ich ein Screenshot von der ganze
Geschichte. Es ist ganz klar zu sehen, dass der COMPort mit 115kbaud
geoeffnet ist und die uebertragung mit ca 50 kbyte/s stattfindet.
Koennte mir jemand das erklaeren. Was fuer Probleme koennte das
eventuel bei einer implimentierung mit .NET 2.0 haben?

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

Das ist eindeutig. Habe allerdings keine Erklärung dafür. Ich kann mir
nur einen Fehler im Treiber vorstellen. Evtl mal Hersteller anschreiben
und nachfragen?

von pencho (Gast)


Lesenswert?

Es kann nicht sein dass alle Bluetoothhersteller Fehler in ihren
Treivern haben. Das gleiche gilt auch für andere Bluetoothdongels. Und
wie gesagt die Geschwindigkeit entspricht genau die vom Bluetooth. Ich
werde ein Thema im andern Formu posten, dort werden vielleicht mehrere
Leute antworten.

von Günther (Gast)


Lesenswert?

Ich habe das gleiche Problem wie schon vorher jemand hier in dem Thread
hatte. Ich verwende die rs232 Komponente des .NET 2.0 in SharpDevelop
2.
Senden und empfangen functioniert wunderbar, ich kann allerdings die
empfangen Daten nicht in meiner Form weiterverwenden, ich bekomme immer
den Fehler "Cross-thread operation not valid: Control 'lblStatus'
accessed from a thread other than the thread it was created on...."

Diesen Code habe ich exact so ausprobiert, funktioniert auch nicht:

> Achso, hier noch n kleiner Codeschnipselt für Eltmans...
>        private void SerPort_DataReceived(object sender,
> SerialDataReceivedEventArgs e)
>         {
>                 try
>                 {
>                     SetReply();
>                 }
>                 catch (Exception ex)
>                 {
>                     System.Console.WriteLine(ex.ToString());
>                 }
>         }
>
> private void SetReply()
> {
>     // Vorsicht vor enventuell nicht abbildbaren characters wie STX,
> etc.
>     textbox1.text = SerPort.ReadExisting();
> }

hat jemand noch eine Idee? Ich könnte natürlich den Umweg über eine
globale Variable gehen, allerdings würde ich gerne ereignisgesteurt
reagieren und nicht über einen Timer ständig die Variable prüfen.
Irgendwie muss es doch möglich sein...

von Slowflyer (Gast)


Lesenswert?

@Günther

Ich denke (bin mir aber nicht mehr sicher) das gleiche Problem hatte
ich auch mal. Ich habe es folgendermaßen gelöst:

void serialPort1DataReceived(object sender, System.EventArgs e)
{
  byte[] buffer = new byte[this.serialPort1.BytesToRead];
  this.serialPort1.Read(buffer, 0, this.serialPort1.BytesToRead);
  for (int i = 0; i<buffer.Length;i++)
  {
    tempstring += (" 0x"+buffer[i].ToString("x2")); // in
hexdarstellung konvertieren
  }
}

Wichtig: tempstring ist eine globale Variable, die auch aus anderen
Threads zugänglich ist, das ist bei deiner textbox1 nicht der Fall
deshalb die Fehlermeldung.

Gruß, Slowflyer

von Slowflyer (Gast)


Lesenswert?

Oh, wer lesen kann ist klar im Vorteil!

Natürlich hast meinen vorhin vorgeschlagenen Weg eingeschlagen.

Ich denke man muss einfach die textbox1 als protected oder public
deklarieren. Wenn in C# nichts vor der Variablendeklaration steht, wird
sie als private deklariert (default). Vielleicht kann man das Problem so
umgehen.

Gruß, Slowlfyer

von Günther (Gast)


Lesenswert?

Danke für die schnelle Antwort Slowflyer!
Leider hat es mit protected oder public nicht funktioniert. Hat
überhaupt keinen Einfluss auf den Fehler.

Eine Idee wäre noch, irgendwie vom rs232DataRecieved Thread aus ein
Ereignis im Form Thread auszulösen und dem Ereignis dann die globale
Variable auslesen. Mit Threadprogrammierung kenn ich mich aber nicht so
aus, keine Ahnung ob oder wie das gehen könnte.

Naja, wenn alles nichts hilft nehm ich halt nen Timer mit 100ms, so
zeitkritisch ist es auch wieder nicht.

von Slowflyer (Gast)


Lesenswert?

Ich denke ich habe eine Lösung gefunden, die bei mir funktioniert. Sieh
dir das mal an:

http://www.neowin.net/forum/lofiversion/index.php/t319506.html

Gruß, Slowflyer

von Tobias Ostwald (Gast)


Lesenswert?

hi,

ich habe ein kleines problem:

ich arbeite momentan mit einer Hardware, die mit folgenden Daten 
arbeitet:

Baud: 19200
1 Startbit
8 Datenbits
1 Stoppbit
kein Handshake


habe das alles soweit in die Komponente von .NET 2.0 eingegeben und 
probiert. Nebenbei habe ich Portmon laufen um die daten mitzuloggen. 
Sobald ich aber einen Befehl sende kommt keine Antwort des Geraetes.
Wenn ich das Ganze einfach mit dem Hyperterminal probiere kommt nach 
jedem Buchstabe oder Zeichen eine Antwort des Geraetes. Woran koennte 
das liegen? Habe alle Einstellungen richtig...

von Billy _. (slowflyer)


Lesenswert?

Meine Kristallkugel ist gestern runtergefallen und ist kaputt ;)

Scherz bei Seite, was zeichnet Portmon bei deiner Software und beim 
Hyperterminal auf? Kannst du mal deinen Quelltext posten? So kann man 
nur raten.

Gruß, Willi

von Tobias Ostwald (Gast)


Lesenswert?

Portmon zeigt mir nur, dass ich etwas gesendet habe (in meinem Fall 
einfach nur mal ein "hallo", ist ja egal, weil das ja schon eine Antwort 
vom Geraet erfordern muesste)

das kommt bei meinem prog raus

[quote]
173  0.00164239  daempfungsregul  IOCTL_SERIAL_WAIT_ON_MASK  Serial0 
SUCCESS
174  0.00003324  daempfungsregul  IRP_MJ_WRITE  Serial0  SUCCESS  Length 
5: hallo
175  0.00000726  daempfungsregul  IOCTL_SERIAL_WAIT_ON_MASK  Serial0 
SUCCESS
176  0.00366555  daempfungsregul  IOCTL_SERIAL_WAIT_ON_MASK  Serial0 
SUCCESS
[\quote]

und das beim Hyperterminal

[quote]
227  0.00002291  hypertrm.exe  IRP_MJ_WRITE  Serial0  SUCCESS  Length 1: 
t
228  0.00000000  hypertrm.exe  IRP_MJ_READ  Serial0    Length 80
[\quote]

es erfolgt also ein read

naja was soll ich dir an quelltext geben?
ich hab ja nur die Zeile
serialPort1.write("hallo");

von Tobias Ostwald (Gast)


Lesenswert?

Danke hat sich erledigt... ich will ja eigentlich nicht unbedingt etwas 
empfangen... habe jetzt ein Display, welches mir zeigt, dass die 
Einstellung vorgenommen wurde :)

also lauft alles wie gewollt

von Schaf (Gast)


Lesenswert?

Grosses DANKE!
super code, sieht mann selten.

von XXXLKlintonLobby (Gast)


Lesenswert?

H. Klinton vs Obama. How you consider, who will win elections?

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.